我正在研究用Java编写的用JavaFX设计的应用程序。
除了FXComboBoxes的这一个问题外,一切正常。
正如标题所说,场景位于使用JFXPanel的JFrame中。我有按钮,组合框和标签。
一切都在这个设置中工作,甚至可以打开ComboBox。
但是,只要我点击一个按钮,使用SwingNode将JPanel添加到选项卡,就无法再打开组合框。
为了更容易解释我的问题,我制作了一个简单的Java应用程序来演示它。
我正在使用Java 1.8u40的Windows 8.1 64位计算机。
任何帮助,tipp或解决方案表示赞赏。我希望有人可以帮助我。
测试
我的示例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:现在使用线程