无法在滚动窗格上滚动 - Java Swing

时间:2015-12-12 15:56:23

标签: java swing jscrollpane jtextarea

我有一个Swing应用程序,它会在传递给GUI后立即用字符串更新Textarea的内容。

我在textarea中实时更新了字符串,但我现在面临的问题是,当进程仍在运行时,我无法滚动textarea。

任何人都知道这里发生了什么或有解决方案

尝试1 -

public static void appendToJTextArea(String message){
    String currentText = GUI.textLogArea.getText();
    String newString = message;
    String newTextToAppend = currentText + "\n" + newString;
    GUI.textLogArea.setText(newTextToAppend);
    GUI.frame.update(GUI.frame.getGraphics());
}

尝试2 -

    public static void appendToJTextArea(String message){
        Runnable runnable = new LogThread(message);
        Thread thread = new Thread(runnable);
        thread.start();

    /**
        String currentText = GUI.textLogArea.getText();
        String newString = message;
        String newTextToAppend = currentText + "\n" + newString;
        GUI.textLogArea.setText(newTextToAppend);
        GUI.frame.update(GUI.frame.getGraphics());
        **/
    }
}

    class LogThread implements Runnable {
        private String test;

        public LogThread(String message){
            test = message;
        }
        public void run() {
            update(test);
        }

    private void update(String message) {
        System.out.println("BBB"+GUI.textLogArea.getText());
        System.out.println("AAA"+message);

        String currentText = GUI.textLogArea.getText();
        String newString = message;
        String newTextToAppend = currentText + "\n" + newString;
        GUI.textLogArea.append(newTextToAppend);
    }

带滚动窗格的GUI类

JPanel panel_1 = new JPanel();
panel_1.setBounds(361, 40, 390, 305);
contentPane.add(panel_1);
panel_1.setLayout(null);

JLabel lblScraperLogs = new JLabel("Scraper Logs");
lblScraperLogs.setBounds(0, 0, 390, 31);
lblScraperLogs.setFont(new Font("Cooper Black", Font.PLAIN, 13));
lblScraperLogs.setHorizontalAlignment(SwingConstants.CENTER);
panel_1.add(lblScraperLogs);        

textLogArea = new JTextArea();
textLogArea.setEditable(false);
textLogArea.setBounds(10, 23, 380, 282);

JScrollPane scroll = new JScrollPane(textLogArea);
scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scroll.setBounds(10, 23, 380, 282);
panel_1.add(scroll);

1 个答案:

答案 0 :(得分:2)

  

但我现在遇到的问题是我无法在进程仍在运行时滚动textarea

听起来好像您正在Event Dispatch Thread (EDT)上执行长时间运行的流程。此Thread负责绘制GUI,因此GUI不会重新绘制自己,直到进程执行完毕。不要在EDT上运行代码。

而是需要为长时间运行的进程创建单独的Thread。也许使用SwingWorker创建一个单独的线程,并允许您在数据可用时“发布”。有关EDT和SwingWorker的更多信息,请阅读Concurrency上的Swing教程中的部分。