将swingNode添加到javaFx

时间:2016-08-01 05:28:56

标签: java javafx swingutilities

我用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的方式,它不起作用!

1 个答案:

答案 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,则场景图中的两个不同位置将具有相同的节点,这是不允许的。