java - 想不出一个简单的 4 框 JPanel 布局

标签 java swing layout-manager gridbaglayout

几个小时以来,我一直在尝试让 JPanel 在 Java 中包含此配置中的这 4 个其他面板(见图)

  • 蓝色方框的大小永远不会改变。
  • 白框不应改变高度,但可以变宽。
  • 深灰色框不应改变宽度,但可以变高。
  • 浅灰色框可以变高或变宽。

对我来说似乎很简单,前几天我在 C# 中完成了它,这是一件轻而易举的事。设置位置、宽度、高度,以及某个边是否锚定,搞定了,我开始喜欢 Java 而不是 C,直到我遇到这个。

我尝试了无数种 GridBagLayout 组合,多个嵌套的 BoxLayout 实例。它们似乎都在做非常奇怪的事情,比如让每个面板都变成一个 4 x 4 的小正方形,或者它们周围有疯狂的填充,或者那些需要随窗口调整大小的面板,不要。

是否有某种神奇的组合可以实现这一点? null 布局是否执行锚定或百分比尺寸。

我得到的最接近的是带有 GridBagLayout 的底部图像,它在加载时看起来不错,但在您调整窗口大小时会那样。

enter image description here

enter image description here

这是获取上述图像的代码

class MainPanel extends JPanel {
public MainPanel(){
    this.setBackground(new Color(216,216,216));
    this.setLayout(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();

    JPanel topTitle = new JPanel();
    topTitle.setPreferredSize(new Dimension(140, 40));
    topTitle.setMinimumSize(new Dimension(140, 40));
    topTitle.setBackground(new Color(174, 216, 249));
    c.weightx = 0.5;
    c.gridx = 0;
    c.gridy = 0;
    this.add(topTitle,c);

    JPanel mainHeader = new JPanel();
    mainHeader.setPreferredSize(new Dimension(1060, 40));
    mainHeader.setMinimumSize(new Dimension(1060, 40));
    mainHeader.setBackground(Color.WHITE);
    c.gridx = 1;
    c.gridy = 0;
    this.add(mainHeader,c);

    JPanel sideNav = new JPanel();
    sideNav.setPreferredSize(new Dimension(140, 760));
    sideNav.setMinimumSize(new Dimension(140, 760));
    sideNav.setBackground(new Color(110,110,110));
    c.gridx = 0;
    c.gridy = 1;
    this.add(sideNav,c);

    JPanel dataPanel = new JPanel();
    dataPanel.setPreferredSize(new Dimension(1060, 760));
    dataPanel.setMinimumSize(new Dimension(1060, 760));
    dataPanel.setBackground(new Color(216,216,216));
    c.gridx = 1;
    c.gridy = 1;
    this.add(dataPanel,c);
}

最佳答案

最小尺寸的 GUI

GUI at minimum size

GUI 拉伸(stretch)得更宽和更高

GUI stretched wider & taller

这一切都是为了获得适当的调整大小权重和填充值..

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class FourPanelLayout {

    private JComponent ui = null;

    FourPanelLayout() {
        initUI();
    }

    public void initUI() {
        if (ui!=null) return;

        ui = new JPanel(new GridBagLayout());
        // It appears you don't want space around the panels.
        // If not, commment out or remove this line.
        ui.setBorder(new EmptyBorder(4,4,4,4));
        
        // create the panels, each with a transparent image to suggest a size
        JPanel bluePanel = new JPanel();
        bluePanel.setBackground(Color.CYAN);
        bluePanel.add(new JLabel(new ImageIcon(getTransparentImage(40, 20))));
        
        JPanel darkGrayPanel = new JPanel();
        darkGrayPanel.setBackground(Color.DARK_GRAY);
        darkGrayPanel.add(new JLabel(new ImageIcon(getTransparentImage(40, 20))));
        
        JPanel whitePanel = new JPanel();
        whitePanel.setBackground(Color.WHITE);
        whitePanel.add(new JLabel(new ImageIcon(getTransparentImage(40, 20))));

        JPanel grayPanel = new JPanel();
        grayPanel.setBackground(Color.GRAY);
        grayPanel.add(new JLabel(new ImageIcon(getTransparentImage(360, 80))));
        
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.weightx = 0.0f;
        gbc.weighty = 0.0f;
        gbc.gridx = 0;
        gbc.gridy = 0;
        
        ui.add(bluePanel, gbc);
        
        gbc.weightx = .5f;
        gbc.gridx = 1;
        ui.add(whitePanel, gbc);
        
        gbc.weighty = .5f;
        gbc.gridy = 1;
        ui.add(grayPanel, gbc);

        gbc.weightx = 0f;
        gbc.gridx = 0;
        //gbc.gridy
        ui.add(darkGrayPanel, gbc);
    }
    
    /* We use transparent images to give panels a natural size. */
    private Image getTransparentImage(int w, int h) {
        return new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                FourPanelLayout o = new FourPanelLayout();

                JFrame f = new JFrame(o.getClass().getSimpleName());
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();
                f.setMinimumSize(f.getSize());

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

关于java - 想不出一个简单的 4 框 JPanel 布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39240877/

相关文章:

Java Swing 文件选择器错误

用于构建 GUI 面板的 Java 函数

java - 在java swing中调整窗口大小时如何使按钮粘在一个地方?

java - 在 JeditorPane 中查找文本结尾的 X 和 Y 坐标

python - 结合 Tkinter (Python) 和 Swing (Jython)

Java GroupLayout 异常

java - 如何传递数组字符串数据作为参数?

java - 使用流的列表的最小非空 LocalDateTime

Java 二维数组打印问题

java - 尝试使用 OSHI 中的 get() 方法时抛出 NoClassDefFoundError