更新组件的高度也会更改其宽度



我有一个带有一个主 JPanel的GUI,并且内部有多行,每行是另一行JPanel。每行(JPanel类型(由4个较小的JPanel s组成,并且这4个面板内部都有一个组件。最终结果是网格类似接口。

主面板具有BoxLayout,并且是一排的一部分,具有FlowLayout

当我使用某些侦听器更新某些组件(从行中(时,整个行变高,可以按预期工作。但是发生的事情不仅是更改高度,而且还更改了组件的宽度(内部(。我知道BoxLayout正在尝试使用maxSizeminSize布局组件,我可以将其设置为相同的值并有效,但是当我调整窗口大小时,其他行扩展,并且使用相同的minSizemaxSize不及网格结构变得混乱。

我想实现的目标是我仅更新行的高度。当我调整窗口大小时,整个行会展开,网格的结构仍然是网格。这是简短的,独立的,正确的(可编译(,示例:

Main类:

public class Main {
public static void main(String args[]) {
        SwingUtilities.invokeLater(() -> {
                new MainFrame(450,150);
            });
    }
}

MainFrame类:

public class MainFrame extends JFrame{
    public MainFrame(int width, int height) {
        super("Title");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(width, height);
        setVisible(true);
        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
        JScrollPane scrollPane = new JScrollPane(mainPanel);
        add(scrollPane);

        for(int i=0; i<50; i++) {
            JPanel panel1 = new JPanel();
            panel1.setLayout(new FlowLayout(FlowLayout.LEFT));
            panel1.setBorder(BorderFactory.createMatteBorder(0, 1, 0, 1, Color.black));
            panel1.setPreferredSize(new Dimension(70,35));
            JPanel panel2 = new JPanel();
            panel2.setLayout(new FlowLayout(FlowLayout.LEFT));
            panel2.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, Color.black));
            panel2.setPreferredSize(new Dimension(70,35));
            JPanel panel3 = new JPanel();
            panel3.setLayout(new FlowLayout(FlowLayout.LEFT));
            panel3.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, Color.black));
            panel3.setPreferredSize(new Dimension(70,35));
            JTextArea area1 = new JTextArea("hello " + i);
            area1.setPreferredSize(new Dimension(70,25));
            panel1.add(area1);
            JTextArea area2 = new JTextArea("hello " + i);
            area2.setPreferredSize(new Dimension(70,25));
            panel2.add(area2);
            JTextArea area3 = new JTextArea("hello " + i);
            area3.setPreferredSize(new Dimension(70,25));
            panel3.add(area3);
            JPanel row = new JPanel();
            row.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.black));
            row.setLayout(new BoxLayout(row, BoxLayout.X_AXIS));
            row.add(panel1);
            row.add(panel2);
            row.add(panel3);
            JButton button = new JButton("Click me");
            JPanel buttonPanel = new JPanel();
            buttonPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
            buttonPanel.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, Color.black));
            buttonPanel.setPreferredSize(new Dimension(70,35));
            buttonPanel.add(button);
            button.addActionListener(event -> {
                panel1.setPreferredSize(new Dimension(panel1.getWidth(), panel1.getHeight() + 30));
                area1.setPreferredSize(new Dimension(area1.getWidth(), area1.getHeight() + 30));
                area1.updateUI();
            });
            row.add(buttonPanel);
            mainPanel.add(row);
        }
    }
}

如果您运行此代码并按下按钮,它不仅会更新行的高度,还会更新行的宽度和网格,不再对齐。

您正在根据组件的"大小"设置"首选大小"。这两个可以不同。

您的代码应该是:

//panel1.setPreferredSize(new Dimension(panel1.getWidth(), panel1.getHeight() + 30));
Dimension d = panel1.getPreferredSize();
panel1.setPreferredSize(new Dimension(d.width, d.height + 30));

另外,您不应使用updateUI()。这是一种在LAF更改上进行的内部使用的方法。

相反,当您要调用已更改的顶级组件上的布局管理器时,您可以调用Revalidate((:

//area1.updateUI();
panel1.revalidate();

相关内容

  • 没有找到相关文章

最新更新