【问题标题】:How to use Flow Layout inside a Panel in Java?如何在 Java 面板中使用 Flow Layout?
【发布时间】:2023-02-21 19:48:14
【问题描述】:

这是有问题的代码:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;

public class xtemp {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(1067, 600);
        frame.getContentPane().setBackground(new Color(0x000000));
        frame.setLayout(null);

        JPanel panel_red = new JPanel();
        panel_red.setBackground(Color.red);
        panel_red.setBounds(10, 10, 300, 300);

        JPanel panel_blue = new JPanel();
        panel_blue.setBackground(Color.blue);
        panel_blue.setBounds(10, 310, 300, 300);

        JPanel panel_green = new JPanel();
        panel_green.setBackground(Color.green);
        panel_green.setPreferredSize(new Dimension(250, 250));
        panel_green.setBounds(310, 10, 800, 600);
        panel_green.setLayout(new FlowLayout(FlowLayout.TRAILING, 9, 16));

        for (int i = 0; i <= 99; i++)
            panel_green.add(new JButton(String.format("%02d", i)));

        frame.add(panel_red);
        frame.add(panel_green);
        frame.add(panel_blue);
        frame.setVisible(true);
    }
}

这是代码的输出:

我想要类似这样的输出:

我想使用多个面板并为框架内的不同面板提供不同的布局。我基本上希望 panel_green 内的任何按钮都必须根据可用空间自动进行调整,而不管它是一个面板,而不是第二个 gif/图像中显示的框架。

【问题讨论】:

  • 您仍在使用空布局。为什么?

标签: java swing user-interface panel flowlayout


【解决方案1】:

不要使用 null 布局。使用 Swing 布局管理器。

我能够创建以下 GUI:

当我最大化 GUI 时:

Oracle 有一个有用的教程,Creating a GUI With Swing。跳过使用 NetBeans IDE 学习 Swing 部分。请特别注意 Laying Out Components Within a Container 部分。

所有 Swing 应用程序必须以调用 SwingUtilities invokeLater 方法开始。该方法确保Swing 组件在Event Dispatch Thread 上创建和执行。

我创建了一个JFrame,默认为BorderLayout

我创建了一个西边的JPanel来容纳红色的JPanel和蓝色的JPanel。你没有说你想要红色和蓝色JPanel最大化时发生什么,所以我使用了BoxLayout。这样,JPanels 的高度就会相等。

我创建了一个绿色的JPanel,并将FlowLayout 用于JButtons

最后,我使用方法将 JFrame 的创建与 JPanels 的创建分开。这样,代码对其他人来说更容易阅读,我可以分离我的关注点,并且我可以一次专注于 GUI 的一小部分。

这是完整的、可运行的代码。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class BorderLayoutExample implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new BorderLayoutExample());
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("Border Layout Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(createWestPanel(), BorderLayout.WEST);
        frame.add(createGreenPanel(), BorderLayout.CENTER);

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JPanel createGreenPanel() {
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEADING, 5, 5));
        panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        panel.setBackground(Color.green);
        panel.setPreferredSize(new Dimension(800, 600));

        for (int i = 0; i <= 99; i++) {
            panel.add(new JButton(String.format("%02d", i)));
        }

        return panel;
    }

    private JPanel createWestPanel() {
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.add(createColoredPanel(Color.red));
        panel.add(createColoredPanel(Color.blue));

        return panel;
    }

    private JPanel createColoredPanel(Color color) {
        JPanel panel = new JPanel();
        panel.setBackground(color);
        panel.setPreferredSize(new Dimension(300, 300));

        return panel;
    }

}

【讨论】:

    猜你喜欢
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多