在更改JFrame的大小时,在GridLayout中添加JScrollPane不会在JPanel中调整JTextarea的大小

时间:2014-03-21 14:03:31

标签: java swing jscrollpane jtextarea

我想使用填充的JTextArea组件向当前GridLayout添加网格。 它工作正常,但正如标题中所提到的,JTextArea不会自我调整大小 改变框架的大小后。

我已经对错误进行了本地化:

text.setLineWrap(true); //<--- here is the problem!!enter code here
方法中的

这是我的代码:

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
class GridLayoutExample {

    private JFrame frame = new JFrame();
    private JPanel panel = new JPanel();
    private JScrollPane pane;
    final JTextArea text = new JTextArea("Click me!\nClick me!\nClick me!\nClick me!\nClick me!");

    GridLayoutExample() { createGui(); } //constrcutor

    private JPanel createGui () {
        panel.setLayout(new GridLayout(0, 2,0,0));          
        panel.add( new JLabel("Hello"));        
        //set style of first row, second column
        text.setLineWrap(true); //<--- here is the problem!!
        text.setEditable(true);
        //enable mouse listening and allow mouse action 
        doMouseActions();
        panel.add(text);
        return panel;
    }

    void addNewRow() {
        panel.add(new JLabel("Test1"));
        panel.add(new JTextField("Test"));
    }//addNewRow

    void showFrame() {
        pane = new JScrollPane(panel);
        frame.add(pane);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }//showframe

    void doMouseActions() {
        text.addMouseListener(new MouseListener() {

            @Override
            public void mouseClicked(MouseEvent arg0) {
                addNewRow();
            }

            @Override
            public void mouseEntered(MouseEvent arg0) {
                text.setBackground(Color.YELLOW);               
            }

            @Override
            public void mouseExited(MouseEvent arg0) {
                text.setBackground(Color.WHITE);                
            }

            @Override
            public void mousePressed(MouseEvent arg0) {}

            @Override
            public void mouseReleased(MouseEvent arg0) {}           
        });
    } // end of mouse action    

    public static void main(String[] args) {
        GridLayoutExample test = new GridLayoutExample();
        test.showFrame();
    }// end of main
}// class GridLayoutExampleenter code here

一方面,当我禁用换行时,它工作正常,另一方面我需要 它是为了换行。

那么有什么建议可以做得更好吗?

非常感谢提前!

1 个答案:

答案 0 :(得分:2)

您正在运行时添加组件。在这种情况下,您需要确保容器重新生效:

void addNewRow() {
    panel.add(new JLabel("Test1"));
    panel.add(new JTextField("Test"));
    panel.revalidate();
    panel.repaint();
}//addNewRow

此外,您应该仅在事件派发线程中创建和访问swing组件。有关详情,请参阅here