JFX场景中的JFXPanel JFrame中导致FXComboBox不会“打开”

时间:2015-01-18 17:11:13

标签: java swing javafx

我正在研究用Java编写的用JavaFX设计的应用程序。

除了FXComboBoxes的这一个问题外,一切正常。

正如标题所说,场景位于使用JFXPanel的JFrame中。我有按钮,组合框和标签。

一切都在这个设置中工作,甚至可以打开ComboBox。

但是,只要我点击一个按钮,使用SwingNode将JPanel添加到选项卡,就无法再打开组合框。

为了更容易解释我的问题,我制作了一个简单的Java应用程序来演示它。

我正在使用Java 1.8u40的Windows 8.1 64位计算机。

任何帮助,tipp或解决方案表示赞赏。我希望有人可以帮助我。

application screenshot

测试

  1. 尝试打开Collection
  2. 按“添加面板”按钮
  3. 再次尝试打开Collection
  4. 我的示例FXML文件如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <?import javafx.geometry.*?>
    <?import javafx.scene.control.*?>
    <?import java.lang.*?>
    <?import javafx.scene.layout.*?>
    <?import javafx.collections.*?>
    <?import javafx.scene.layout.GridPane?>
    
    <Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="238.0" prefWidth="404.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="question.GUIController">
       <children>
          <Button layoutX="14.0" layoutY="75.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="150.0" text="Add Panel" fx:id="button_add" />
          <ComboBox layoutX="14.0" layoutY="19.0" prefWidth="150.0" promptText="Choose">
            <items>
                <FXCollections fx:factory="observableArrayList">
                   <String fx:value="Option 1" />
                   <String fx:value="Option 2" />
                </FXCollections>
             </items>
          </ComboBox>
          <TabPane layoutX="190.0" layoutY="19.0" prefHeight="200.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE">
            <tabs>
              <Tab text="Panel" fx:id="tab_panel" />
            </tabs>
          </TabPane>
       </children>
    </Pane>
    

    我的初学者课程:

    package question;
    
    import java.io.IOException;
    import java.net.URL;
    
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
    
    import javafx.application.Platform;
    import javafx.embed.swing.JFXPanel;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Scene;
    import javafx.scene.layout.Region;
    
    public class Starter {
        private static URL fxmlPath = Starter.class.getResource("/question/main.fxml");
        private static JFXPanel fxPanel = new JFXPanel();
        private static JFrame frame = new JFrame();
    
        private static void initAndShowGUI() {
            frame.setContentPane(fxPanel);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    initFX(fxPanel);
                }
           });
        }
    
        protected static void initFX(JFXPanel fxPanel2) {
            Region region = null;
    
            try {
                region = FXMLLoader.load(fxmlPath);
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            if (region != null) {
                Scene scene = new Scene(region);
                fxPanel.setScene(scene);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
    
            } else {
                System.out.println("Couldn't find or load fxml!");
            }
    
        }
    
        public static void main(String[] args) {
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    initAndShowGUI();
                }
            });
        }
    }
    

    我的GUIController课程:

    package question;
    
    import java.awt.Color;
    
    import javax.swing.JPanel;
    
    import javafx.application.Platform;
    import javafx.embed.swing.SwingNode;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.fxml.FXML;
    import javafx.scene.control.Button;
    import javafx.scene.control.Tab;
    
    public class GUIController {
    
        @FXML private Button button_add;
        @FXML private Tab tab_panel;
    
        private AddListener addListener = new AddListener();
    
        @FXML
        private void initialize() {
            button_add.setOnAction(addListener);
        }
    
        private class AddListener implements EventHandler<ActionEvent> {
            @Override
            public void handle(ActionEvent ae) {
                JPanel tempPanel = new JPanel();
                tempPanel.setBackground(Color.red);
    
                final SwingNode graphSwingNode = new SwingNode();
                graphSwingNode.setContent(tempPanel);
    
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        tab_panel.setContent(graphSwingNode);
                    }
               });
            }
        }
    }
    

    编辑: 18.1.2015 21:06:现在使用线程

0 个答案:

没有答案