簡體   English   中英

Swing線程:事件調度線程

[英]Swing Threads: Event dispatch Thread

目前,我在使用swing的Thread模型時遇到了一些主要問題。 AFAIK Swing定義了3個不同的線程:

  • 初始線程:這里程序又名main方法啟動,其中GUI將通過一些init()方法啟動
  • 事件分發線程:GUI的主線程。 GUI初始化,更新GUI等的每一點都在此單個線程中
  • Worker Thread:用於一些繁重的任務的背景知識

例:

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        // init gui here
    }
});
}

這是一個簡單的示例,其中main方法是初始Thread,程序將在其中啟動,然后在啟動GUI的地方調用新線程(事件調度線程)。

這個對嗎?

現在我的問題:

我正在編寫一個Swing程序,該程序連接到兩個不同的服務器並在視覺上區分它們。 因此,我有2x Connection connection = ...到“左”服務器的第一個連接對象存在於初始主線程中,因為程序將在其中一個服務器的環境中執行=>該連​​接對象是由環境預先定義的並且存在和main()的開始。 第二個連接對象將在程序中手動構建。

現在的問題是,我使用invokeLater()將GUI代碼的每一位都移到了事件調度線程上。 因為我使用GUI來讓用戶選擇第二台服務器的憑據,所以“正確”服務器的連接代碼位於GUI內,因此位於事件分發線程中。 但是我確實需要在一個線程中同時使用兩個連接對象,因為在某一時刻我必須同時使用兩個對象。

例:

public void run() {
// Left connection object is predefined and named "contect" here

// Right connection objects is created here using a GUI
connection = new ConnectionDialog().getConnection();

Project[] projects = connection.getProjects();
ProjectDialog pd = new ProjectDialog(Diff.this, projects);
otherProject = pd.getSelectedProject();
if (otherProject == null) {
    return;
}

this.leftStore = (TemplateStoreRoot) context.requireSpecialist(StoreAgent.TYPE).getStore(Store.Type.TEMPLATESTORE);
this.rightStore = otherProject.getUserService().getTemplateStore();
this.leftSets = context.requireSpecialist(ProjectAgent.TYPE).getTemplateSets();
this.rightSets = otherProject.getUserService().getProject().getTemplateSets();
this.init();
this.setEnabled(true);
this.setVisible(true);
}

我該怎么辦才能完成這項工作? 我通過將每個GUI代碼轉移到事件分發線程來做錯了嗎? 紀錄片說我必須這樣做。

謝謝!

您必須創建一個框架來保持您的UI正確嗎? 子類化JFrame,添加您自己的構造函數,並將第一個連接對象作為參數傳遞。 您可以將其保存在框架對象中並在其中使用。

就是說,如果您希望UI能夠響應,則不希望在UI線程中進行任何冗長的計算,等待網絡數據等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM