摘要:下面這句話會轉向中輸出實時輸出問題方法,本質上是多線程的更新內容。在處理上的點擊事件時,事件處理返回之前,其他事件是不能觸發的,界面類似于卡住的狀況。因此,在點擊事件結束后,更新內容的線程才能運行,這樣的效果是內容輸出是非實時的。
1 簡單入門例子
入門例子是從參考文獻2與3中粘過來的內容。
在Swing中,如果需要重定向System.err和System.out到一個JTextPane或一個JTextArea,你僅需要覆寫OutputStream類的write()方法,以追加文本到文本組件。下面給一個關于JTextArea的例子。
private JTextArea textArea = new JTextArea(4, 25); // 本質上相當于多線程的更新JTextArea內容 private void updateTextArea(final String text) { SwingUtilities.invokeLater(new Runnable() { public void run() { textArea.append(text); } }); } private void redirectSystemStreams() { OutputStream out = new OutputStream() { @Override public void write(int b) throws IOException { updateTextArea(String.valueOf((char) b)); } @Override public void write(byte[] b, int off, int len) throws IOException { updateTextArea(new String(b, off, len)); } @Override public void write(byte[] b) throws IOException { write(b, 0, b.length); } }; System.setOut(new PrintStream(out, true)); System.setErr(new PrintStream(out, true)); } @Test public void run() { // 使用,調用redirectSystemStreams()即可。 redirectSystemStreams(); // 下面這句話會轉向textArea中輸出 System.out.println("hello, world"); }2 實時輸出問題
redirectSystemStreams方法,本質上是多線程的更新JTextArea內容。在處理Swing上的點擊事件時,事件處理返回之前,其他事件是不能觸發的,界面類似于卡住的狀況。
因此,在Swing點擊事件結束后,更新JTextArea內容的線程才能運行,這樣的效果是內容輸出是非實時的。
怎樣解決這個問題呢?在事件處理函數里面,重開一個線程,在這個新開的線程里面,執行比較耗時的計算與相應的打印內容。這樣的話,事件處理函數所在的線程會快速的線束,其它更新Swing的JTextArea內容的線程才能被執行。
下面以偽代碼的形式,給出一個例子,說明事件處理函數的寫法。
public class InstallBtnListener implements ActionListener { // 日志頁面類,該類有一個JTextArea屬性,是打印內容目標輸出位置; private LogFrame logFrame = new LogFrame(); public InstallBtnListener() { super(); // 使輸出轉向JTextArea; // 這里我封閉了個類,重點是,將JTextArea傳過去,且調用redirectSystemStreams方法 new RedirectingPrint(logFrame.getTextArea()).redirectSystemStreams(); } @Override public void actionPerformed(ActionEvent e) { // 在事件處理函數里面,重開一個線程,在這個新開的線程里面,執行比較耗時的計算與相應的打印內容 new Thread(new Runnable() { @Override public void run() { // 比較耗時的計算與相應的打印內容代碼寫在這里 } }).start(); } } // JButton點擊事件 jbutton.addActionListener(new InstallBtnListener());3 總結
以上,就解決了輸出實時性的問題。
下面有一段話,從參考文獻1中粘過來的,用它來總結下這個問題。
一般說來,耗時的操作不應該在事件處理方法中執行,因為事件處理返回之前,其他事件是不能觸發的,界面類似于卡住的狀況,所以在獨立的線程上執行比較耗時的操作可能更好,這會立即更新用戶界面和釋放事件派發線程去派發其他的事件。4 參考文獻
[1] https://blog.csdn.net/yiziwei... (java基礎學習總結——java.awt.EventQueue.invokeLater干什么用的)
[2] https://billwaa.wordpress.com... ([Java] GUI Console Output)
[3] http://unserializableone.blog... (Redirecting System.out and System.err to JTextPane or JTextArea)
[4] https://stackoverrun.com/cn/q... (如何在eclipse中打印到textArea而不是控制臺?)
[5] https://stackoverflow.com/que...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72510.html
摘要:一安裝二簡單使用使用創建一個簡單窗口創建一個應用對象參數是一個來自命令行的參數列表腳本可以在中運行。這是我們用來控制我們應用啟動的一種方法。 一:安裝PyQt5 pip install pyqt5 二:PyQt5簡單使用1:使用PyQt5創建一個簡單窗口 import sys from PyQt5 import QtWidgets #創建一個應用(Application)對象,sys...
摘要:屬性可以設置文本框的初始值。特性則是用于指定文本框內可以接受的最大字符數。與這個方法對應的事件,在選擇了文本框中的文本時事件觸發。如阻止用戶選擇要調用之前或之后立即將焦點設置到文本框。 在HTML中,有兩種方式來表現文本框: 一種是使用input元素的單行文本,另一種是使用textarea的多行文本框。 使用input方式,必須添加type,設置為text。 size特性,可以指定文...
摘要:是方法起始光標結束光標不兼容蘋果復制文字必須手動觸發點擊事件或者其他事件,不能直接使用調用實現一鍵復制到粘貼板兼容兼容性補充移動端安卓手機微信和幾個手機瀏覽器都可以用。 實現原理 采用document.execCommand(copy)來實現復制到粘貼板功能 復制必須是選中input框的文字內容,然后執行document.execCommand(copy)命令實現復制功能。初步實現方案...
閱讀 3244·2021-09-07 10:10
閱讀 3589·2019-08-30 15:44
閱讀 2592·2019-08-30 15:44
閱讀 3016·2019-08-29 15:11
閱讀 2234·2019-08-28 18:26
閱讀 2754·2019-08-26 12:21
閱讀 1120·2019-08-23 16:12
閱讀 3037·2019-08-23 14:57