具有自适应宽度问题的JTextArea

时间:2013-07-05 08:19:13

标签: java swing jtextarea textwrapping linewrap

我希望JTextArea的行为方式如下:

  1. 始终显示垂直滚动条

  2. 当文字到达行尾时,它会在下一行继续(而不是继续在同一行但被隐藏)

  3. 调整窗口大小时,文本会刷新,因此,如果窗口较大,则文本的高度会降低。

  4. 第1点很容易,但我找不到第2点和第3点的方法,所以任何帮助都会受到赞赏。这是我写的示例代码:

    public class TestCode2 {
    
      public static void main(String[] args) {
    
        JFrame window = new JFrame("Test2");
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setSize(400, 200);
    
        JPanel container = new JPanel(new BorderLayout());
        window.add(container);
    
        JLabel labelNorth = new JLabel("North");
        container.add(labelNorth, BorderLayout.NORTH);
    
        JLabel labelSouth = new JLabel("South");
        container.add(labelSouth, BorderLayout.SOUTH);
    
        JTextArea ta = new JTextArea();
        JScrollPane taScrollPane = new JScrollPane(ta);
        taScrollPane
            .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        taScrollPane
            .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        container.add(taScrollPane);
    
        window.setVisible(true);
      }
    }
    

3 个答案:

答案 0 :(得分:1)

此:

jtextarea.setLineWrap(true);
jtextarea.setWrapStyleWord(true);

将使textarea在到达当前行的末尾时继续在下一行。基本上,jtextarea.setLineWrap(true)告诉textarea继续下一行打破单词,即你会得到这样的东西:

 _________
|I'm so co|
|ol       |
|_________|

然后,jtextarea.setWrapStyleWord(true)告诉textarea启用换行,结果将是:

 _________
|I'm so   |
|cool     |
|_________|

要在框架调整大小时调整JTextArea的大小,请使用ComponentListener;

jframe.addComponentListener(new ComponentAdapter(){
    public void componentResized(ComponentEvent e) {
        //the frame was resized, resize the textarea here
    }
});

<强>更新

正如mKorbel所说,要调整JTextArea的大小,请使用LayoutManager并让它完成所有工作

答案 1 :(得分:1)

正如在另一个答案中所提到的,与线条换行和换行相关的JTextArea的两个方法很重要,但是不需要组件监听器。请参阅代码的这个近似变体,它建议列中的文本区域大小&amp;构造函数的行并打包GUI。

import java.awt.BorderLayout;
import javax.swing.*;

public class TestCode2 {

    public static void main(String[] args) {

        JFrame window = new JFrame("Test2");
        window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel container = new JPanel(new BorderLayout());
        window.add(container);

        JLabel labelNorth = new JLabel("North");
        container.add(labelNorth, BorderLayout.PAGE_START);

        JLabel labelSouth = new JLabel("South");
        container.add(labelSouth, BorderLayout.PAGE_END);

        JTextArea ta = new JTextArea(7,30);

        ta.setWrapStyleWord(true);
        ta.setLineWrap(true);

        JScrollPane taScrollPane = new JScrollPane(ta);
        taScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        taScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        container.add(taScrollPane);

        window.pack();
        window.setVisible(true);
    }

}

答案 2 :(得分:0)

Point 2. linewrap是JTextArea的一个属性,可以设置。

API文档:

public void setLineWrap(boolean wrap)

将此添加到您的代码中:

ta.setLineWrap(true);