Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 启用换行时,JTextArea从不收缩_Java_Swing_Jscrollpane_Jtextarea_Gridbaglayout - Fatal编程技术网

Java 启用换行时,JTextArea从不收缩

Java 启用换行时,JTextArea从不收缩,java,swing,jscrollpane,jtextarea,gridbaglayout,Java,Swing,Jscrollpane,Jtextarea,Gridbaglayout,我需要一个标签,将线包装包含的文字根据可用的大小。由于JTextArea可以换行,因此我使用了它并相应地对其进行了样式设置,使其类似于JLabel 问题是JTextArea只会增加其宽度,但不会再次缩小。因此,我有一个带有一些包装文本的初始窗口大小,然后我将窗口调整为更宽,文本将相应地调整,但是再次缩小窗口不会使JTextArea变小,而是会出现一个滚动条 这仅在以下两种情况下发生: JTextArea位于JPanel上,该面板本身位于JScrollPane setLineWrap(true)

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

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

这仅在以下两种情况下发生:

  • JTextArea
    位于
    JPanel
    上,该面板本身位于
    JScrollPane
  • 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;
    }

}
启用换行时,JTextArea从不收缩 我在JPanel中有一个JTextArea,它的Gridlayout有这个问题。 只需设置TextArea的最小大小,即可解决此问题

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

您可以使用
JLabel
,如图所示将文本包装在
中,但可能不使用额外的面板。尝试将其直接添加到JScrollPane。如果您需要面板中的更多内容,只需不直接添加JTextArea,而是再添加一个JScrollPane即可。在这种情况下,带有
JLabel
不会换行(位于
JScrollPane
上)。无论哪种方式,如果单词太长,它都不会像
JTextArea
那样封装在单词中。我不能直接将它添加到
JScrollPane
,我需要整个
JPanel
可以滚动。如果我包装
JTextArea
是另一个
JScrollPane
,它不会改变行为。