我用javaFx编写了一个应用程序,并希望将一个JButton添加到SwingNode的窗格中 这是我的fxml控制器
public class Controller implements Initializable {
@FXML
private Pane pane;
private static final SwingNode swingNode = new SwingNode();
@Override
public void initialize(URL location, ResourceBundle resources) {
createSwingContent(swingNode);
pane.getChildren().add(swingNode);
}
@FXML
private void handleButtonAction(ActionEvent event) {
}
private void createSwingContent(final SwingNode swingNode) {
SwingUtilities.invokeLater(() -> {
JButton jButton = new JButton("Click me!");
jButton.setBounds(0,0,80,50);
JPanel panel = new JPanel();
panel.setLayout(null);
panel.add(jButton);
swingNode.setContent(panel);
});
}
}
但它不起作用,那么它的错误是什么呢? 顺便说一句,当我向我的Pane添加一个非swingNode时,它工作并显示Button但是 以swingNode的方式,它不起作用!
答案 0 :(得分:2)
由于您手动管理所有布局"通过调用按钮上的setLayout(null)
和setBounds(...);
,您还需要手动调整面板大小:
private void createSwingContent(final SwingNode swingNode) {
SwingUtilities.invokeLater(() -> {
JButton jButton = new JButton("Click me!");
jButton.setBounds(0,0,80,50);
JPanel panel = new JPanel();
panel.setLayout(null);
panel.add(jButton);
panel.setSize(90, 60);
swingNode.setContent(panel);
});
}
或者,使用布局管理器(例如,只显示默认布局管理器):
private void createSwingContent(final SwingNode swingNode) {
SwingUtilities.invokeLater(() -> {
JButton jButton = new JButton("Click me!");
// jButton.setBounds(0,0,80,50);
jButton.setPreferredSize(new Dimension(80, 50));
JPanel panel = new JPanel();
// panel.setLayout(null);
panel.add(jButton);
swingNode.setContent(panel);
});
}
使用您当前的代码,该按钮会添加到JPanel
,但由于JPanel
的宽度和高度均为零,SwingNode
也是如此,因此您可以“{1}}。看到按钮。
顺便说一句,让swingNode
静态是错误的。如果要在应用程序中多次加载FXML,则场景图中的两个不同位置将具有相同的节点,这是不允许的。