0

我是 Java Swing 开发的新手,遇到以下问题:

我有这个GUI包含main()方法的类:

package com.test.login3;

import org.jdesktop.application.SingleFrameApplication;


public class GUI extends SingleFrameApplication {

    public static void main(String[] args) {
        launch(GUI.class, args);
    }

    @Override
    protected void startup() {
        // TODO Auto-generated method stub
        System.out.println("GUIBis ---> startUp()");
        MainFrame mainFrame = new MainFrame();
        mainFrame.setVisible(true);

    }

    @Override
    protected void shutdown() {
        System.out.println("Entered into GUI ---> shutdown()"); 
    }

}

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

launch(GUI.class, args);

阅读官方文档:launch doc

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

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

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

package com.test.login3;

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

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);

    public MainFrame() {
        super();

        setPreferredSize(INITAL_SIZE);
        setResizable(false);

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

        JButton logOutButton = new JButton("LogOut");

        logOutButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e)
            {
                // Execute when button is pressed:
                System.out.println("You clicked the button");

            }
        });   

        add(logOutButton);

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

    }


}

我的问题是这样的:

正如您在GUI.java类中看到的那样,定义了一个shutdown()方法(在SingleFrameApplication抽象类中定义)。这是此方法的文档:shutdown doc

阅读文档:

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

当用户单击在类JButton中声明的那个MainFrame时,我希望执行该shutdown()方法(在GUI类中声明)。

您是否有实现此行为的解决方案?

谢谢

安德烈亚

4

1 回答 1

2

您可以使用 PropertyChanges。让 GUI 实现 PropertyChangeListener。然后让 MainFrame 在单击按钮时触发属性更改。在 GUI 中,会捕获此属性更改并执行关闭命令。有关更多信息,请参阅此示例

就像是:

在类 GUI 中:

public class GUI extends SingleFrameApplication implements PropertyChangeListener {

...

MainFrame mainFrame = new MainFrame();
mainFrame.addPropertyChangeListener(this);

...

@Override
public void propertyChange(PropertyChangeEvent arg0) {
    if (arg0.getPropertyName().equals("buttonClicked")) {
        shutdown();
    }
}

然后在 MainFrame

       public void actionPerformed(ActionEvent e)
        {
            // Execute when button is pressed:
            System.out.println("You clicked the button");
            firePropertyChange("buttonClicked", false, true);
        }
于 2013-11-13T16:10:32.827 回答