将 swingNode 添加到 javaFx
Adding swingNode to javaFx
我用 javaFx 写了一个应用程序,想在 SwingNode 中添加一个 JButton 到一个 Pane
这是我的 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 时,它可以工作并显示 Button 但是
在 swingNode 方式下它不起作用!
由于您正在管理所有布局 "by hand",通过在按钮上调用 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
,但是由于 JPanel
的宽度和高度为零,因此 SwingNode
也是如此,所以您可以'看不到按钮。
顺便说一句,将 swingNode
设为静态是错误的。如果您要在应用程序中多次加载 FXML,您将在场景图中的两个不同位置拥有相同的节点,这是不允许的。
我用 javaFx 写了一个应用程序,想在 SwingNode 中添加一个 JButton 到一个 Pane 这是我的 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 时,它可以工作并显示 Button 但是 在 swingNode 方式下它不起作用!
由于您正在管理所有布局 "by hand",通过在按钮上调用 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
,但是由于 JPanel
的宽度和高度为零,因此 SwingNode
也是如此,所以您可以'看不到按钮。
顺便说一句,将 swingNode
设为静态是错误的。如果您要在应用程序中多次加载 FXML,您将在场景图中的两个不同位置拥有相同的节点,这是不允许的。