一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 使用javafx更新UI的方法

使用javafx更新UI的方法

2021-09-29 11:35離離原上草77 Java教程

這篇文章主要介紹了使用javafx更新UI的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

使用javafx更新UI

JavaFx如果在子線程中更新UI,不論是task還是runable都會報錯

java.lang.IllegalStateException: Not on FX application thread; currentThread =

這種情況可以使用下面的方法

1,Platform.runLater()

這個辦法在當前線程不是javafx的線程中,比如runnable,thread這些的,直接調用即可,runLater()不是線程阻塞型的,在javafx的主線程完全清空或者說空閑的時候,它才會執行,

?
1
2
3
4
5
6
7
Platform.runLater(new Runnable() {
                        @Override
                        public void run() {
                            //更新JavaFX的主線程的代碼放在此處
                            p.cancelProgressBar();
                        }
                    });

但是如果必須先執行這段代碼怎么辦呢,也有方法

1,future是個工作線程

他允許阻塞當前線程,執行線程中的代碼,在拿到返回值后,才會順序執行

?
1
2
3
4
5
6
7
8
9
10
11
12
13
// 定義一個FutureTask,然后 Plateform.runLater() 這個futuretask
                        final FutureTask<String> query = new FutureTask<String>(new Callable<String>() {
                            @Override
                            public String call() throws Exception {
                                    // 新建一個窗口(方法中將創建stage)
                                    VcodeController vc = new VcodeController();
                                    return vc.show(url4vcode);
                            }
                        });
 
                        Platform.runLater(query);       // 重點
                        String vcode = query.get();     // 這樣就能獲取返回值
                        System.out.println(vcode);

2,利用 CountDownLatch,直接阻塞當前的主線程,執行相關代碼業務

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
 * Runs the specified {@link Runnable} on the
 * JavaFX application thread and waits for completion.
 *
 * @param action the {@link Runnable} to run
 * @throws NullPointerException if {@code action} is {@code null}
 */
public static void runAndWait(Runnable action) {
    if (action == null)
        throw new NullPointerException("action");
 
    // run synchronously on JavaFX thread
    if (Platform.isFxApplicationThread()) {
        action.run();
        return;
    }
 
    // queue on JavaFX thread and wait for completion
    final CountDownLatch doneLatch = new CountDownLatch(1);
    Platform.runLater(() -> {
        try {
            action.run();
        } finally {
            doneLatch.countDown();
        }
    });
 
    try {
        doneLatch.await();
    } catch (InterruptedException e) {
        // ignore exception
    }
}

3.使用task線程的返回值

task是javafx實現的ui線程,他實現了futureTask和worlker線程,所以它既可以當普通線程來使用,也可以重寫返回值方法,實現ui界面的刷新

不過要說明的是,task的call方法,仍然是一個普通線程的方法,如果要實現在task中刷新ui界面,要在

scheduled(),succeeded(),running()任意一個方法中執行,就可以了,這樣就實現了再task的線程中,刷新界面的功能

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.yz.readismqtest1;
import javafx.concurrent.Task;
public class deda {
    public static void main(String[] args) {
        Task task = new Task() {
            @Override
            protected Object call() throws Exception {
                //執行普通方法
                return null;
            }
 
            @Override
            protected void scheduled() {
                //更新JavaFX的主線程的代碼放在此處
                super.scheduled();
            }
 
            @Override
            protected void succeeded() {
                //更新JavaFX的主線程的代碼放在此處
                super.succeeded();
            }
 
            @Override
            protected void running() {
                //更新JavaFX的主線程的代碼放在此處
                super.running();
            }
        };
    }
}

JavaFX的并發編程與UI更新

JavaFX并發編程與UI更新

項目需求

根據項目需要,進行設備的并發測試,同時需要在界面上實時展示測試的結果

涉及到的技術

1、使用Observer的方式實現多個對象之間的通信(觀察者模式)

2、因為UI只有一個,需要在較短時間內接收并顯示大量的數據,所以使用了javafx.concurrent

3、線程池pool,減少對象的資源占用

上述技術的使用參考了大量的網絡資源和書籍內容,再次不進行一一列舉,感謝各位作者。

核心代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// 1、從線程池中獲取對象
 ObjectPoolDrawUIService objPool = ObjectPoolDrawUIService.getInstance();
 DrawUIService obj = (DrawUIService)objPool.getObject();
 
 // 2、對象的初始化   produceCaseResult是需要更新的數據內容  ,i是行號信息,放在Object[]中進行傳遞
 obj.init(new Object[]{produceCaseResult,i}, new EventHandler<WorkerStateEvent>() {
  @Override
  public void handle(WorkerStateEvent t) {
   Object[] objArray = (Object[])t.getSource().getValue();
   testDetailList.set((int) objArray[1], (ProduceCaseResult)objArray[0]);
   // 4、因為是在線程中執行,所以 returnObject代碼不能跟在obj.restart后面,會導致被很快的restart
   objPool.returnObject(obj);
  }
 });
 
 // 3、執行
 obj.restart();  // 因為是從pool中獲取,可能已經執行完畢,所以restart
以上代碼中需要特別注意,代碼4的位置,以下代碼為javafx.concurrent的核心代碼
public class DrawUIService extends Service<Object[]>{
 Object[] showData = {null,null};
 public void init(Object[] showData, EventHandler<WorkerStateEvent> eventHandler) {
  this.showData = showData;
  setOnSucceeded(eventHandler);
 }
 @Override
 protected Task<Object[]> createTask() {
  return new Task<Object[]>() {
   @Override
   protected Object[] call() throws Exception {
    return showData;
   }
  };
 }
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/qq_41886200/article/details/104050685

延伸 · 閱讀

精彩推薦
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7472021-02-04
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
主站蜘蛛池模板: 五月天网站 | 女同videos双性人 | 亚洲福利天堂网福利在线观看 | 国产一级毛片潘金莲的奶头 | 国产成人一区二区三区视频免费蜜 | 九九99靖品 | 亚洲欧美日韩国产综合专区 | 三级午夜宅宅伦不卡在线 | 久久久久久久电影 | 天堂在线中文无弹窗全文阅读 | 欧美xxoo做爰猛烈视频 | 精品久久免费观看 | 国产99精品视频 | 91麻豆国产福利在线观看 | 91亚洲专区 | 国产欧美日韩不卡一区二区三区 | 青青青国产在线 | 亚洲欧美日韩综合一区久久 | 亚洲人和日本人hd | 色综合久久六月婷婷中文字幕 | 亚洲国产精品一区二区三区久久 | ysl千人千色t9t9t9 | 扒开女人屁股眼看个够 | 成年人免费在线看的惊悚动作片 | 国产成人www免费人成看片 | 视频在线视频免费观看 | 日韩一区二区三 | 99久久99久久久精品齐齐鬼色 | 91精品啪在线观看国产91九色 | 韩国漂亮美女三级在线观看 | 国产精品va在线观看手机版 | 成人男女啪啪免费观看网站 | 青青青在线视频 | 99成人国产精品视频 | 国产精品视频视频久久 | 色男人的天堂久久综合 | 日韩欧美综合在线二区三区 | 亚洲精品乱码久久久久久蜜桃图片 | 无人区乱码1区2区3区网站 | 亚洲va在线va天堂va偷拍 | 久久成人国产精品一区二区 |