0

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

2 回答 2

1

好吧,这是一个艰难的,但我终于想通了!

这是你的问题。您在调用s后将ActionListeners 添加到按钮中。由于这是一个模态对话框,因此是 EDT 上的阻塞调用。这意味着 after 的代码直到对话框关闭后才执行,因此s 直到对话框关闭后才被添加到按钮中。setVisible(true)setVisible(true)setVisible(true)ActionListener

setVisible()当它是一个模态对话框时,您应该始终在执行所有 GUI 初始化之后调用。因此,只需setVisible(true)在调用addActionListener按钮后移至,您就可以开始了。

于 2012-11-28T18:38:26.363 回答
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
 }

在此处阅读更多内容: 如何制作对话框 - Java 教程 # 自定义按钮文本

于 2012-07-31T08:34:35.947 回答