アプリケーションは通常1つのJFrameしか表示しないため、「サブ」JFrameは表示しないでください。あなたが話している仕事、親ウィンドウに依存するウィンドウの仕事は、モーダルまたは非モーダルJDialogの目的であり、ウィンドウを閉じてもアプリケーションが終了することはありません。これは言ったが、CardLayoutを使用してJComponentsまたはJTabbedPaneを交換するなどの他の代替案も検討してください。
また、JDialogは、JFrameに表示されるものと同じくらい複雑でリッチなGUIを表示できることを理解してください。
編集、に関して:
私はJFrameにJTableを持っていますが、コードがコンストラクター上にあるため、JFrameを再度インスタンス化して、GUIの別の状態を表示し、JFrameを閉じたり開いたりしたいと思います。
コードはコンストラクターから移動できます。GUIでの状態変化については、CardLayoutを使用することを強くお勧めします。JTableをJPanelに入れてから、JFrameのcontentPaneが保持しているJPanelを交換します。ウィンドウが表示されたり表示されなかったりしない場合、ユーザーインターフェイスははるかにスムーズになります。
編集
2OK、JTableの行を編集するウィンドウを表示する場合は、JTextFieldsの行のデータを保持するJPanelを作成し、JPanelを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を呼び出します(もちろんバックグラウンドスレッドで)。