【问题标题】:How to set autoscrolling in a JTextArea while it is set to NOT editable?当 JTextArea 设置为不可编辑时,如何在 JTextArea 中设置自动滚动?
【发布时间】:2014-03-13 13:21:20
【问题描述】:

我使用this 的答案来获得 JTextArea 上的自动滚动功能。但它似乎只有在同一个 JTextArea 的 setEditable 属性设置为 TRUE 时才有效。当然,我使用的是 JScrollPane。

我正在开发一个聊天应用程序作为一个大学项目。显示消息的区域与 JTextArea 完全相同。我在上面链接的第一个答案中使用了第二组代码。但是当 setEditable 设置为 FALSE 时,我需要它使其工作。

即使将 JTextArea 和 JScrollPane 的 setAutoScrolls 属性设置为 TRUE,它也不会工作。

请帮忙。谢谢。

【问题讨论】:

    标签: java swing user-interface jscrollpane jtextarea


    【解决方案1】:

    我已经使用这个答案来获得自动滚动的功能 文本区域。但似乎只有当 setEditable 同一 JTextArea 的属性设置为 TRUE。当然,我使用 JScrollPane

    • 我认为setEditable(false) 和/或setEnabled(false) 及其可能的组合没有任何问题

    • (野外拍摄到黑暗中)不包括 EventDispatchThread 的问题,当 setText, append 等未在 EDT 上完成时,例如包裹在invokeLater()

    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();
                }
            });
        }
    }
    

    【讨论】:

      【解决方案2】:

      试试这个小例子:

      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);
      

      有效吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-10
        • 2021-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-12
        相关资源
        最近更新 更多