【问题标题】:JTextArea with adaptative width issue具有自适应宽度问题的 JTextArea
【发布时间】:2013-07-05 08:19:12
【问题描述】:

我想要一个JTextArea,它的行为方式是这样的:

  1. 始终显示垂直滚动条

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

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

第 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);
  }
}

【问题讨论】:

    标签: java swing jtextarea word-wrap


    【解决方案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 并让它完成所有工作

    【讨论】:

    • 请删除以To resize the JTextArea ... 开头的所有内容,这是 LayoutMnager 的工作
    • 是的,这完全是我需要的,我可能已经搜索了一段时间才在这里问,但没关系,谢谢!
    【解决方案2】:

    正如另一个答案中提到的,JTextArea 与换行和换行样式相关的两种方法很重要,但不需要组件侦听器。请参阅代码的这种紧密变体,它在构造函数的列和行中建议文本区域大小并打包 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);
        }
    
    }
    

    【讨论】:

      【解决方案3】:

      第2点,换行是JTextArea的一个属性,可以设置。

      API 文档:

      public void setLineWrap(boolean wrap)
      

      将此添加到您的代码中:

      ta.setLineWrap(true);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 2023-03-07
        • 2011-09-05
        • 2013-11-11
        • 2011-06-20
        • 1970-01-01
        相关资源
        最近更新 更多