私は個人的なプロジェクトとして基本的な Java ワード プロセッサを作成するのに忙しく、ポップアップ JDialog が含まれています。ただし、ユーザーが [キャンセル] ボタンをクリックすると、JDialog は閉じることを拒否し、それを閉じる唯一の方法は、フレーム自体の [閉じる] ボタンを使用することです。同様に、「確認」ボタンがアクティブになると、タスクは完了しますが、JDialog は開いたままになります。誰でも助けることができますか?私のJDialog初期化コード:
package cword;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.swing.border.*;
public class AlreadyExists extends JDialog
{
public static final long serialVersionUID = 1L;
public AlreadyExists(Frame owner, String pathname, String filename, boolean includedExtension)
{
super(owner);
initComponents(pathname, filename, includedExtension);
}
private void initComponents(final String pathname, String filename, final boolean includedExtension)
{
dialogPane = new JPanel();
contentPanel = new JPanel();
label1 = new JLabel();
buttonBar = new JPanel();
okButton = new JButton();
cancelButton = new JButton();
setTitle("Confirm Overwrite");
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
{
dialogPane.setLayout(new BorderLayout());
{
contentPanel.setLayout(null);
label1.setText("File " + filename + " already exists. Are you sure you want to overwrite?");
contentPanel.add(label1);
label1.setBounds(new Rectangle(new Point(0, 5), label1.getPreferredSize()));
{
Dimension preferredSize = new Dimension();
for(int i = 0; i < contentPanel.getComponentCount(); i++) {
Rectangle bounds = contentPanel.getComponent(i).getBounds();
preferredSize.width = Math.max(bounds.x + bounds.width, preferredSize.width);
preferredSize.height = Math.max(bounds.y + bounds.height, preferredSize.height);
}
Insets insets = contentPanel.getInsets();
preferredSize.width += insets.right;
preferredSize.height += insets.bottom;
contentPanel.setMinimumSize(preferredSize);
contentPanel.setPreferredSize(preferredSize);
}
}
dialogPane.add(contentPanel, BorderLayout.CENTER);
{
buttonBar.setBorder(new EmptyBorder(12, 0, 0, 0));
buttonBar.setLayout(new GridBagLayout());
((GridBagLayout)buttonBar.getLayout()).columnWidths = new int[] {0, 85, 80};
((GridBagLayout)buttonBar.getLayout()).columnWeights = new double[] {1.0, 0.0, 0.0};
okButton.setText("Confirm");
buttonBar.add(okButton, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 5), 0, 0));
cancelButton.setText("Cancel");
buttonBar.add(cancelButton, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 0), 0, 0));
}
dialogPane.add(buttonBar, BorderLayout.SOUTH);
}
contentPane.add(dialogPane, BorderLayout.CENTER);
pack();
setLocationRelativeTo(getOwner());
setDefaultCloseOperation(2);
setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
setVisible(true);
okButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
write(pathname, includedExtension);
close();
}
});
cancelButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
close();
}
});
}
private void write(String pathname, boolean includedExtension)
{
if(includedExtension)
{
try
{
BufferedWriter writer;
writer = new BufferedWriter(new FileWriter(pathname));
writer.write(CWord.textArea1.getText());
writer.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
else if(!includedExtension)
{
try
{
BufferedWriter writer;
writer = new BufferedWriter(new FileWriter(pathname + ".txt"));
writer.write(CWord.textArea1.getText());
writer.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
private void close()
{
dispose();
dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
}
private JPanel dialogPane;
private JPanel contentPanel;
private JLabel label1;
private JPanel buttonBar;
private JButton okButton;
private JButton cancelButton;
}
CWord.class でこれを呼び出す行の 1 つ:
new AlreadyExists(this, file.getAbsolutePath(), file.getName(), true);