0

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

        });
    }
}

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

4

1 回答 1

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所以您看不到按钮。

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

于 2016-08-01T12:20:41.883 回答