【问题标题】:How to append text on a jtextarea如何在 jtextarea 上附加文本
【发布时间】:2014-03-06 04:15:11
【问题描述】:

当我按下按钮时,我想在执行方法之前在 JTextArea 中显示文本。我使用 jTextArea.append() 和 jTextArea.settext() 但文本在方法执行后出现。我的代码:

    //...JTextArea jTextArea;
    JButton btnGo = new JButton("Start");
    btnGo.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
        jTextArea.append("line before\n");
        myMethodFromOtherClass();
        jTextArea.append("line after\n");
        }
    }

有什么建议吗?

【问题讨论】:

    标签: java swing append actionlistener jtextarea


    【解决方案1】:

    actionPerformed() 方法由处理所有 GUI 相关事件的 EDT(事件调度线程)调度。在 actionPerformed() 方法完成执行之前,不会更新方法中执行的更新。要解决这个问题,请在另一个线程中执行myMethodFromOtherClass(),并在第二个线程中方法完成执行后才将最终更新事件(jTextArea.append("line after\n");)排队。

    一个粗略的演示如下所示:

    JButton btnGo = new JButton("Start");
    btnGo.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            //Leave this here
            jTextArea.append("line before\n");
    
            //Create new thread to start method in
            Thread t = new Thread(new Runnable(){
                public void run(){
                    myMethodFromOtherClass();
    
                    //Queue the final append in the EDT's event queue
                    SwingUtilities.invokeLater(new Runnable(){
                        public void run(){
                            jTextArea.append("line after\n");
                        }
                    });
                }
            });
    
            //Start the thread
            t.start();
        }
    }
    

    如果要设计更优雅的解决方案,请查看SwingWorker,它基于非常相似的过程但具有更高级的功能。

    【讨论】:

    • 只要“其他”方法不与 GUI 交互,在这种情况下 SwingWorker 可能是更好的选择
    • @MadProgrammer 是的......请注意我的“粗鲁”一词。我想我会在我的回答中提到 SwingWorker。谢谢。
    • 答案没有错,问题是缺少内容要100%确定选择哪个解决方案;)
    猜你喜欢
    • 2015-04-03
    • 2011-06-18
    • 1970-01-01
    • 2023-04-08
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多