java—对多个相邻的JPanel使用wraplayout会导致面板大小问题

kmynzznz  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(418)

我有3个相邻的JPanel,每个JPanel都使用wraplayout来显示可变数量的1x16网格。
它适用于包含最多1x16网格的面板,但是,其他两个面板的尺寸似乎由包含最多1x16网格的面板决定。例如,如果配电盘1和配电盘2分别只有一个1x16网格,但配电盘3有十个1x16网格分布在两行上,则配电盘1和配电盘2各自的1x16网格下方都有一个1x16网格大小的空白空间。
我基本上想让每个面板的大小调整独立于其他面板运行。我已经浏览了camickr的src代码,无法确定应该修改什么才能得到想要的结果。
就代码而言,很难知道如何包含一个简洁而有指导意义的部分,因为代码非常分散,我不确定是什么部分导致了这个问题。我只是将面板的布局设置为左对齐的播放。
我在下面附上了一张图片,它可能会提供一些背景信息。图中显示了三个JPanel中两个JPanel的一部分(青色),以及其中一个JPanel的附带标题jlabel(绿色)。每个面板上的1x16网格使用camickr的wraplayout进行管理。所有三个青色jpanel都包含在一个更大的显示jpanel中,该jpanel随后被打包到一个jscrollpane中(因此图像右侧的灰色滚动条)。
任何帮助都将不胜感激。

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

以下是我希望gui显示的方式:

kninwzqo

kninwzqo1#

从期望的行为和实际的行为图像来看,问题在于 LayoutManager 您使用将3个面板布置到其父面板/框架中(我猜这是一个 GridLayout 因为3个面板的尺寸分布均匀)。如果是这样,请使用其他方法 LayoutManager ,例如垂直 BoxLayout .
示例代码和教程可以在oracle相应的代码和教程中找到(实际的代码示例可以在这个链接中找到,带有花哨的代码颜色,或者在这里以纯文本的形式)。

r1zk6ea1

r1zk6ea12#

我创建了以下gui。

我创造了一个 JFrame . 我创建了一个主 JPanel 放入 JFrame . 主要 JPanel 使用 GridBaglayout 分离三种青色 JPanels .
每种青色 JPanel 根据黑色的数量计算首选尺寸 JPanels 放在青色的盒子里 JPanel . 改变 boxesPerRow 值以获得每行不同数量的框。
每个黑色 JPanel 以20 x 80像素的首选大小创建;
下面是完整的可运行代码。换句话说,这是一个最小的可重复的例子。

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

}

相关问题