我有一个添加了JTextArea的JScrollPane。然后,将ScrollPane添加到为gui创建的面板中。运行时,一切按计划进行。在输入部分中键入的文本将从输入中删除,并添加到输出中。但是,当文本超过JTextArea的大小时,它将拒绝在其后滚动。我将提供的代码很多,因为我不知道问题出在哪里或如何解决。
我浏览了StackOverflow,并尝试了许多不同的方法,我将给出一些链接。如何在Java GUI中设置JTextArea的自动滚动? 。以及我曾经使用过Oracle网站。 https://docs.oracle.com/javase/tutorial/uiswing/components/scrollpane.html。但他们都没有帮助我。
public Sork()
{
txtara = new JTextArea("");
panel = new JPanel();
txtfld = new JTextField("");
sb = new JScrollBar();
scrollBar = new JScrollPane(txtara,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrollBar.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
txtfld.setPreferredSize(new Dimension(740, 20));
txtfld.setLocation(new Point (0, 510));
txtfld.setBackground(Color.BLACK);
txtfld.setForeground(Color.WHITE);
txtara.setPreferredSize(new Dimension(740, 510));
txtara.setBackground(Color.BLACK);
txtara.setForeground(Color.WHITE);
txtara.setEditable(false);
panel.setPreferredSize(new Dimension(750, 575));
panel.setForeground(Color.BLACK);
panel.setBackground(Color.BLACK);
panel.add(scrollBar);
panel.add(txtfld);
txtfld.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
txtara.append("\n" + txtfld.getText());;
txtfld.setText("");
txtfld.grabFocus();
}});
}
我希望JTextArea在文本到达底部时自动滚动。我还应该提到我希望实际的滚动条不可见,这是基于文本的冒险。因此显示越少越好。
答案 0 :(得分:0)
以下对我有用。它几乎不使用您的任何代码,因为我觉得如果我从头开始,它将对您更有益。下面的代码显示一个JTextField
,您可以在其中输入文本。 JTextField
下方是(不可编辑)JTextArea
。当键盘焦点位于JTextField
时,按 Enter 键会将其文本附加到JTextArea
上。我建议您确保自己完全理解该代码,因为它会推动您学习 Swing 的学习过程。
为便于参考,下面的代码至少需要Java 7,因为它使用了 multi-catch 。
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.WindowConstants;
public class Sork implements ActionListener, Runnable {
private JButton exitButton;
private JFrame frame;
private JTextArea txtara;
private JTextField txtfld;
@Override // java.awt.event.ActionListener
public void actionPerformed(ActionEvent actnEvnt) {
Object src = actnEvnt.getSource();
if (src == exitButton) {
System.exit(0);
}
else if (src == txtfld) {
txtara.append("\n");
txtara.append(txtfld.getText());
txtfld.setText("");
}
}
@Override // java.lang.Runnable
public void run() {
showGui();
}
private JPanel createButton() {
JPanel panel = new JPanel();
exitButton = new JButton("Exit");
exitButton.addActionListener(this);
panel.add(exitButton);
return panel;
}
private JScrollPane createTextArea() {
txtara = new JTextArea(2, 10);
JScrollPane scrollPane = new JScrollPane(txtara);
txtara.setLineWrap(true);
txtara.setWrapStyleWord(true);
txtara.setEditable(false);
return scrollPane;
}
private JPanel createTextField() {
JPanel panel = new JPanel();
txtfld = new JTextField(10);
txtfld.addActionListener(this);
panel.add(txtfld);
return panel;
}
private void showGui() {
frame = new JFrame("Sork");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(createTextField(), BorderLayout.PAGE_START);
frame.add(createTextArea(), BorderLayout.CENTER);
frame.add(createButton(), BorderLayout.PAGE_END);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
String slaf = UIManager.getSystemLookAndFeelClassName();
try {
UIManager.setLookAndFeel(slaf);
}
catch (ClassNotFoundException |
InstantiationException |
IllegalAccessException |
UnsupportedLookAndFeelException x) {
System.err.println("WARN (ignored): Failed to set [System] look-and-feel.");
x.printStackTrace();
}
Sork instance = new Sork();
EventQueue.invokeLater(instance);
}
}