JSwing简单按钮/ JFXPanel布局

时间:2013-12-21 20:35:32

标签: java swing layout javafx

有人可以告诉我在Java下面的图片中实现布局的最简单方法吗?

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

enter image description here

更一般地说,Java中是否有任何LayoutManager允许我以一种简单的方式将组件叠加到另一个上?

我尝试的所有内容都会使按钮太大。也许JFXPanel与尺寸混淆,我不知道。

谢谢,这让我很生气。

1 个答案:

答案 0 :(得分:3)

  • 使用嵌套的JPanels,这是关键,每个都使用自己的布局。
  • 整个事情的BorderLayout,主要是JPanel。
  • 一个FlowLayout JPanel来保存JButton,并将JPanel放在主JPanel BorderLayout.PAGE_START中
  • 将JFXPanel放在主JPanel BorderLayout.CENTER
  • 阅读布局管理器教程,因为这些都已解释并显示在那里。

enter image description here

enter image description here

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);
    }
}