我在与JDialog相同的包中定义了一个动作。我想将Java Dialog的关闭按钮绑定到此操作,而不使用窗口侦听器。只需将此操作设置为按钮即可。你能帮帮我吗?谢谢
答案 0 :(得分:1)
以下代码应使用WindowAdapter作为WindowListener来实现所需。按下关闭按钮后,只需调用一次 windowClosing 方法。如果您打算添加一个替代的Close-Button,您可以随时触发windowClosing事件,而不需要单独处理它。
import java.awt.EventQueue;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JDialog;
import javax.swing.WindowConstants;
public class DummyDialog extends JDialog {
DummyDialog() {
this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent arg0) {
System.out.println("Window closing");
}
});
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
DummyDialog d = new DummyDialog();
d.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
答案 1 :(得分:1)
默认情况下,Swing将使用您运行的操作系统的小部件,因此您无法访问该按钮,因为它不是Swing组件。
如果您想使用Swing LAF,则可以访问关闭按钮并将ActionListener添加到按钮。代码是:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DialogCloseAction
{
private static void createAndShowGUI()
{
JDialog.setDefaultLookAndFeelDecorated(true);
JDialog dialog = new JDialog();
dialog.setDefaultCloseOperation( JDialog.DISPOSE_ON_CLOSE );
dialog.setSize(200, 200);
dialog.setLocationRelativeTo(null);
dialog.setVisible( true );
Action close = new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
System.out.println("closing...");
}
};
JButton button = SwingUtils.getDescendantOfType(
JButton.class, dialog.getRootPane(), "Icon", UIManager.getIcon("InternalFrame.closeIcon"));
button.addActionListener( close );
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
}
}
您需要使用Darryl的Swing Utils类来搜索自定义按钮的框架。
否则,正如已经建议的那样,您需要使用WindowListener
。如果您愿意,可以查看Closing an Application,其中包含一个简单的API,可让您将操作添加到自定义CloseListener
。