很长一段时间以来,我居住的光标位于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 );
}
答案 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();
}
}