不要显示“子”JFrame,因为应用程序通常只显示一个 JFrame。您正在谈论的工作,即依赖于父窗口的窗口的工作是模态或非模态 JDialog 的用途,如果关闭将永远不会导致应用程序退出的窗口。尽管已经说过这也考虑其他替代方案,例如使用 CardLayout 来交换 JComponents 或 JTabbedPane。
请理解,JDialog 可以显示与任何 JFrame 上显示的 GUI 一样复杂和丰富的 GUI。
编辑,关于:
我在 JFrame 有一个 JTable,是的,我想再次实例化 JFrame 以显示不同的 GUI 状态,关闭和打开 JFrame,因为代码在其构造函数上。
代码可以移出构造函数。对于 GUI 中的状态更改,我强烈建议您使用 CardLayout。将您的 JTable 放入 JPanel,然后交换 JFrame 的 contentPane 持有的 JPanel。如果您没有在视图中弹出和弹出窗口,则用户界面会更加流畅。
编辑 2
好的,如果你想显示一个编辑 JTable 行的窗口,我会做的是创建一个 JPanel 来保存 JTextFields 中的行中的数据,然后在 JOptionPane.showConfirmDialog(. ..),然后使用 JTextFields 保存的数据来编辑您的 JTable 行。我不会为此创建一个单独的 JFrame。
编辑 3
例如:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
@SuppressWarnings("serial")
public class Foo1 extends JPanel {
private static final String[] COLUMN_NAMES = { "Foo", "Bar", "Licious" };
private static final Object[][] DATA = { { 1, "Abaddon", "A" },
{ 2, "Beelzebub", "B" }, { 3, "Chuck", "C" }, { 4, "Dagon", "D" },
{ 5, "Eisheth", "E" }, {6, "Forneus", "F"}};
private DefaultTableModel tableModel = new DefaultTableModel(DATA,
COLUMN_NAMES);
private JTable table = new JTable(tableModel);
public Foo1() {
JPanel bottomPanel = new JPanel();
bottomPanel.add(new JButton(new EditRowAction()));
setLayout(new BorderLayout());
add(new JScrollPane(table));
add(bottomPanel, BorderLayout.PAGE_END);
}
private class EditRowAction extends AbstractAction {
public EditRowAction() {
super("Edit Row");
putValue(MNEMONIC_KEY, KeyEvent.VK_E);
}
@Override
public void actionPerformed(ActionEvent arg0) {
int rowIndex = table.getSelectedRow();
if (rowIndex != -1) {
Object[] row = new Object[table.getColumnCount()];
for (int column = 0; column < row.length; column++) {
row[column] = tableModel.getValueAt(rowIndex, column);
}
MyRowPanel myRowPanel = new MyRowPanel(row);
int result = JOptionPane.showConfirmDialog(Foo1.this, myRowPanel,
"Edit Row Information and Press \"OK\"", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
if (result == JOptionPane.OK_OPTION) {
for (int col = 0; col < row.length; col++) {
tableModel.setValueAt(myRowPanel.getFieldText(col), rowIndex,
col);
}
}
}
}
}
private class MyRowPanel extends JPanel {
private JTextField[] textFields;
public MyRowPanel(Object[] row) {
textFields = new JTextField[row.length];
for (int i = 0; i < row.length; i++) {
textFields[i] = new JTextField(String.valueOf(row[i]), 10);
add(textFields[i]);
}
}
public String getFieldText(int index) {
// check first that index is not out of range and throw exception if it
// is
if (index < 0 || index > textFields.length) {
throw new ArrayIndexOutOfBoundsException("for index = " + index);
}
return textFields[index].getText();
}
}
private static void createAndShowGui() {
Foo1 mainPanel = new Foo1();
JFrame frame = new JFrame("Foo1");
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();
}
});
}
}
编辑4关于:
是的,我理解您的观点,它确实有效,也就是说,我将识别已编辑的行并替换为较新的值。但实际上,我想刷新以将真实数据持久保存在数据库中,而不是化妆“编辑”JTable。
好的,那么在上面的代码示例中,我将在显示 JOptionPane 和我的 if 块内部后立即创建一个 PreparedStatement,并在 PreparedStatement 上调用 executeUpdate(当然是在后台线程中)。