JDialog拒绝关闭

时间:2012-07-31 08:29:50

标签: java swing dispose jdialog

我正在忙着制作一个基本的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);

2 个答案:

答案 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