java - 可调整大小的 Swing 布局,其中按钮根据可变尺寸排列

标签 java swing layout-manager

我想使用 Java Swing 进行布局,如下图所示。

layout sketch
(来源:braun-abstatt.de)

左边是一个JPanel,是通过paintComponent()绘制的当调整窗口大小时图形会自动缩放。 (问题不是关于那个面板的。那个已经完成了。)

现在我需要在前面提到的 JPanel 右侧添加一些按钮(黑框,在 Photoshop 中添加用于绘图)。顶部和底部的红色区域的高度(旁边应该只有空白区域)是沿着 CONSTANT_FACTOR * getHeight() 的线计算的。 。左侧每个隔间旁边应该有一组按钮,排列在相应隔间的中心(参见蓝线)。

包含按钮的 JPanel 了解 CONSTANT_FACTOR 和隔间的数量,因此应该可以将此信息提供给布局管理器。

我最适合使用哪个布局管理器来实现此布局?我读过所有不同的布局管理器,但我不太清楚哪一个或哪一个组合最适合这种情况。

最佳答案

例如,通过使用不同的 LayoutManager ,一个非常简单的容器,需要不超过 15-20 分钟:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class ThinLineFrame {
    private JFrame frame = new JFrame();
    private JScrollPane scrollPane;
    private JPanel panel = new JPanel();
    private JPanel panelNorth = new JPanel();
    private JPanel panelCenter = new JPanel();
    private JPanel panelCenterCh1 = new JPanel();
    private JPanel panelCenterCh2 = new JPanel();
    private JPanel panelCenterCh3 = new JPanel();
    private JPanel panelCenterCh4 = new JPanel();
    private JPanel panelCenterCh5 = new JPanel();
    private JPanel panelSouth = new JPanel();

    public ThinLineFrame() {
        panelNorth.setBackground(Color.red.darker());
        panelNorth.setPreferredSize(new Dimension(80, 30));
        //
        panelCenter.setBackground(Color.darkGray);
        panelCenter.setLayout(new GridLayout(5, 1, 2, 2));
        //
        panelCenterCh1.setLayout(new BorderLayout());
        JButton panelCenterCh1Button = new JButton();
        panelCenterCh1.add(panelCenterCh1Button, BorderLayout.CENTER);
        //
        JButton panelCenterCh2Button1 = new JButton();
        JButton panelCenterCh2Button2 = new JButton();
        panelCenterCh2.setLayout(new GridLayout(2, 1, 2, 2));
        panelCenterCh2.add(panelCenterCh2Button1);
        panelCenterCh2.add(panelCenterCh2Button2);
        //
        JButton panelCenterCh3Button1 = new JButton();
        JButton panelCenterCh3Button2 = new JButton();
        panelCenterCh3.setLayout(new GridLayout(2, 1, 2, 2));
        panelCenterCh3.add(panelCenterCh3Button1);
        panelCenterCh3.add(panelCenterCh3Button2);
        //
        JButton panelCenterCh4Button1 = new JButton();
        JButton panelCenterCh4Button2 = new JButton();
        panelCenterCh4.setLayout(new GridLayout(2, 1, 2, 2));
        panelCenterCh4.add(panelCenterCh4Button1);
        panelCenterCh4.add(panelCenterCh4Button2);
        //
        panelCenterCh5.setLayout(new BorderLayout());
        JButton panelCenterCh5Button = new JButton();
        panelCenterCh5.add(panelCenterCh5Button, BorderLayout.CENTER);
        //
        panelCenter.add(panelCenterCh1);
        panelCenter.add(panelCenterCh2);
        panelCenter.add(panelCenterCh3);
        panelCenter.add(panelCenterCh4);
        panelCenter.add(panelCenterCh5);
        //
        panelSouth.setBackground(Color.red.darker());
        panelSouth.setPreferredSize(new Dimension(80, 30));
        //
        panel.setLayout(new BorderLayout(2, 2));
        panel.add(panelNorth, BorderLayout.NORTH);
        panel.add(panelCenter, BorderLayout.CENTER);
        panel.add(panelSouth, BorderLayout.SOUTH);
        //
        scrollPane = new JScrollPane(panel);
        frame.add(scrollPane, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(80, 600));
        frame.setLocation(100, 150);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                ThinLineFrame dlg = new ThinLineFrame();
            }
        });
    }
}

关于java - 可调整大小的 Swing 布局,其中按钮根据可变尺寸排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6071902/

相关文章:

java - 将绝对布局合并为标准布局

java - 使用 marathon java 驱动程序的 JNLP 文件应用程序自动化

java - 基于 HttpServletRequest 生成全局(应用程序范围)唯一请求 id 的算法?

java - JTable 单元格 - 处理长文本

java - Swing 线程违规

java - 使用 GridBagLayout 垂直排列 JPanel 的组件

java - 查找网格中与给定矩形相交的单元格

针对 PPGool II 的 Java 查询导致 "unnamed prepared statement does not exist"错误

java - 在java中使用swing定位标签

java - FlowLayout占用垂直空间过多,改变高度