这个问题在这个网站上被问了很多,解决方案几乎总是一样的:
如果您需要让用户处理主窗口所依赖的输入,当您需要模态对话框时,不要使用第二个 JFrame。使用模态 JDialog 或 JOptionPane 来显示您的依赖窗口。当你这样做时,来自主窗口的程序流程将被中断,直到对话框被完全处理完,这样主程序很容易检测到用户何时完成了以依赖窗口为程序的操作当依赖窗口模型对话框显示后,流程将立即恢复。然后,您可以查询相关窗口显示的字段,并使用包含的信息来更新您的 JTable 模型。
请注意,另一个选项是将第二个视图显示为主窗口上的新视图,使用 CardLayout 交换视图。
另一方面,如果主窗口不完全依赖于处理第二个窗口的用户,则考虑将其显示为非模态对话框或通过 CardLayout 或 JTabbedPane 显示为单独的视图。
例如:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class DialogEg {
private static void createAndShowGui() {
MainWin mainPanel = new MainWin();
JFrame frame = new JFrame("DialogEg");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class MainWin extends JPanel {
private String[] COL_NAMES = { "Last Name", "First Name" };
private DefaultTableModel model = new DefaultTableModel(COL_NAMES, 0);
private JTextField lastNameField = new JTextField(15);
private JTextField firstNameField = new JTextField(15);
public MainWin() {
final JPanel dataPanel = new JPanel();
dataPanel.add(new JLabel("Last Name:"));
dataPanel.add(lastNameField);
dataPanel.add(Box.createHorizontalStrut(15));
dataPanel.add(new JLabel("First Name:"));
dataPanel.add(firstNameField);
JPanel btnPanel = new JPanel();
btnPanel.add(new JButton(new AbstractAction("Add Name") {
@Override
public void actionPerformed(ActionEvent arg0) {
lastNameField.setText("");
firstNameField.setText("");
int result = JOptionPane.showConfirmDialog(MainWin.this, dataPanel,
"Enter Name", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
if (result == JOptionPane.OK_OPTION) {
String lastName = lastNameField.getText();
String firstName = firstNameField.getText();
Object[] dataRow = new String[] { lastName, firstName };
model.addRow(dataRow);
}
}
}));
setLayout(new BorderLayout());
add(new JScrollPane(new JTable(model)), BorderLayout.CENTER);
add(btnPanel, BorderLayout.SOUTH);
}
}