我正在忙着制作一个基本的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中调用它:
new AlreadyExists(this, file.getAbsolutePath(), file.getName(), true);
答案 0 :(得分:1)
好的,这是一个艰难的,但我终于明白了!
这是你的问题。您在调用ActionListener
之后将setVisible(true)
添加到按钮。由于这是一个模态对话框,setVisible(true)
是对EDT的阻止调用。这意味着setVisible(true)
之后的代码直到对话框关闭后才会执行,因此在对话框关闭之前,ActionListener
不会被添加到按钮中。
在所有GUI初始化执行模态对话框后,您应始终对setVisible()
进行调用。因此,只需在按钮上调用setVisible(true)
后移动addActionListener
,就可以了。
答案 1 :(得分:0)
绝对没有必要实现自己的对话框。
围绕此计划您的代码:
int choice = JOptionPane.showConfirmDialog(parentComponent, "Are you sure you want to overwrite?", "File Already Exists", JOptionPane.OK_CANCEL_OPTION);
if(choice == JOptionPane.OK_OPTION){
// okay
} else {
// cancelled
}
在此处阅读更多内容: How to Make Dialog - Java Tutorial # Custom Button Text