如何使用IntelliJ Idea设计器创建的对话框在类的字段上执行操作

时间:2016-04-30 13:29:16

标签: java intellij-idea

我很好奇如何使用内置于IntelliJ IDEA中的对话设计器,因为我发现它具有很大的潜力,但我真的不知道如何使用它。

让我们考虑使用设计器创建的两个类的桌面程序:MainWindowMainDialog。让我们假设MainWindow类已经具有显示简单表单所需的所有字段,组件等。然后在MainWindow课程中我们有:

JLabel label = new JLabel("This is default text");
JButton showDialog = new JButton("Show dialog");
showDialog.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e) 
            {
                MainDialog dialog = new MainDialog ();
                dialog.pack();
                dialog.setVisible(true);
            }
        });

使对话框可见。设计人员默认设计的MainDialog类如下所示:

public class MainDialog extends JDialog {
private JPanel contentPane;
private JButton buttonOK;
private JButton buttonCancel;

public MainDialog() {
    setContentPane(contentPane);
    setModal(true);
    getRootPane().setDefaultButton(buttonOK);

    buttonOK.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            onOK();
        }
    });

    buttonCancel.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            onCancel();
        }
    });

// call onCancel() when cross is clicked
    setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
    addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            onCancel();
        }
    });

// call onCancel() on ESCAPE
    contentPane.registerKeyboardAction(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            onCancel();
        }
    }, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
}

private void onOK() {
// add your code here
    dispose();
}

private void onCancel() {
// add your code here if necessary
    dispose();
}
}

现在让我们假设在对话框类中我有一个文本字段:

JTextField textField = new JTextField();

我正在通过MainWindow类中的标签显示要显示的文本。

由于我默认创建了onOK()函数,我希望更新MainWindow类中的标签,并在MainDialog类的文本字段中输入文字。

问题是:我如何使用此模式MainDialogMainWindow window = new MainWindow中写或制作{{}来对另一个班级的字段执行操作1}} label?可能吗?我知道这可以做得更简单,但这也是一个简单的例子,我想使用这种结构执行更复杂的操作。

1 个答案:

答案 0 :(得分:1)

是的,这是可能的。

第一个选项:由于对话框是模态的,因此在关闭对话框之前,将阻止在主窗口中打开模态的代码。所以你可以在模态中做这样的事情:

public String getEnteredText() {
    return textField.getText();
}

并在主窗口中:

dialog.setVisible(true);
myLabel.setText(dialog.getEnteredText());

或(但我会使用第一个选项),您可以将主窗口或任何其他回调传递给对话框。例如:

MainDialog dialog = new MainDialog(this);

在对话框中:

private void onOK() {
    mainWindow.setLabelText(textField.getText());
    dispose();
}

我的建议是避免UI设计师。特别是如果你还没有能够编写他们自己生成的代码,并且你对Swing的工作原理没有深刻的理解。