0

我是 Java Swing开发的新手,我有以下问题。

我正在开发一个使用 Swing JDesktop框架的应用程序。

所以我有以下两个课程:

1)GUI.java

package com.test.login2;

import org.jdesktop.application.SingleFrameApplication;


public class GUI extends SingleFrameApplication {

    // Estensione di JFrame:
    private MainFrame mainFrame = null;

    @Override
    protected void startup() {
        System.out.println("GUI ---> startUp()");
        mainFrame = new MainFrame();
        mainFrame.setVisible(true);

    }

    // Save session state for the component hierarchy rooted by the mainFrame:
    @Override
    protected void shutdown() {
        System.out.println("ShutDown event intercepted by the GUI ---> sutdown() method");

    }

    public static void main(String[] args) {

        System.out.println("GUI ---> main()");

        /* Creates an instance of the specified Application subclass (SingleFrameApplication), 
         * sets the ApplicationContext application property, and then calls the new Application's startup method. 
         */
        launch(GUI.class, args);

    }

}

正如你在这个类中看到的,有一个简单地执行这个操作的main()方法:

launch(GUI.class, args);

阅读官方文档:launch() doc

创建指定 Application 子类的实例,设置 ApplicationContext 应用程序属性,然后调用新 Application 的启动方法。启动方法通常从应用程序的 main 调用。applicationClass 构造函数和启动方法在事件调度线程上运行。

所以startup()方法被执行并创建并显示一个新的MainFrame对象

2)所以这是MainFrame代码(它只是扩展了经典的 Swing JFrame):

package com.test.login2;

import java.awt.Dimension;
import java.awt.Window;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import com.test.login.LoginFrame;

import net.miginfocom.swing.MigLayout;


public class MainFrame extends JFrame {

    private static final int FIXED_WIDTH = 1000;
    private static final Dimension INITAL_SIZE = new Dimension(FIXED_WIDTH, 620);

    private final Action actionLogOut = new AbstractAction() {
        {
            putValue(Action.NAME, ("LogOut"));
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            System.out.println("MainWindows ---> actionPerformed()");
            JButton button = (JButton)e.getSource();
            Window window = SwingUtilities.windowForComponent(button);
            //window.setVisible(false); 
            //window.dispose();

        }
    };

    public MainFrame() {
        super();

        setPreferredSize(INITAL_SIZE);
        setResizable(false);

        setTitle("My Application");
        setLayout(new MigLayout("fill"));

        add(new JButton(actionLogOut));     // Add the LogOut JButton to the current MainFrame object

        pack();
        setLocationRelativeTo(null);        // Center the window

    }


}

在这个阶段,JButton和相关侦听器的存在并不是很重要。

我的问题是以下一个:

正如您在 GUI.java 中看到的,定义了一个shutdown()方法(在SingleFrameApplication抽象类中定义)。

shutdown() 方法文档

阅读文档:

保存以 mainFrame 为根的组件层次结构的会话状态。

所以GUI.java类的 main() 方法执行创建和显示MainFrame对象的startup()方法的操作(直到这里很清楚)

然后我希望当我单击 X 按钮(关闭 JFrame 的按钮)时,将执行( GUI.java类的) shutdown()方法。我无法拦截此事件,这对我来说是个大问题

有人可以帮助我吗?

肿瘤坏死因子

安德烈亚

4

1 回答 1

0

我使用类似这样的窗口监听器。您可以在 MainFrame 类的构造函数中使用它

addWindowListener(new WindowAdapter() {

        @Override
        public void windowClosing(WindowEvent e) {
            //do all your saving
            System.exit(0);
        }
    });

请注意 System.exit(0); 命令将关闭您的整个应用程序。因此,在您只想关闭 jframe 而不是关闭整个应用程序的情况下,不应使用此确切代码。

于 2013-11-13T14:12:09.623 回答