【问题标题】:Can not figure out a simple 4 box JPanel layout想不出一个简单的 4 框 JPanel 布局
【发布时间】:2017-01-07 12:41:21
【问题描述】:

我已经尝试了几个小时在 Java 中获取 JPanel 以在此配置中包含这 4 个其他面板(见图)

  • 蓝色框不应改变大小。
  • 白盒子永远不应该改变高度,但可以变宽。
  • 深灰色框不应该改变宽度,但可以变得更高。
  • 浅灰色框可以变高或变宽。

对我来说似乎很简单,前几天我在 C# 中完成了它,并且轻而易举。设置位置,宽度,高度,以及是否锚定某侧,繁荣完成,我开始喜欢java而不是C,直到我遇到这个。

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

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

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

这是获取上述图片的代码

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

}

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖minimal reproducible exampleShort, Self Contained, Correct Example
  • 并且不要考虑使用空布局...如果这样做你会后悔的。同样正如@AndrewThompson 在您尝试解决它时至少发布您的一个代码所提到的那样,这样我们就可以更容易地说出您的代码有什么问题
  • “不要考虑使用空布局...” 在编辑帖子之前,我没有注意到提到 null 布局。不能再同意了。
  • 谢谢,已添加代码
  • 代码上有两点:1) 那是不是 MCVE / SSCCE。它们必须包含导入和 main(String[]) 方法来启动它并显示示例!我在回答中包含了一个 MCVE。 2) 请参阅Detection/fix for the hanging close bracket of a code block 了解我无法再费心解决的问题。

标签: java swing layout-manager gridbaglayout


【解决方案1】:

最小尺寸的 GUI

GUI 被拉得更宽更高

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

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

【讨论】:

  • 我知道一定有办法!在我的身上,我刚刚改变了必须改变权重,它似乎正在工作。我也没有意识到(尽管很明显)如果我没有重置它们,或者像你一样专门订购它们,那么这些约束也适用于它下面的所有约束,所以我的原件。代码也有这个问题。
  • Andrew 很抱歉,但是,您的意思是 我们使用透明图像为面板提供自然尺寸 使用透明图像与仅填充面板相比有什么优势背景?
  • @Frakcool GUI 的设计方式,没有图像来“填充”面板,它们的大小都是 0 x 0 像素。 ;)
  • @AndrewThompson 我明白了,我正在打电话,所以我之前无法测试它,我现在明白你的意思了,谢谢你的澄清:)
  • @Frakcool 没问题。我记得之前你说你是通过电话发帖的。
【解决方案2】:

为了实现这一点,我建议使用FormLayout

FormLayout 是一个强大、灵活和精确的通用布局管理器。它将组件放置在由列和行组成的网格中,允许指定的组件跨越多个列或行。并非所有列/行都必须具有相同的宽度/高度。

注意:最好在 Eclipse 中使用 Windowbuilder 或在 Intellij 中使用 GUI Form 来自动放置和设置组件属性。

【讨论】:

  • “推荐” 不推荐使用 3rd 方布局,因为使用核心 Java 布局很容易实现这一点。也许您应该将其编辑为推荐”..
  • 随心所欲。谢谢
  • “Windowbuilder很好用”更好了解如何手动布局组件!我的经验告诉我,GUI 设计工具比用户真正了解如何使用(和组合)布局更有效。很好的第一次编辑。 :)
  • 看起来是一个不错的选择,但我正在尝试使用我已经拥有的工具,我正在为大学学习这个,所以无论如何都需要知道如何在没有它的情况下做到这一点。跨度>
  • “很容易实现” 使用GridBagLayout 既不容易,也无法实现。至少你不能创建一个可移植的解决方案。 GridBagLayout 使用固定间隙,这些间隙在不同类型的屏幕上根本不可用(现在有很多)。从内置的 Java 布局来看,只有 GroupLayout 可以创建真正可移植的 UI。实际上只有三种布局可以用于现代 UI:MigLayoutGroupLayoutFormLayout;因此,“推荐”有一定的价值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-10
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
相关资源
最近更新 更多