如何将JButton嵌入到JavaFX窗格中

时间:2016-02-22 19:56:20

标签: java javafx

我正在尝试使用我的JavaFX控制器类将JButton添加到特定窗格。 有人能告诉我我做错了吗

public class FXMLDocumentController implements Initializable {

    @FXML private Pane pane;

    private void createAndSetSwingContent(final SwingNode swingNode) {
             SwingUtilities.invokeLater(new Runnable() {
                 @Override
                 public void run() {
                     swingNode.setContent(new JButton("Click me!"));
                 }
             });
         }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
        final SwingNode swingNode = new SwingNode();
        createAndSetSwingContent(swingNode);


             pane.getChildren().add(swingNode);
    }    

}

1 个答案:

答案 0 :(得分:1)

Embedding Swing Content in JavaFX Applications上的Oracle文档中,有一个将Swing JButton添加到JavaFX窗格的示例。以下示例只是从那里进行复制和粘贴(稍微更新以使用Java 8功能)。

swinginfx

import javafx.application.Application;
import javafx.embed.swing.SwingNode;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javax.swing.JButton;
import javax.swing.SwingUtilities;

public class SwingFx extends Application {

    @Override
    public void start (Stage stage) {
        final SwingNode swingNode = new SwingNode();

        createSwingContent(swingNode);

        StackPane pane = new StackPane();
        pane.getChildren().add(swingNode);

        stage.setTitle("Swing in JavaFX");
        stage.setScene(new Scene(pane, 250, 150));
        stage.show();
    }

    private void createSwingContent(final SwingNode swingNode) {
        SwingUtilities.invokeLater(() -> swingNode.setContent(new JButton("Click me!")));
    }
}

当然这是一个玩具样本,大多数人只会使用JavaFX按钮。对于处理针对现有Swing库而不是单独按钮编写的大型现有代码库的更复杂示例,上述方法可能有意义,但仍可能存在诸如外观和感觉不一致以及其他复杂性等残留问题。确保不同的UI工具包之间的线程规则未经过验证等。