如何从另一个类执行类的方法?

时间:2013-11-13 16:06:58

标签: java swing user-interface

我是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应用程序属性,然后调用new   应用程序的启动方法。通常调用启动方法   来自应用程序的主要内容。 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 abstact类中定义)。以下是此方法的文档:shutdown doc

阅读文档:

  

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

当用户点击JButton类中声明的MainFrame时,我希望shutdown()方法(声明为GUI类)被执行。

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

谢谢

安德烈

1 个答案:

答案 0 :(得分:1)

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

类似的东西:

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