javafx 和swing_Swing和JavaFX:使用JFXPanel
javafx 和swing
我很快將不得不在基于Swing的胖客戶端中處理JavaFX –哦,對不起,我的意思是“多層富客戶端”!
因此,這使我來看看JFXPanel 。 JFXPanel是一個javax.swing.JComponent,用于將JavaFX內容嵌入到Swing-UI中。 JFXPanel的用法類似于JPanel,并且可以通過EDT作為通用Swing組件進行訪問,除了必須通過JavaFX應用程序線程來處理JavaFX組件之外。
為了解決這些問題,我創建了兩個類似的面板(Swing + JavaFX),每個面板都有一個按鈕,一個TextField和一個Label,并將它們放置在JSplitPane和JFrame中:
仔細看里面
要嘗試Swing <-> JavaFX互操作性,按鈕操作是將文本從TextField設置為JLabel,反之亦然。
JPanel處理通用的Swing東西沒有什么特別的,但是JFXPanel包含JavaFX控件:
這里很重要:將場景添加到JavaFX Application線程內的JFXPanel:
Platform.runLater(this::createScene);如果您致電:
createScene()從另一個線程,您會獲得Runtime-Exception:
java.lang.IllegalStateException: Not on FX application thread; currentThread = AWT-EventQueue-0同樣,每次與JavaFX相關內容的交互都必須放在JavaFX Application Thread上:
例如:
Platform.runLater(() -> {swingFXPanel.getTestLabel().setText(swingPanel.getTestTextField().getText()); });public class InteropFrame extends JFrame {private JSplitPane centralSplitPane;private SwingPanel swingPanel;private SwingFXPanel swingFXPanel;public InteropFrame(){init();}private void init() {setTitle("Swing <-> JavaFX Interoperatbiliy");setSize(500, 500);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLayout(new BorderLayout());centralSplitPane = new JSplitPane();centralSplitPane.setDividerLocation(0.5);centralSplitPane.setResizeWeight(0.3);swingPanel = new SwingPanel();swingFXPanel = new SwingFXPanel();swingPanel.getTestButton().addActionListener((ActionEvent e) -> {Platform.runLater(() -> {swingFXPanel.getTestLabel().setText(swingPanel.getTestTextField().getText());});});swingFXPanel.getTestButton().setOnAction((javafx.event.ActionEvent t) -> {swingPanel.getTestLabel().setText(swingFXPanel.getTestTextField().getText());});centralSplitPane.setLeftComponent(swingPanel);centralSplitPane.setRightComponent(swingFXPanel);add(centralSplitPane, BorderLayout.CENTER);} }另外,處理FXML也很簡單:
public class SwingFXMLPanel extends JFXPanel {@FXMLprivate Button testButton;@FXMLprivate TextField testTextField;@FXMLprivate Label testLabel;private VBox rootPane;private URL fxmlResource;public SwingFXMLPanel(URL fxmlResource){this.fxmlResource = fxmlResource;init();}private void init(){rootPane = new VBox();FXMLLoader loader = new FXMLLoader(fxmlResource);loader.setController(this);loader.setRoot(rootPane);try {loader.load();} catch (IOException ex) {Logger.getLogger(SwingFXMLPanel.class.getName()).log(Level.SEVERE, null, ex);}testButton.setText("I am a JavaFX Button");testLabel.setText("empty");Platform.runLater(this::createScene);}private void createScene() {Scene scene = new Scene(rootPane);setScene(scene);}public Button getTestButton() {return testButton;}public TextField getTestTextField() {return testTextField;}public Label getTestLabel() {return testLabel;}}對我來說,讓我的同事盡可能多地接受在Swing中使用JavaFX至關重要。
因此,我想簡化特定的FX應用程序線程處理。 因此,如果使用JPanel的主要區別只是添加以下內容,那么也許可以實現:
private void createScene() {Scene scene = new Scene(rootPane);setScene(scene);}并致電:
Platform.runLater(this::createScene);在JFXPanel中 。
- 您可以在此處找到完整的示例代碼。
翻譯自: https://www.javacodegeeks.com/2014/11/swing-and-javafx-working-with-jfxpanel.html
javafx 和swing
總結
以上是生活随笔為你收集整理的javafx 和swing_Swing和JavaFX:使用JFXPanel的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 江淮钇为 3 冠军版汽车上市:续航 50
- 下一篇: 剧集综艺爆款不断 王晓晖揭秘爱奇艺创作方