将 swingNode 添加到 javaFx

Adding swingNode to javaFx

我用 javaFx 写了一个应用程序,想在 SwingNode 中添加一个 JButton 到一个 Pane 这是我的 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);

        });
    }
}

但是它不起作用,所以它有什么问题吗? 顺便说一句,当我在我的窗格中添加一个非 swingNode 时,它​​可以工作并显示 Button 但是 在 swingNode 方式下它不起作用!

由于您正在管理所有布局 "by hand",通过在按钮上调用 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 也是如此,所以您可以'看不到按钮。

顺便说一句,将 swingNode 设为静态是错误的。如果您要在应用程序中多次加载 FXML,您将在场景图中的两个不同位置拥有相同的节点,这是不允许的。