gpt4 book ai didi

java - JDialog拒绝关闭

转载 作者:行者123 更新时间:2023-12-01 15:15:03 24 4
gpt4 key购买 nike

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

最佳答案

好吧,这很难,但我终于想通了!

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

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

关于java - JDialog拒绝关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11736058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com