如何将光标移到JScrollPane内的JTextArea的TOP

时间:2014-11-14 21:50:28

标签: java swing jscrollpane jtextarea

很长一段时间以来,我居住的光标位于JTextArea txaOutput的底部,在JScrollPane填充后,即使我想要它定位在TOP。

我发现的唯一帮助是将插入位置设置为0(例如txaOutput.setCaretPosition(0);),我从来没有想过如何正常工作。

今天我只是通过JTextArea的每一个可以想到的方法,最后发现,在填充它之前,这条线似乎可以满足我的需要:

txaOutput.insert(" ", 1 );

暂时不是最佳或唯一的方式。

这里是文本区的类:

package masterwords;
import gbl.GBConstraints;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;
import javax.swing.WindowConstants;

public class HelpOutput extends JFrame {

  private JScrollPane scrPnl;
  private JTextArea txaOutput;  

  public     HelpOutput() /* constructor */ {

    scrPnl = new JScrollPane();

    txaOutput    = new JTextArea();

    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

    scrPnl.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
    scrPnl.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    scrPnl.setViewportBorder(BorderFactory.createEtchedBorder());
    scrPnl.setAutoscrolls(false);
    scrPnl.setPreferredSize(new Dimension(500, 555));

    txaOutput.setFont(new Font("Courier New", 0, 14)); 
    scrPnl.setViewportView(txaOutput);

    setLayout(new GridBagLayout());

    add(scrPnl, new GBConstraints(0,0).ipad(200, 300).spanX(100).spanY(90));

    txaOutput.insert(" ", 1 );  // ********** WITHOUT THIS CURSOR IS AT BOTTOM
    setVisible(true);
    pack();
  }

  public void appendHelp(String s){
    txaOutput.append(s);
  }
}

以下是我一直打电话的方式,但在上面用************添加一行之前从未工作过:

  private void btnHelpActionPerformed (ActionEvent evt) {                                        

    HelpOutput helpOutput = new HelpOutput();

    Scanner sc = openHelp();
    while(sc.hasNext())
      helpOutput.appendHelp(sc.next());

   // txaOutput.setCaretPosition(0); // THIS DOES NOTHING so commented out!!!
  }   

在添加所有**************的行之前,我尝试将光标放在文本区域的顶部 - 始终是底部。

我应该做什么?我正在做的事情看起来像是一块垃圾。

*编辑,感谢JAVANATOR *

将变量txaOutput重命名为txaHelpOutput;问题解决了。新的关键行:

  private void btnHelpActionPerformed (ActionEvent evt) {                                        

    HelpOutput helpOutput = new HelpOutput();

    Scanner sc = openHelp();
    while(sc.hasNext())
      helpOutput.appendHelp(sc.next());

   txaHelpOutput.setCaretPosition(0);
   // ^^^^
  }   


public class HelpOutput extends JFrame {

  private JTextArea txaHelpOutput;  
  //                   ^^^^

  public     HelpOutput() /* constructor */ {

    txaHelpOutput    = new JTextArea();
    // ^^^^

    scrPnl.setViewportView(txaHelpOutput);
    //                        ^^^^

    // LOSE THIS LINE!! txaHelpOutput.insert(" ", 1 ); 
  }

1 个答案:

答案 0 :(得分:1)

首先,txaOutput.insert(" ", 1 );会在帮助文本中插入一个空格,这可能不是您想要的。

其次,您创建一个HelpOutput对象,向其添加文本,然后在setCaretPosition引用的其他对象上调用txaOutput。您需要在setCaretPosition对象的HelpOutput上致电JTextArea。通过在HelpOutput中创建一个调用setCaretPosition(0)

的方法,可以轻松完成此操作

以下代码将使用setCaretPosition(0)生成一个胡萝卜位于顶部的文本区域。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class HelpOutput extends JFrame
{
    private static final long   serialVersionUID    = -1323914827861467580L;
    private JScrollPane         scrPnl;
    private JTextArea           txaOutput;

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                btnHelpActionPerformed(null);
            }
        });
    }

    public HelpOutput()
    {

        scrPnl = new JScrollPane();
        txaOutput = new JTextArea();

        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

        scrPnl.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
        scrPnl.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scrPnl.setViewportBorder(BorderFactory.createEtchedBorder());
        scrPnl.setAutoscrolls(false);
        scrPnl.setPreferredSize(new Dimension(500, 555));

        txaOutput.setFont(new Font("Courier New", 0, 14));
        scrPnl.setViewportView(txaOutput);

        setLayout(new BorderLayout());

        add(scrPnl, BorderLayout.CENTER);

        setVisible(true);
        pack();
    }

    public void appendHelp(String s)
    {
        txaOutput.append(s);
    }

    public void putCarrotAtTop()
    {
        txaOutput.setCaretPosition(0);
    }

    private static void btnHelpActionPerformed(ActionEvent evt)
    {
        HelpOutput helpOutput = new HelpOutput();

        helpOutput
                .appendHelp("Lots of help\nLots of help\nLots of help\nLots of help\nLots of help\n");
        helpOutput.putCarrotAtTop();
    }
}