为什么我的JTextArea溢出GroupLayout中的帧?

时间:2010-12-08 18:33:45

标签: java swing grouplayout

我正在使用GroupLayout观察一些奇怪的行为。我有一个包含在JScrollPane中的JTextArea,它正在调整大小并将其他组件推出JFrame。奇怪的是,如果我重新排列布局,以便JTextArea上面或下面没有任何东西(也没有间隙),它可以正常工作。就好像文本区域向容器询问容器中有多少空间,然后占用100%的空间,而不管其他组件。另一个奇怪的事情是它似乎只有当JTextArea(而不是JScrollPane)大小加上容器中的其他组件高度达到Short.MAX_VALUE时才会发生。

如果我将滚动窗格的垂直组中的最大大小(将布局添加到布局时)指定为小于Short.MAX_VALUE的值,则似乎可以解决问题(只要值之间的差异)和Short.MAX_VALUE大于所有其他组件的高度。例如

.addComponent(textArea, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE - 500)

此外,如果我将首选大小设置为小的正值而不是GroupLayout.PREFERRED_SIZE或GroupLayout.DEFAULT_SIZE,它似乎也会使此行为消失。例如

.addComponent(textArea, 0, 1, Short.MAX_VALUE)

GroupLayout上的Java教程似乎没有提及任何相关内容,并倾向于在整个地方使用Short.MAX_VALUE。我尝试使用谷歌搜索来找到答案,但我发现这个问题在搜索术语中很难描述。

我发现了一个错误,还是我不了解GroupLayout?后者肯定似乎更有可能。

此示例将创建一个简单的文本区域。按下按钮以使用文本填充它(并调整JScrollPane内的JTextArea的大小)。然后,您可以在文本区域内单击并添加或删除行。添加一些额外的行后,单击重绘按钮(或调整框架大小)以查看奇怪的行为。

public class GroupLayoutTest {
    public GroupLayoutTest() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                final JFrame frame = new JFrame("GroupLayout test");
                Container panel = frame.getContentPane();

                GroupLayout layout = new GroupLayout(panel);
                panel.setLayout(layout);

                JButton addBtn = new JButton("Add Lines");
                JButton redrawBtn = new JButton("Redraw");

                final JTextArea textArea = new JTextArea();
                final JScrollPane textPane = new JScrollPane(textArea);

                layout.setHorizontalGroup(layout.createParallelGroup()
                        .addComponent(redrawBtn)
                        .addComponent(textPane)
                        .addComponent(addBtn));

                layout.setVerticalGroup(layout.createSequentialGroup()
                        .addComponent(redrawBtn)
                        .addComponent(textPane)
                        .addComponent(addBtn));

                addBtn.addActionListener(new ActionListener() {
                    int m = 0;

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        for (int i = m; m < i + 2044; ++m) {
                            textArea.append("Line " + m + "\n");
                        }

                        // redraw the frame
                        frame.validate();
                    }
                });

                redrawBtn.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        frame.validate();
                    }
                });

                frame.setPreferredSize(new Dimension(640, 480));
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public static void main(String[] args) {
        new GroupLayoutTest();
    }
}

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

我不知道GroupLayout的内部结构,但通常需要指定textArea / scrollpane组合的首选大小,以便为布局管理器提供一些可供使用的信息。这可以通过以下任一方式完成:

final JTextArea textArea = new JTextArea(10, 30);

textPane.setPreferredSize( new Dimension(400, 200) );

否则我认为首选大小基本上是添加到文本区域的所有文本的大小。