我是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
类)被执行。
您是否有实施此行为的解决方案?
谢谢
安德烈
答案 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);
}