これと同じ質問がこのサイトでよく聞かれますが、解決策はほとんど常に同じです。
メイン ウィンドウが依存する入力をユーザーに処理させる必要がある場合、モーダル ダイアログが必要な場合は、2 つ目の JFrame を使用しないでください。依存ウィンドウを表示するには、モーダル JDialog または JOptionPane を使用します。これを行うと、ダイアログが完全に処理されるまで、メイン ウィンドウからのプログラム フローが中断されます。これにより、メイン プログラムは、ユーザーが依存ウィンドウをプログラムとして操作を完了したことを簡単に検出できます。依存ウィンドウであるモデルダイアログが表示された直後からフローが再開されます。その後、依存ウィンドウによって表示されるフィールドを照会し、含まれている情報を使用して JTable のモデルを更新できます。
もう 1 つのオプションは、CardLayout を使用してメイン ウィンドウに 2 番目のビューを新しいビューとして表示し、ビューを入れ替えることです。
一方、メイン ウィンドウが 2 番目のウィンドウを扱うユーザーに完全に依存しない場合は、それを非モーダル ダイアログとして表示するか、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);
}
}