java-swing 给文本区jtextarea怎么加个滚动条?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java-swing 给文本区jtextarea怎么加个滚动条?相关的知识,希望对你有一定的参考价值。

package processhomework;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.Color;
public class first extends JFrame
private JLabel jLabel;
private JTextField jTextField;
private JButton jButton,jButton1,jButton2;
private JTextArea jtextarea;
private JScrollPane sp;

public first()

super();
this.setSize(700, 500);
this.getContentPane().setLayout(null);
this.add(getJLabel(), null);
this.add(getJTextField(), null);
this.add(getJButtonok(), null);
this.add(getJButtoncancel(),null);
this.add(getJButtonzero(),null);
this.setBackground(Color.red);
this.add(getJTextArea(), null);

this.setTitle("calculator");

private JTextArea getJTextArea()
if(jtextarea==null)
jtextarea=new JTextArea();
jtextarea.setBounds(5, 45, 650, 400);

jtextarea.setLineWrap(true);
//sp=new JScrollPane(jtextarea);
//sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
return jtextarea;

private JLabel getJLabel()
if(jLabel == null)
jLabel = new javax.swing.JLabel();
jLabel.setBounds(10, 10, 150, 30);
jLabel.setText("请输入需要输出的位数:");


return jLabel;

private JTextField getJTextField()
if(jTextField == null)
jTextField = new javax.swing.JTextField();
jTextField.setBounds(150, 10, 160, 30);

return jTextField;

private JButton getJButtonok()
if(jButton == null)
jButton = new javax.swing.JButton();
jButton.setBounds(400, 10, 100,30);
jButton.setText("begin");

return jButton;

private JButton getJButtoncancel()
if(jButton1 == null)
jButton1 = new JButton();
jButton1.setBounds(530, 10, 100, 30);
jButton1.setText("stop");

return jButton1;

private JButton getJButtonzero()
if(jButton2 == null)
jButton2 = new JButton();
jButton2.setBounds(310, 10, 80, 30);
jButton2.setText("清零");

return jButton2;

public static void main(String[] args)

first w = new first();
w.setVisible(true);

private JScrollPane getJTextArea ()

if (jtextarea == null)

jtextarea = new JTextArea ();

jtextarea.setLineWrap (true);
jtextarea.setWrapStyleWord (true);
sp = new JScrollPane (jtextarea);
sp.setBounds (5, 45, 650, 400);
return sp;

参考技术A JTextArea放到 JScrollPane里。追问

为什么是将JTextArea放到 JScrollPane里,而不是将JScroltArea放到 lPaneJTex里呢?

追答

JScrollPane为JTextArea提供滚动条属于装饰模式

文本区域 (JTextArea) 的自动文本滚动,插入符号位置设置为最后一行的开头

【中文标题】文本区域 (JTextArea) 的自动文本滚动,插入符号位置设置为最后一行的开头【英文标题】:Auto text scroll for text area (JTextArea) with caret position set to the beginning of the last line 【发布时间】:2012-05-28 01:45:41 【问题描述】:

我有一个简单的 Java 问题。我想将文本自动滚动到使用 JTextArea 创建的文本区域的最后一行的开头。文本区域每行的文本量远大于文本区域的宽度。

这是我用来设置它的代码 sn-p。

JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

现在的问题是,使用上面的代码,默认行为是插入符号自动定位到文档的末尾,结果,整个文本区域的开始部分超出了范围。我希望自动滚动发生在文档最后一行的开头。

为了清楚起见,这里有两个屏幕截图,

我想要的是第一个,但正在发生的是第二个。

【问题讨论】:

【参考方案1】:

在更新 textarea 的文本后,只需使用 getLineCountgetLineStartOffset 将插入符号移动到正确的位置。

这是一个说明您想要的行为的工作示例:

import java.util.List;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultCaret;

public class Test 

    private JFrame frame;
    private JTextArea ta;

    protected void initUI() 
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ta = new JTextArea();
        DefaultCaret caret = (DefaultCaret) ta.getCaret();
        caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
        frame.add(new JScrollPane(ta));
        frame.setSize(400, 200);
        frame.setVisible(true);
        new UpdateText().execute();
    

    class UpdateText extends SwingWorker<String, String> 

        @Override
        public String doInBackground() 
            for (int i = 0; i < 1000; i++) 
                publish("Hello-" + i);
                try 
                    Thread.sleep(500);
                 catch (InterruptedException e) 
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                
            
            return null;
        

        @Override
        public void process(List<String> chunks) 
            for (String s : chunks) 
                if (ta.getDocument().getLength() > 0) 
                    ta.append("\n");
                
                ta.append(s);
            
            try 
                ta.setCaretPosition(ta.getLineStartOffset(ta.getLineCount() - 1));
             catch (BadLocationException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            
        

        @Override
        public void done() 

        
    

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

            @Override
            public void run() 
                new Test().initUI();
            
        );
    


【讨论】:

很酷的解决方案!但我在这里有一个问题。有什么办法可以设置 ta.setCaretPosition(ta.getLineStartOffset(ta.getLineCount() - 1));只有一次,而不是每次都更新它,以便它对整个应用程序保持有效? 此外,虽然您使用的是 DefaultCaret caret = (DefaultCaret) ta.getCaret();caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);如果没有这些语句,您的代码也可以工作吗?您对此有何看法? @JtheRocker 不是我知道的。随着文本的更新,插入符号的位置会不断移动。因此,这意味着每次都需要重新计算其位置。您可以通过首先调用 super.setText 然后定位插入符号来扩展 JTextArea 并覆盖 setText。至于你的第二个问题,这是一个期望行为和人体工程学的问题。在您的问题中,这就是您所要求的。现在,如果您正在查看实际滚动到滚动窗格的左下角,那么您正在寻找其他东西。如果是这样,请考虑在 SO 上发布另一个问题。

以上是关于java-swing 给文本区jtextarea怎么加个滚动条?的主要内容,如果未能解决你的问题,请参考以下文章

文本区域 (JTextArea) 的自动文本滚动,插入符号位置设置为最后一行的开头

在 JtextArea 的末尾添加一个新行

默认情况下,将jTextArea设置为可见的false

浏览器中的文本区域列大小不一致

关于 JTextArea 的简单问题

使用 JTextArea 的计算器