gpt4 book ai didi

java - 等待 jdialog 关闭

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:01:39 24 4
gpt4 key购买 nike

我有一个扩展 JDialog 的类 FilePathDialog 并且该类正在从某个类 X 中调用。这是类 X 中的一个方法

    projectDialog = new FilePathDialog();   
projectDialog.setVisible(true);

projectDialog.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.out.println("Window closing");
try {
doWork();
} catch (Throwable t) {
t.printStackTrace();
}
}

public void windowClosed(WindowEvent e) {
System.out.println("Window closed");
try {
doWork();
} catch (Throwable t) {
t.printStackTrace();
}
}
});

doWork 永远不会在 JDialog 窗口关闭时被调用。我要做的就是等待 JDialog 关闭,然后再继续该方法。我也尝试使用 SwingWorker 和 Runnable,但这没有帮助。

最佳答案

同样,关键是对话框是否是模态的

如果它是模态的,则不需要 WindowListener,因为您会知道该对话框已被处理,因为代码将在您调用对话框上的 setVisible(true) 后立即恢复。即,这应该有效:

projectDialog = new FilePathDialog();   
projectDialog.setVisible(true);
doWork(); // will not be called until the dialog is no longer visible

如果另一方面它是无模式的,那么 WindowListener 应该可以工作,并且您可能在此处未显示的代码中遇到了另一个问题,并且您需要发布 sscce供我们分析、运行和修改。

为 gpeche 编辑
请查看此 SSCCE,它显示 3 种类型的默认关闭参数将触发窗口监听器:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class DialogClosing {
private static void createAndShowGui() {
JFrame frame = new JFrame("DialogClosing");

JPanel mainPanel = new JPanel();
mainPanel.add(new JButton(new MyAction(frame, JDialog.DISPOSE_ON_CLOSE, "DISPOSE_ON_CLOSE")));
mainPanel.add(new JButton(new MyAction(frame, JDialog.HIDE_ON_CLOSE, "HIDE_ON_CLOSE")));
mainPanel.add(new JButton(new MyAction(frame, JDialog.DO_NOTHING_ON_CLOSE, "DO_NOTHING_ON_CLOSE")));

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}

class MyAction extends AbstractAction {
private JDialog dialog;
private String title;

public MyAction(JFrame frame, int defaultCloseOp, final String title) {
super(title);
dialog = new JDialog(frame, title, false);
dialog.setDefaultCloseOperation(defaultCloseOp);
dialog.setPreferredSize(new Dimension(300, 200));
dialog.pack();
dialog.addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
System.out.println(title + " window closed");
}
@Override
public void windowClosing(WindowEvent e) {
System.out.println(title + " window closing");
}
});

this.title = title;
}

@Override
public void actionPerformed(ActionEvent arg0) {
dialog.setVisible(true);
}
}

关于java - 等待 jdialog 关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7855227/

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