2015-10-25 67 views
0

我有一個Java GUI應用程序,其中視圖應該提供一個功能,要求用戶選擇一個路徑。該功能應阻止,直到用戶選擇路徑(或者如果用戶取消)。InvokeAndWait返回值

由於函數不在EDT線程的上下文中調用,我使用invokeAndWait。它看起來是這樣的,其中path是視圖的私有成員:

private String path; 

public String getPath(String defaultPath) 
{ 
    try{ 
     SwingUtilities.invokeAndWait(() -> { 
      // Ask here the user for the path 
      path = new PathSelector(defaultPath).getPath(); 
     } 
    } catch (InvocationTargetException e) { 
     return ""; 
    } catch (InterruptedException e) { 
     return ""; 
    } 
    return path; 
} 

我的問題是如何傳遞的路徑,這是在美國東部時間範圍內選擇,以它最初叫並返回它的函數那裏。以下線路已被封鎖:

path = new PathSelector(defaultPath).getPath(); 

對於我的私有成員path解決它的那一刻,但實際上我不喜歡這樣的解決方案,原因路徑是更多的是臨時變量,實際上已經無關班級本身。爲此尋找另一個解決方案,我遇到了SwingWorker,但我無法弄清楚我能如何解決這個問題。

另一個想法是創建一個對象,它有一個字符串作爲成員與getter和setter來設置此字符串並傳遞此對象的引用,它可以設置EDT中的字符串成員並將其返回到getPath函數返回它。

有沒有人有更流暢的解決方案?

+3

我想你只是想要一個模態對話框。 https://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html#overview –

+1

我的想法正如@JBNizet。例如,一個JOptionPane對此非常有用。瞭解JOptionPanes可以容納複雜的GUI,如果需要的話可以包含JPanels組件,或者如果你不喜歡在這種情況下使用它們,那麼JDialog就會是完美的。 –

+2

'//在這裏向用戶詢問路徑如果你的意思是一個**文件**路徑,那麼使用'JFileChooser'(在@JBNizet建議的模式對話框中顯示)。 –

回答

0

由於沒有人提出了另一種解決方案,我能找到的最好的解決方案是:我創建了一個包含要返回的字符串的簡單對象。所以我在兩個任務上下文中都有參考,我可以使用它。我有人有一些評論,以改善這個解決方案,我打開它。

這是持有字符串的類。

public class StringCover { 
    private String string = ""; 

    public String getString() { 
    return string; 
    } 

    public void setString(String string) { 
    this.string = string; 
    } 

} 

這是上面的代碼,這個解決方案。

public String getPath(String defaultPath) 
{ 
    StringCover stringCover = new StringCover(); 
    try{ 
     SwingUtilities.invokeAndWait(() -> { 
      // Ask here the user for the path 
      stringCover.setString(new PathSelector(defaultPath).getPath()); 
     } 
    } catch (InvocationTargetException e) { 
     stringCover.setString(""); 
    } catch (InterruptedException e) { 
     stringCover.setString(""); 
    } 
    return stringCover.getString(); 
}