我很好奇如何使用内置于IntelliJ IDEA中的对话设计器,因为我发现它具有很大的潜力,但我真的不知道如何使用它。
让我们考虑使用设计器创建的两个类的桌面程序:MainWindow
和MainDialog
。让我们假设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
类的文本字段中输入文字。
问题是:我如何使用此模式在MainDialog
行MainWindow window = new MainWindow
中写或制作{{}来对另一个班级的字段执行操作1}} label
?可能吗?我知道这可以做得更简单,但这也是一个简单的例子,我想使用这种结构执行更复杂的操作。
答案 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的工作原理没有深刻的理解。