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);

        });
    }
}

しかし、うまくいかないので、何が悪いのですか?ところで、非swingNodeをペインに追加すると、機能してボタンが表示されますが、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ため、も追加され、ボタンが表示されません。JPanelSwingNode

余談ですが、swingNode静的にするのは間違いです。アプリケーションで FXML を複数回ロードすると、シーン グラフ内の 2 つの異なる場所に同じノードが存在することになり、これは許可されません。

于 2016-08-01T12:20:41.883 に答える