【问题标题】:JSwing simple button/JFXPanel layoutJSwing 简单按钮/JFXPanel 布局
【发布时间】:2023-03-06 20:25:02
【问题描述】:

谁能告诉我用Java实现下图中布局的最简单方法?

JFXPanel 应该占据所有屏幕空间,除了在调整窗口大小时应该保持相同大小的按钮。

更一般地说,Java 中是否有任何 LayoutManager 可以让我以一种简单的方式将组件堆叠在一起?

我尝试过的所有方法都使按钮太大。我不知道,也许 JFXPanel 会影响尺寸。

谢谢你,这让我发疯了。

【问题讨论】:

    标签: java swing layout javafx


    【解决方案1】:
    • 使用嵌套的 JPanel,这是关键,每个 JPanel 都使用自己的布局。
    • 整个事物的边框布局,在主 JPanel 中。
    • 一个 FlowLayout JPanel 用于保存 JButton,并将该 JPanel 放在主 JPanel BorderLayout.PAGE_START
    • 将 JFXPanel 放在主 JPanel BorderLayout.CENTER 中
    • 请阅读布局管理器教程,因为所有内容都在此处进行了解释和展示。

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import javafx.application.Platform;
    import javafx.embed.swing.JFXPanel;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.layout.StackPane;
    import javafx.scene.paint.Color;
    import javax.swing.JApplet;
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
    import javax.swing.UIManager;
    
    public class JavaFXSwingApplication1 extends JApplet {
    
        private static final int JFXPANEL_WIDTH_INT = 300;
        private static final int JFXPANEL_HEIGHT_INT = 250;
        private static JFXPanel fxContainer;
        private static JFXPanel fxContainerTwo;
        private static final long serialVersionUID = 1L;
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
                    } catch (Exception e) {
                    }
                    JFrame frame = new JFrame("JavaFX embeded in Swing");
                    frame.setLayout(new BorderLayout(5, 5));
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    JApplet applet = new JavaFXSwingApplication1();
                    applet.init();
                    frame.setContentPane(applet.getContentPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                    applet.start();
                }
            });
        }
    
        @Override
        public void init() {
            fxContainer = new JFXPanel();
            fxContainer.setPreferredSize(new Dimension(JFXPANEL_WIDTH_INT / 5, JFXPANEL_HEIGHT_INT / 5));
            add(fxContainer, BorderLayout.NORTH);
            fxContainerTwo = new JFXPanel();
            fxContainerTwo.setPreferredSize(new Dimension(JFXPANEL_WIDTH_INT, JFXPANEL_HEIGHT_INT));
            add(fxContainerTwo, BorderLayout.CENTER);
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    createScene();
                    createScene2();
                }
            });
        }
    
        private void createScene() {
            Button btn = new Button();
            btn.setText("Say 'Hello World'");
            btn.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    System.out.println("Hello World!");
                }
            });
            StackPane root = new StackPane();
            root.getChildren().add(btn);
            Scene scene = new Scene(root, Color.BLUEVIOLET);
            fxContainer.setScene(scene);
        }
    
        private void createScene2() {
            Button btn = new Button();
            btn.setText("Say 'Hello World' Two");
            btn.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    System.out.println("Hello World!");
                }
            });
            StackPane root = new StackPane();
            root.getChildren().add(btn);
            Scene scene = new Scene(root, Color.ALICEBLUE);
            fxContainerTwo.setScene(scene);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-23
      • 2019-03-12
      • 2014-08-14
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多