很长一段时间以来,我一直希望光标位于JTextAreatxaOutput底部,即使我希望光标位于顶部,该光标仍被填充在JScrollPane中。

我找到的唯一帮助是将插入符号位置设置为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!!!
  }


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

我应该怎么做?我正在做的事情似乎很矛盾。

*编辑,感谢机手*

将变量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 );
  }

最佳答案

首先,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();
    }
}

10-03 00:28