2016-09-15 81 views
2

我需要在JDialog(confirmDialog或inputDialog)中顯示一個選項卡。該選項卡每行包含2個JTextField。在顯示效果還算不錯:在對話框中單擊確定時獲取Jtextfields的值

enter image description here

,但我不知道如何讓JTextField的值。

這裏是顯示代碼:

int size = model.getCheckedApplications().size(); 
// une ligne par application sélectionnée 
layout = new GridLayout(size + 1, 3, 5, 5); 
myPanel = new JPanel(layout); 
myPanel.add(new JLabel("Application")); 
myPanel.add(new JLabel("Version cadre")); 
myPanel.add(new JLabel("Nouvelles natures")); 
for (Application app : model.getCheckedApplications()) { 
    myPanel.add(new JLabel(app.getCode88())); 
    JTextField versionActuelleField = new JTextField(30); 
    versionActuelleField.setName("versionActuelle" 
      + app.getCode88()); 
    versionActuelleField.setText(app 
      .getVersionCadreActuelle()); 

    JTextField nouvellesNaturesField = new JTextField(
      30); 
    nouvellesNaturesField.setName("nouvellesNatures" 
      + app.getCode88()); 

    myPanel.add(versionActuelleField); 
    myPanel.add(nouvellesNaturesField); 
} 
result = JOptionPane.showConfirmDialog(null, myPanel, 
     "Valeurs de cette version", 
     JOptionPane.OK_CANCEL_OPTION); 

那我就不知道如何當用戶點擊OK按鈕獲取值:

if (result == 0) { // The user clicks on the ok button 
+1

'JTextField.getText()'??? –

+0

@MatthewDiana是的,但我怎麼才能得到正確的JTextField? – jayjaypg22

+0

1)爲了更快地獲得更好的幫助,請發佈[MCVE]或[簡短,獨立,正確的示例](http://www.sscce.org/)。 2)最好在顯示選項窗格時傳遞父組件。這樣,用戶無法與(父級)GUI進行交互,直到選項窗格被解除。 –

回答

1

您需要將它們添加到您存儲的某個列表中,以便您可以再次訪問它們。既然你加入他們參照的應用程序,當用戶點擊確認按鈕,使用屬性訪問器getNouvellesNaturesFields()getVersionActuelleFields()你可以遍歷創建的所有領域,像這樣我會建議一個Map

private Map<Application, JTextField> nouvellesNaturesFields = new ArrayListMultimap<Application, JTextField>(); //Or Hashmap, if the key is unique 
private Map<Application, JTextField> versionActuelleFields = new ArrayListMultiMap<Application, JTextField>(); 

public List<JTextField> getNouvellesNaturesFields() { 
    return nouvellesNaturesFields ; 
} 

public List<JTextField> getVersionActuelleFields() { 
    return versionActuelleFields ; 
}  
//class code 

for (Application app : model.getCheckedApplications()) { 
    //Other code 
    JTextField nouvellesNaturesField = new JTextField(
      30); 
    nouvellesNaturesField.setName("nouvellesNatures" 
      + app.getCode88()); 
    nouvellesNaturesFields.put(app, nouvellesNaturesField); 

    //Other code and same for your new nature fields 
} 
result = JOptionPane.showConfirmDialog(null, myPanel, 
     "Valeurs de cette version", 
     JOptionPane.OK_CANCEL_OPTION); 

然後:

for (Map.Entry<Application, JTextField> entry: myMap.entries()) { 
    //Do something here 
} 

或者你也可以通過讓他們:

for (Application app : model.getCheckedApplications()) { 
    List<JTextField> data = myMap.get(app); 
    for(JTextField field : data) { 
     field.getText(); 
    } 
} 

由於密鑰值可能贏't是唯一的,我使用了一個ArrayListMultiMap,但是如果它是唯一的,那麼一個HashMap應該就足夠了

+1

帶有應用程序代碼的hashmap解決方案鍵和2個JTextField的數值在我的上下文中非常有用。謝謝! – jayjaypg22

0

您指定的JTextField值使用getText()方法的字符串,例如下面的例子

String texfield = JTextField.getText(); 

隨後您使用String文本字段 哪裏都行。爲了獲得正確的jtextfield,你必須從你想要的文本框中獲得文本,例如你有四個Jtexfield。假設它們是JTextField1,JTextField2,JTextField3和JTextField4。爲了得到JTextField3的價值,你有

String texfield = JTextField3.getText(); 
0

的值應該是您創建的JTextField中:

versionActuelleField
nouvellesNaturesField

此外,您可能想看看ParamDialog,我實現成爲這個問題的通用解決方案。

編輯

是的,我現在正在創建一個循環這些JTextFields看到。因此,您需要創建一個Collection,我建議您使用Map<String, JTextField>,您可以將所有應用程序名稱映射到匹配的JTextField,並遍歷該集合以獲取所有應用程序名稱/ JTextFields

+0

由於op是在for循環中創建的,因此無法訪問這些字段,問題在於它們沒有在任何地方存儲對這些字段的引用,並且在退出for循環時丟失了 – Draken

相關問題