启用换行时,JTextArea永不收缩

时间:2015-08-14 06:51:42

标签: java swing jscrollpane jtextarea gridbaglayout

我需要一个标签,根据可用的大小对包含文本进行换行。由于JTextArea可以换行,我使用它并相应地设置它,因此它类似于JLabel

问题是JTextArea只会增加它的宽度,但不会再次缩小它。所以我有一个带有一些包装文本的初始窗口大小,然后我将窗口调整为更宽,文本将相应调整,但再次使窗口变小不会使JTextArea更小,而是滚动条出现。

这只发生在两者:

  • JTextArea位于JPanelJScrollPane
  • setLineWrap(true)用于JTextArea

删除JScrollPane会产生预期的行为,但我确实需要滚动整个内容,因为JPanel上可能还需要其他元素。

当窗口缩小时,如何让它再次变小?

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

/**
 * SSCCE to demonstrate the JTextArea behaviour
 */
public class WrapLabelTest {

    public static final void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                testGui();
            }
        });
    }

    private static final String TEST_TEXT = "Textfortestingandstufflongenough"
            + "foralinebreak";

    private static void testGui() {
        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        panel.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;
        gbc.anchor = GridBagConstraints.WEST;
        gbc.weightx = 1;
        gbc.weighty = 1;
        panel.add(new WrapLabel(TEST_TEXT), gbc);
//        
//        gbc.gridy = 1;
//        panel.add(new WrapLabel(TEST_TEXT), gbc);

        frame.add(new JScrollPane(panel));

        frame.setSize(200, 100);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

}

class WrapLabel extends JTextArea {

    private static final JLabel LABEL = new JLabel();

    public WrapLabel() {
        setWrapStyleWord(true);
        setLineWrap(true);
        setBackground(LABEL.getBackground());
        setFont(LABEL.getFont());
        setBorder(LABEL.getBorder());
        setFocusable(false);
        setForeground(LABEL.getForeground());
        setOpaque(false);
    }

    public WrapLabel(String text) {
        this();
        setText(text);
    }

    @Override
    public Dimension getPreferredSize() {
        Dimension d = super.getPreferredSize();
        // Debug output
        System.out.println(d);
        return d;
    }

}

1 个答案:

答案 0 :(得分:0)

启用换行时,JTextArea永不收缩

我在带有Gridlayout的JPanel中有一个JTextArea,但是有这个问题。 只需设置TextArea最小尺寸即可解决我的问题。

textArea.setMinimumSize(new Dimension(20,40));