国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java,console輸出實(shí)時(shí)的轉(zhuǎn)向GUI textbox

ivydom / 1840人閱讀

摘要:下面這句話會(huì)轉(zhuǎn)向中輸出實(shí)時(shí)輸出問題方法,本質(zhì)上是多線程的更新內(nèi)容。在處理上的點(diǎn)擊事件時(shí),事件處理返回之前,其他事件是不能觸發(fā)的,界面類似于卡住的狀況。因此,在點(diǎn)擊事件結(jié)束后,更新內(nèi)容的線程才能運(yùn)行,這樣的效果是內(nèi)容輸出是非實(shí)時(shí)的。

1 簡單入門例子

  入門例子是從參考文獻(xiàn)2與3中粘過來的內(nèi)容。
  在Swing中,如果需要重定向System.err和System.out到一個(gè)JTextPane或一個(gè)JTextArea,你僅需要覆寫OutputStream類的write()方法,以追加文本到文本組件。下面給一個(gè)關(guān)于JTextArea的例子。

private JTextArea textArea = new JTextArea(4, 25);

// 本質(zhì)上相當(dāng)于多線程的更新JTextArea內(nèi)容
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() {
     // 使用,調(diào)用redirectSystemStreams()即可。    
     redirectSystemStreams();

     // 下面這句話會(huì)轉(zhuǎn)向textArea中輸出
     System.out.println("hello, world");
}
2 實(shí)時(shí)輸出問題

  redirectSystemStreams方法,本質(zhì)上是多線程的更新JTextArea內(nèi)容。在處理Swing上的點(diǎn)擊事件時(shí),事件處理返回之前,其他事件是不能觸發(fā)的,界面類似于卡住的狀況。
  因此,在Swing點(diǎn)擊事件結(jié)束后,更新JTextArea內(nèi)容的線程才能運(yùn)行,這樣的效果是內(nèi)容輸出是非實(shí)時(shí)的。
  怎樣解決這個(gè)問題呢?在事件處理函數(shù)里面,重開一個(gè)線程,在這個(gè)新開的線程里面,執(zhí)行比較耗時(shí)的計(jì)算與相應(yīng)的打印內(nèi)容。這樣的話,事件處理函數(shù)所在的線程會(huì)快速的線束,其它更新Swing的JTextArea內(nèi)容的線程才能被執(zhí)行。
  下面以偽代碼的形式,給出一個(gè)例子,說明事件處理函數(shù)的寫法。

public class InstallBtnListener implements ActionListener {

    // 日志頁面類,該類有一個(gè)JTextArea屬性,是打印內(nèi)容目標(biāo)輸出位置;
    private LogFrame logFrame = new LogFrame();
        
    public InstallBtnListener() {
        super();        
        
        // 使輸出轉(zhuǎn)向JTextArea;
        // 這里我封閉了個(gè)類,重點(diǎn)是,將JTextArea傳過去,且調(diào)用redirectSystemStreams方法
        new RedirectingPrint(logFrame.getTextArea()).redirectSystemStreams();
    }

    @Override
    public void actionPerformed(ActionEvent e) {            

        // 在事件處理函數(shù)里面,重開一個(gè)線程,在這個(gè)新開的線程里面,執(zhí)行比較耗時(shí)的計(jì)算與相應(yīng)的打印內(nèi)容
        new Thread(new Runnable() {
            @Override
            public void run() {                                
                // 比較耗時(shí)的計(jì)算與相應(yīng)的打印內(nèi)容代碼寫在這里                                
            }
        }).start();
        
    }
}

// JButton點(diǎn)擊事件 
jbutton.addActionListener(new InstallBtnListener());
3 總結(jié)

  以上,就解決了輸出實(shí)時(shí)性的問題。
  下面有一段話,從參考文獻(xiàn)1中粘過來的,用它來總結(jié)下這個(gè)問題。

一般說來,耗時(shí)的操作不應(yīng)該在事件處理方法中執(zhí)行,因?yàn)槭录幚矸祷刂埃渌录遣荒苡|發(fā)的,界面類似于卡住的狀況,所以在獨(dú)立的線程上執(zhí)行比較耗時(shí)的操作可能更好,這會(huì)立即更新用戶界面和釋放事件派發(fā)線程去派發(fā)其他的事件。
4 參考文獻(xiàn)

[1] https://blog.csdn.net/yiziwei... (java基礎(chǔ)學(xué)習(xí)總結(jié)——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而不是控制臺(tái)?)
[5] https://stackoverflow.com/que...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/72510.html

相關(guān)文章

  • python 使用PyQt5

    摘要:一安裝二簡單使用使用創(chuàng)建一個(gè)簡單窗口創(chuàng)建一個(gè)應(yīng)用對(duì)象參數(shù)是一個(gè)來自命令行的參數(shù)列表腳本可以在中運(yùn)行。這是我們用來控制我們應(yīng)用啟動(dòng)的一種方法。 一:安裝PyQt5 pip install pyqt5 二:PyQt5簡單使用1:使用PyQt5創(chuàng)建一個(gè)簡單窗口 import sys from PyQt5 import QtWidgets #創(chuàng)建一個(gè)應(yīng)用(Application)對(duì)象,sys...

    CoreDump 評(píng)論0 收藏0
  • JavaScript 表單腳本——“文本框腳本”注意要點(diǎn)

    摘要:屬性可以設(shè)置文本框的初始值。特性則是用于指定文本框內(nèi)可以接受的最大字符數(shù)。與這個(gè)方法對(duì)應(yīng)的事件,在選擇了文本框中的文本時(shí)事件觸發(fā)。如阻止用戶選擇要調(diào)用之前或之后立即將焦點(diǎn)設(shè)置到文本框。 在HTML中,有兩種方式來表現(xiàn)文本框: 一種是使用input元素的單行文本,另一種是使用textarea的多行文本框。 使用input方式,必須添加type,設(shè)置為text。 size特性,可以指定文...

    kk_miles 評(píng)論0 收藏0
  • h5實(shí)現(xiàn)一鍵復(fù)制到粘貼板 兼容ios

    摘要:是方法起始光標(biāo)結(jié)束光標(biāo)不兼容蘋果復(fù)制文字必須手動(dòng)觸發(fā)點(diǎn)擊事件或者其他事件,不能直接使用調(diào)用實(shí)現(xiàn)一鍵復(fù)制到粘貼板兼容兼容性補(bǔ)充移動(dòng)端安卓手機(jī)微信和幾個(gè)手機(jī)瀏覽器都可以用。 實(shí)現(xiàn)原理 采用document.execCommand(copy)來實(shí)現(xiàn)復(fù)制到粘貼板功能 復(fù)制必須是選中input框的文字內(nèi)容,然后執(zhí)行document.execCommand(copy)命令實(shí)現(xiàn)復(fù)制功能。初步實(shí)現(xiàn)方案...

    miracledan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<