很长一段时间以来,我一直希望光标位于JTextArea
的txaOutput
底部,即使我希望光标位于顶部,该光标仍被填充在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();
}
}