【发布时间】:2014-06-29 02:52:23
【问题描述】:
基本上.. 我使用 swing 制作了一个 JDialog。现在我希望它向调用它的 JFrame 返回一个值。问题是,每当我调用 JDialog 的构造函数时,即使我设置了setModal(true),它也不会阻塞线程。我在这里遗漏了什么明显的东西吗?
private final JPanel contentPanel = new JPanel();
private File chosenFile = null;
private JList list;
private File[] files;
public File getInformation()
{
return chosenFile;
}
/**
* Create the dialog.
*/
public PatientPicker(JFrame parent)
{
super(parent);
setModal(true);
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
setLocationRelativeTo(parent);
setBounds(100, 100, 450, 396);
getContentPane().setLayout(new BorderLayout());
contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
getContentPane().add(contentPanel, BorderLayout.CENTER);
files = new File(ClientInfo.GetAppData() + "/patients").listFiles(new TextFileFilter());
{
JPanel buttonPane = new JPanel();
buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
getContentPane().add(buttonPane, BorderLayout.SOUTH);
{
JButton okButton = new JButton("OK");
okButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent arg0) {
if(files.length != 0)
chosenFile = files[list.getSelectedIndex()];
dispose();
}
});
okButton.setActionCommand("OK");
buttonPane.add(okButton);
getRootPane().setDefaultButton(okButton);
}
{
JButton cancelButton = new JButton("Cancel");
cancelButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent arg0) {
dispose();
}
});
cancelButton.setActionCommand("Cancel");
buttonPane.add(cancelButton);
}
}
}
然后是我如何创建它:
PatientPicker patientPicker = new PatientPicker(frmReportGenerator);
File dataFile = patientPicker.getInformation();
【问题讨论】:
-
Modal 是关于阻止用户与其他组件的交互,而不是其他线程。
-
@chrylis 根据this,这不一定是真的......
-
您提供的链接适用于在事件线程上运行的代码。所以是的,@chrylis 所说的所有 都是 必然是正确的。
-
好的,所以我想我的问题是:如何获得我想要的行为?我只需要从 JDialog 中返回一个值