我创建了一个自定义组件PlayerEditableRow,并将其放置在一个锚定窗格PlayersTable中,该窗格位于选项卡PlayersTab中,但我的可编辑行组件不是交互式的。例如,我有一个按钮和组合框,当我点击它们时没有响应。 PlayersTable也不响应鼠标点击监听器。但是,当我将可编辑行放在PlayersTab锚点窗格中时,自定义组件可以正常工作。这是我的GUI设置:
标签控制器:
public class PlayersTab extends Tab implements IObserver {
@FXML private AnchorPane content;
@FXML private PlayersTable playerTable;
private void initView() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("players_tab.fxml"));
fxmlLoader.setRoot(content);
fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (Exception e) {
e.printStackTrace();
}
this.setText("Players");
this.setContent(content);
playerTable.initializeController(gameSettings);
}
fxml文件:
<?import dominion.application.controller.PlayersTable?>
<fx:root type="javafx.scene.layout.AnchorPane" fx:id="content" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2">
<children>
<HBox prefHeight="100.0" prefWidth="200.0" spacing="10.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<children>
<VBox fx:id="playersVBox" prefHeight="-1.0" prefWidth="-1.0" spacing="10.0" HBox.hgrow="SOMETIMES">
<children>
<Label text="Players" >
<font>
<Font size="18.0" />
</font>
<VBox.margin>
<Insets />
</VBox.margin>
</Label>
<PlayersTable fx:id="playerTable" />
</children>
</VBox>
</children>
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
</HBox>
</children>
</fx:root>
自定义组件:
public class PlayersTable extends AnchorPane implements IObserver {
@FXML private VBox playerTable;
private void initView() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("players_table.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (Exception e) {
e.printStackTrace();
}
playerTable.getChildren().add(new PlayerEditableRow(PlayerType.COMPUTER, gameSettings));
}
fxml文件:
<fx:root type="javafx.scene.layout.AnchorPane" id="AnchorPane" blendMode="DARKEN" maxHeight="-1.0" maxWidth="-1.0" minHeight="-1.0" minWidth="-1.0" mouseTransparent="true" prefHeight="-1.0" prefWidth="-1.0" style="" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2">
<children>
<VBox fx:id="playerTable" minHeight="-1.0" minWidth="-1.0" prefHeight="-1.0" prefWidth="-1.0" style="" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
</children>
</fx:root>
要使我的自定义组件具有交互性,我需要做些什么?在我使用自定义选项卡窗格和彼此嵌套的自定义锚定窗格之前,我还没有遇到过这个问题。
以下是我的非活动组件的图片:
答案 0 :(得分:1)
我想将其作为评论发布,但Stackoverflow说我必须做很少的声明;)所以我创建了一个答案,也许它可以帮助......
为什么不在fxml中添加您的Playertables儿童和Playerstab内容和文字?我的意思是它可能无法解决问题,但会更好。我使用扩展javafx核心组件的自定义组件来实现这一点。
为什么不使用javafx.fxml.FXMLLoader#setControllerFactory
?它应该使您的代码更清晰,更少耦合。