在对话框中单击“确定”时获取 Jtextfields 的值

get values of Jtextfields when click OK in Dialog

我的需要是在 JDialog(confirmDialog 或 inputDialog)中显示一个选项卡。该选项卡每行包含 2 个 JTextField。显示效果很好:

但我不知道如何获取 JTextFields 的值。

这里是显示代码:

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);

然后我不知道如何在用户单击“确定”按钮时获取值:

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

您使用 getText() 方法将 Jtextfield 值分配给一个字符串,例如下面

String texfield = JTextField.getText();

随后,您可以在任何需要的地方使用字符串文本字段。为了获得正确的 jtextfield,您必须从您想要的文本字段中获取文本,例如您有四个 Jtexfield。假设它们是 JTextField1、JTextField2、JTextField3 和 JTextField4。要获取 JTextField3 的值,您需要

String texfield = JTextField3.getText();

这些值应该在您创建的 JTextFields 中:

versionActuelleField
nouvellesNaturesField

此外,您可能想看看 ParamDialog,我将其实现为该问题的通用解决方案。

编辑

是的,我现在看到您正在循环创建这些 JTextFields。因此,您需要创建一个 Collection,我建议您创建一个 Map<String, JTextField>,您可以在其中将所有应用程序名称映射到匹配的 JTextField,并遍历集合以获取所有应用名称 / JTextFields

您需要将它们添加到您存储的某个列表中,以便您可以再次访问它们。由于您是在引用应用程序时添加它们,因此我建议使用 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);

然后当用户单击确认按钮时,使用 属性 访问器 getNouvellesNaturesFields()getVersionActuelleFields() 您可以迭代所有创建的字段,如下所示:

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();
    }
}

由于键值可能不是唯一的,我使用了一个 ArrayListMultiMap, but if it would be unique, then a HashMap 就足够了