线程 "JavaFX Application Thread" java.lang.IllegalArgumentException 中的异常:
Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException:
这里是错误
Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: Children: duplicate children added: parent = Group@5ea0c6fc
at javafx.graphics/javafx.scene.Parent.onProposedChange(Unknown Source)
at javafx.base/com.sun.javafx.collections.VetoableListDecorator.add(Unknown Source)
at project1.Crab.setCrab(Crab.java:45)
at project1.SeaAnimals.addCrab(SeaAnimals.java:65)
at project1.ProjectOne.mouseClick(ProjectOne.java:133)
at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at javafx.base/javafx.event.Event.fireEvent(Unknown Source)
at javafx.graphics/javafx.scene.Scene$ClickGenerator.postProcess(Unknown Source)
at javafx.graphics/javafx.scene.Scene$ClickGenerator.access00(Unknown Source)
at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Unknown Source)
at javafx.graphics/javafx.scene.Scene$MouseHandler.access00(Unknown Source)
at javafx.graphics/javafx.scene.Scene.processMouseEvent(Unknown Source)
at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Unknown Source)
at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(Unknown Source)
at javafx.graphics/com.sun.glass.ui.View.notifyMouse(Unknown Source)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
这是有问题的代码行
public class Crab {
private final Image c = new Image("File:crab.gif");
private ArrayList<ImageView> crabList = new ArrayList<ImageView>();
private int _counter;
private Group _crab = new Group();
/** Constructor <br>
* Initializes counter to -1
*/
public Crab() {
_counter = -1;
}
/** Setter <br>
* Adds a crab to the array list
*/
public void addCrab() {
if(_counter < 5) {
crabList.add(new ImageView(c));
_counter++;
}
}
/** Setter <br>
* Deletes a crab from the array list
*/
public void deleteCrab() {
if(_counter > 0) {
crabList.remove(_counter);
_counter--;
}
}
/** Getter <br>
*
* @return returns crab group
*/
public Group setCrab() {
if(_counter >= 0) { //adds the first crab
crabList.get(0).setTranslateX(80);
crabList.get(0).setTranslateY(500);
crabList.get(0).setFitHeight(100);
crabList.get(0).setFitWidth(100);
_crab.getChildren().add(crabList.get(0));
if(_counter >= 1) { //adds the second crab
crabList.get(1).setTranslateX(230);
crabList.get(1).setTranslateY(500);
crabList.get(1).setFitHeight(100);
crabList.get(1).setFitWidth(100);
_crab.getChildren().add(crabList.get(1));
if (_counter >= 2) { // adds the third crab
crabList.get(2).setTranslateX(380);
crabList.get(2).setTranslateY(500);
crabList.get(2).setFitHeight(100);
crabList.get(2).setFitWidth(100);
_crab.getChildren().add(crabList.get(2));
if (_counter >= 3) { //adds the fourth crab
crabList.get(3).setTranslateX(530);
crabList.get(3).setTranslateY(500);
crabList.get(3).setFitHeight(100);
crabList.get(3).setFitWidth(100);
_crab.getChildren().add(crabList.get(3));
if (_counter >= 4) { //adds the fifth crab
crabList.get(4).setTranslateX(680);
crabList.get(4).setTranslateY(500);
crabList.get(4).setFitHeight(100);
crabList.get(4).setFitWidth(100);
_crab.getChildren().add(crabList.get(4));
if (_counter == 5) { //adds the sixth crab
crabList.get(5).setTranslateX(830);
crabList.get(5).setTranslateY(500);
crabList.get(5).setFitHeight(100);
crabList.get(5).setFitWidth(100);
_crab.getChildren().add(crabList.get(5));
}
}
}
}
}
}
return _crab;
}
}
public Group addCrab() {
_crab.addCrab();
_gCrab = _crab.setCrab();
return _gCrab;
}
public Group deleteCrab() {
_crab.deleteCrab();
_gCrab = _crab.setCrab();
return _gCrab;
}
}
public void mouseClick(MouseEvent mouse) {
if(mouse.getClickCount() == 1) {
root.getChildren().remove(gCrab);
gCrab.getChildren().clear();
gCrab.getChildren().add(animals.addCrab());
root.getChildren().add(gCrab);
}
else if(mouse.getClickCount() == 2) {
root.getChildren().remove(gCrab);
gCrab.getChildren().clear();
gCrab.getChildren().add(animals.deleteCrab());
root.getChildren().add(gCrab);
}
}
我不知道如何解决这个问题,也不知道问题出在哪里。任何帮助表示赞赏。
您的 setCrab
方法尝试将所有螃蟹图像添加到 Group
而不删除任何子项。这样,如果在您尝试再次添加螃蟹之前 Group
中有螃蟹,这会导致异常,因为 JavaFX 不允许这样做。
您还需要确保永远不要将同一个节点添加到同一个父节点。
进一步向 Crab
class 的用户隐藏 setCrab
将降低使用 class 的复杂性。为什么让用户调用 2 个方法,而 1 个调用可以完成相同的工作。您甚至可以写一个 CrabGroup
class 本身就是一个节点,并避免将 Group
删除和读取到它的父节点。
例如
public class CrabGroup extends HBox {
private static final Image c = new Image("File:crab.gif");
public CrabGroup() {
setSpacing(50);
}
/**
* Adds a crab
*/
public void addCrab() {
if(getChildren().size() < 6) {
ImageView image = new ImageView(c);
image.setFitWidth(100);
image.setFitHeight(100);
crabList.add(image);
}
}
/**
* Deletes a crab
*/
public void deleteCrab() {
if(!getChildren().isEmpty()) {
getChildren().remove(getChildren().size() - 1);
}
}
}
CrabGroup crabGroup = new CrabGroup();
crabGroup.setTranslateX(80);
crabGroup.setTranslateY(500);
crabGroup.addCrab();
...
crabGroup.deleteCrab();
这里是错误
Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: Children: duplicate children added: parent = Group@5ea0c6fc
at javafx.graphics/javafx.scene.Parent.onProposedChange(Unknown Source)
at javafx.base/com.sun.javafx.collections.VetoableListDecorator.add(Unknown Source)
at project1.Crab.setCrab(Crab.java:45)
at project1.SeaAnimals.addCrab(SeaAnimals.java:65)
at project1.ProjectOne.mouseClick(ProjectOne.java:133)
at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at javafx.base/javafx.event.Event.fireEvent(Unknown Source)
at javafx.graphics/javafx.scene.Scene$ClickGenerator.postProcess(Unknown Source)
at javafx.graphics/javafx.scene.Scene$ClickGenerator.access00(Unknown Source)
at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Unknown Source)
at javafx.graphics/javafx.scene.Scene$MouseHandler.access00(Unknown Source)
at javafx.graphics/javafx.scene.Scene.processMouseEvent(Unknown Source)
at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Unknown Source)
at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(Unknown Source)
at javafx.graphics/com.sun.glass.ui.View.notifyMouse(Unknown Source)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
这是有问题的代码行
public class Crab {
private final Image c = new Image("File:crab.gif");
private ArrayList<ImageView> crabList = new ArrayList<ImageView>();
private int _counter;
private Group _crab = new Group();
/** Constructor <br>
* Initializes counter to -1
*/
public Crab() {
_counter = -1;
}
/** Setter <br>
* Adds a crab to the array list
*/
public void addCrab() {
if(_counter < 5) {
crabList.add(new ImageView(c));
_counter++;
}
}
/** Setter <br>
* Deletes a crab from the array list
*/
public void deleteCrab() {
if(_counter > 0) {
crabList.remove(_counter);
_counter--;
}
}
/** Getter <br>
*
* @return returns crab group
*/
public Group setCrab() {
if(_counter >= 0) { //adds the first crab
crabList.get(0).setTranslateX(80);
crabList.get(0).setTranslateY(500);
crabList.get(0).setFitHeight(100);
crabList.get(0).setFitWidth(100);
_crab.getChildren().add(crabList.get(0));
if(_counter >= 1) { //adds the second crab
crabList.get(1).setTranslateX(230);
crabList.get(1).setTranslateY(500);
crabList.get(1).setFitHeight(100);
crabList.get(1).setFitWidth(100);
_crab.getChildren().add(crabList.get(1));
if (_counter >= 2) { // adds the third crab
crabList.get(2).setTranslateX(380);
crabList.get(2).setTranslateY(500);
crabList.get(2).setFitHeight(100);
crabList.get(2).setFitWidth(100);
_crab.getChildren().add(crabList.get(2));
if (_counter >= 3) { //adds the fourth crab
crabList.get(3).setTranslateX(530);
crabList.get(3).setTranslateY(500);
crabList.get(3).setFitHeight(100);
crabList.get(3).setFitWidth(100);
_crab.getChildren().add(crabList.get(3));
if (_counter >= 4) { //adds the fifth crab
crabList.get(4).setTranslateX(680);
crabList.get(4).setTranslateY(500);
crabList.get(4).setFitHeight(100);
crabList.get(4).setFitWidth(100);
_crab.getChildren().add(crabList.get(4));
if (_counter == 5) { //adds the sixth crab
crabList.get(5).setTranslateX(830);
crabList.get(5).setTranslateY(500);
crabList.get(5).setFitHeight(100);
crabList.get(5).setFitWidth(100);
_crab.getChildren().add(crabList.get(5));
}
}
}
}
}
}
return _crab;
}
}
public Group addCrab() {
_crab.addCrab();
_gCrab = _crab.setCrab();
return _gCrab;
}
public Group deleteCrab() {
_crab.deleteCrab();
_gCrab = _crab.setCrab();
return _gCrab;
}
}
public void mouseClick(MouseEvent mouse) {
if(mouse.getClickCount() == 1) {
root.getChildren().remove(gCrab);
gCrab.getChildren().clear();
gCrab.getChildren().add(animals.addCrab());
root.getChildren().add(gCrab);
}
else if(mouse.getClickCount() == 2) {
root.getChildren().remove(gCrab);
gCrab.getChildren().clear();
gCrab.getChildren().add(animals.deleteCrab());
root.getChildren().add(gCrab);
}
}
我不知道如何解决这个问题,也不知道问题出在哪里。任何帮助表示赞赏。
您的 setCrab
方法尝试将所有螃蟹图像添加到 Group
而不删除任何子项。这样,如果在您尝试再次添加螃蟹之前 Group
中有螃蟹,这会导致异常,因为 JavaFX 不允许这样做。
您还需要确保永远不要将同一个节点添加到同一个父节点。
进一步向 Crab
class 的用户隐藏 setCrab
将降低使用 class 的复杂性。为什么让用户调用 2 个方法,而 1 个调用可以完成相同的工作。您甚至可以写一个 CrabGroup
class 本身就是一个节点,并避免将 Group
删除和读取到它的父节点。
例如
public class CrabGroup extends HBox {
private static final Image c = new Image("File:crab.gif");
public CrabGroup() {
setSpacing(50);
}
/**
* Adds a crab
*/
public void addCrab() {
if(getChildren().size() < 6) {
ImageView image = new ImageView(c);
image.setFitWidth(100);
image.setFitHeight(100);
crabList.add(image);
}
}
/**
* Deletes a crab
*/
public void deleteCrab() {
if(!getChildren().isEmpty()) {
getChildren().remove(getChildren().size() - 1);
}
}
}
CrabGroup crabGroup = new CrabGroup();
crabGroup.setTranslateX(80);
crabGroup.setTranslateY(500);
crabGroup.addCrab();
...
crabGroup.deleteCrab();