首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在多个相邻JPanels上使用WrapLayout会导致面板大小问题

在多个相邻JPanels上使用WrapLayout会导致面板大小问题
EN

Stack Overflow用户
提问于 2021-07-10 07:46:54
回答 2查看 62关注 0票数 1

我有3个相邻的JPanels,每个都使用WrapLayout来显示可变数量的1x16网格。

它适用于包含最多1x16网格的面板,然而,其他两个面板的尺寸似乎由包含最多1x16网格的面板决定。例如,如果配电盘1和2分别只有一个1x16网格,而配电盘3有10个1x16网格分布在两行上,则配电盘1和2在各自的1x16网格下都有1x16网格大小的空白空间。

我基本上想让每个面板的大小调整独立于其他面板运行。我已经看过camickr的WrapLayout源码,但我不太清楚我应该修改什么才能得到想要的结果。

在代码方面,知道如何包含一个简洁和有指导意义的部分是很棘手的,因为代码相当分散,我不确定是哪个部分导致了这个问题。我只是将面板的布局设置为左对齐的WrapLayout。

我在下面添加了一张图片,可能会提供一些背景信息。图像显示了三个JPanels (青色)中的两个的一部分,以及其中一个JPanels的标题JLabel (绿色)。每个面板上的1x16网格是使用camickr的WrapLayout进行管理的。所有三个青色JPanels都包含在一个更大的显示JPanel中,然后将其打包成一个JScrollPane (因此图像右侧的灰色滚动条)。

任何帮助都将不胜感激。

这是我创建的另一个图像,它更清楚地显示了这个问题。图像中的第三个面板换行到一个新行,以显示它包含的所有1x16网格,这样做会使其他两个面板的高度加倍,尽管它们不需要调整大小。

下面是我希望GUI的显示方式:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-10 21:33:03

从期望的行为与实际的行为图像来判断,问题出在您用来将3个面板布局到其父面板/框架中的LayoutManager (我猜测这是一个GridLayout,因为这3个面板的大小相等)。如果是这样,请使用其他一些LayoutManager,例如垂直BoxLayout

示例代码和教程可以在Oracle's corresponding one中找到(其实际代码示例可以在带有花哨代码颜色的this链接中找到,也可以在纯文本形式的here中找到)。

票数 3
EN

Stack Overflow用户

发布于 2021-07-10 22:08:21

我创建了以下GUI。

我创建了一个JFrame。我创建了一个放在JFrame中的主JPanel。主JPanel使用GridBaglayout来分隔三个青色JPanels

每个青色JPanel基于放置在青色JPanel中的黑色JPanels的数量来计算优选大小。更改boxesPerRow值以获得不同数量的每行框。

创建每个黑色JPanel的最佳大小为20 x 80像素;

下面是完整的可运行代码。换句话说,这是一个最小的可重现的例子。

代码语言:javascript
运行
复制
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

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

public class BoxesGUI implements Runnable {

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

    @Override
    public void run() {
        JFrame frame = new JFrame("Boxes");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        frame.add(createMainPanel(), BorderLayout.CENTER);
        
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
    
    private JPanel createMainPanel() {
        JPanel panel = new JPanel(new GridBagLayout());
        panel.setBackground(Color.BLACK);
        panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.LINE_START;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.insets = new Insets(5, 5, 5, 5);
        gbc.weightx = 1.0;
        
        gbc.gridx = 0;
        gbc.gridy = 0;
        panel.add(createCyanPanel(1), gbc);
        
        gbc.gridy++;
        panel.add(createCyanPanel(1), gbc);
        
        gbc.gridy++;
        panel.add(createCyanPanel(20), gbc);
        
        return panel;
    }
    
    private JPanel createCyanPanel(int count) {
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEADING, 5, 5));
        panel.setBackground(Color.CYAN);
        
        JPanel dummyPanel = createBlackPanel();
        Dimension d = dummyPanel.getPreferredSize();
        
        int boxesPerRow = 8;
        int width = (d.width + 5) * boxesPerRow + 5;
        int height = ((count + boxesPerRow - 1) / boxesPerRow) * (d.height + 5) + 5;
        panel.setPreferredSize(new Dimension(width, height));
        
        for (int i = 0; i < count; i++) {
            panel.add(createBlackPanel());
        }
        
        return panel;
    }
    
    private JPanel createBlackPanel() {
        JPanel panel = new JPanel();
        panel.setBackground(Color.BLACK);
        panel.setPreferredSize(new Dimension(20, 80));
        return panel;
    }

}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68323626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档