我有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的显示方式:
发布于 2021-07-10 21:33:03
从期望的行为与实际的行为图像来判断,问题出在您用来将3个面板布局到其父面板/框架中的LayoutManager
(我猜测这是一个GridLayout
,因为这3个面板的大小相等)。如果是这样,请使用其他一些LayoutManager
,例如垂直BoxLayout
。
示例代码和教程可以在Oracle's corresponding one中找到(其实际代码示例可以在带有花哨代码颜色的this链接中找到,也可以在纯文本形式的here中找到)。
发布于 2021-07-10 22:08:21
我创建了以下GUI。
我创建了一个JFrame
。我创建了一个放在JFrame
中的主JPanel
。主JPanel
使用GridBaglayout
来分隔三个青色JPanels
。
每个青色JPanel
基于放置在青色JPanel
中的黑色JPanels
的数量来计算优选大小。更改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;
}
}
https://stackoverflow.com/questions/68323626
复制相似问题