不可编辑的自动滚动JTextArea

时间:2019-04-16 17:33:45

标签: java

我有一个添加了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在文本到达底部时自动滚动。我还应该提到我希望实际的滚动条不可见,这是基于文本的冒险。因此显示越少越好。

1 个答案:

答案 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);
    }
}