Как установить автопрокрутку в JTextArea, когда она установлена в положение НЕ редактируемое?

1

Я использовал этот ответ, чтобы получить функциональность Autoscrolling на JTextArea. Но кажется, что он работает только тогда, когда свойство setEditable того же JTextArea имеет значение TRUE. Конечно, я использую JScrollPane.

Я разрабатываю чат-приложение как проект колледжа. Область, где отображаются сообщения, - это тот же JTextArea. Я использовал второй набор кода в первом ответе в приведенной выше ссылке. Но мне нужно, чтобы он работал, когда setEditable установлен в FALSE.

Он не будет работать даже после того, как свойства setAutoScrolls в JTextArea & JScrollPane будут установлены в TRUE.

Пожалуйста помоги. Thanx.

Теги:
user-interface
swing
jtextarea
jscrollpane

2 ответа

3
Лучший ответ

Я использовал этот ответ, чтобы получить функциональность Autoscrolling на JTextArea. Но кажется, что он работает только тогда, когда свойство setEditable того же JTextArea имеет значение TRUE. Конечно, я использую JScrollPane

  • Я не видел никаких проблем для setEditable(false) и/или setEnabled(false) с их возможными комбинациями

  • (wild shot in dark), исключая проблему с EventDispatchThread, когда setText, append т.д. не выполняется на EDT, например, завернутый в invokeLater()

Изображение 174551

import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.DefaultCaret;

public class CaretAndJTextArea {

    private JTextArea textArea = new JTextArea();
    private static final String string =
            "Trail: Creating a GUI with JFC/Swing\n"
            + "Lesson: Learning Swing by Example\n"
            + "This lesson explains the concepts you need to\n"
            + " use Swing components in building a user interface.\n"
            + " First we examine the simplest Swing application you can write.\n"
            + " Then we present several progressively complicated examples of creating\n"
            + " user interfaces using components in the javax.swing package.\n"
            + " We cover several Swing components, such as buttons, labels, and text areas.\n"
            + " The handling of events is also discussed,\n"
            + " as are layout management and accessibility.\n"
            + " This lesson ends with a set of questions and exercises\n"
            + " so you can test yourself on what you've learned.\n"
            + "http://docs.oracle.com/javase/tutorial/uiswing/learn/index.html\n";

    public CaretAndJTextArea() {
        DefaultCaret caret = (DefaultCaret) textArea.getCaret();
        caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
        textArea.setEditable(false);
        textArea.setEnabled(false);
        textArea.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent e) {
                setModelText();
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                setModelText();
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                setModelText();
            }

            private void setModelText() {
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        //textArea.setText(textArea.getText());
                    }
                });
            }
        });
        JButton button2 = new JButton("Append String");
        button2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                textArea.append(string);
            }
        });
        JFrame frame = new JFrame();
        frame.add(new JScrollPane(textArea), BorderLayout.CENTER);
        frame.add(button2, BorderLayout.SOUTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 200);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new CaretAndJTextArea();
            }
        });
    }
}
0

Попробуйте этот небольшой пример:

JPanel myPanel=new JPanel();
myPanel.setBorder(new TitledBorder(new EtchedBorder(), "My Application"));

JTextAea textArea = new JTextArea(16, 58);
textArea.setEditable(false); // set textArea to non editable
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

myPanel.add(scrollPane);

Это работает?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню