我是Swing开发中的新手,使用实现PropertyChangeListener接口的类遇到以下问题。
因此,我有以下GUI类(我仅在发布此类的有趣部分):
public class GUI extends SingleFrameApplication implements PropertyChangeListener {
private MainFrame mainFrame = null;
private static LoginFrame loginFrame;
@Override
protected void startup() {
boolean offLine = false;
showLoginFrame();
mainFrame = new MainFrame(settings, tasksSettings, logAppender);
if (OSUtils.isUbuntuPrecisePangolin() || OSUtils.isFedoraBeefyMiracle() || OSUtils.isFedoraSphericalCow()) {
File mountPointFolder = new File(System.getenv("HOME") + "/connect_drives");
if (!mountPointFolder.exists())
mountPointFolder.mkdir();
mainFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
mainFrame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
if (mainFrame.getState() == JFrame.ICONIFIED)
tryToExit();
else
mainFrame.setState(JFrame.ICONIFIED);
}
});
}
}
private void showLoginFrame() {
loginFrame = new LoginFrame();
loginFrame.setVisible(true);
loginFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Notify every change to every bound property for that object:
loginFrame.addPropertyChangeListener(this);
}
@Override
protected void shutdown() {
System.out.println("Entered into GUI ---> shutdown()");
logger.debug("Termino l'applicazione.");
ulogger.info(Constants.APP_TITLE + "|Arresto "+ Constants.APP_TITLE);
// FileUtils.saveGeneralLogFile(logAppender.getLogInFile());
logAppender.saveGeneralLogFile();
EventBusService.unsubscribe(this);
if (mainFrame != null)
mainFrame.setVisible(false);
}
public static void main(String[] args) {
launch(GUI.class, args);
}
@Override
public void propertyChange(PropertyChangeEvent arg0) {
System.out.println("GUI SingleFrameApplication ---> propertyChange(): " + arg0.getPropertyName());
if (arg0.getPropertyName().equals("buttonLogOffClicked")) {
//System.out.println("GUI SingleFrameApplication ---> richiamo exit");
//exit();
mainFrame.OnWindowClose();
mainFrame.dispose();
mainFrame = null;
showLoginFrame();
}
if (arg0.getPropertyName().equals("loginResult")) {
System.out.println("GUI SingleFrameApplication ---> richiamo MainFrame");
//loginFrame.setVisible(false);
loginFrame.dispose();
loginFrame = null;
showMainFrame();
}
}
private void showMainFrame() {
mainFrame = new MainFrame(settings, tasksSettings, logAppender);
// I add a PropertyChangeListener to the created MainFrame object:
mainFrame.addPropertyChangeListener(this);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
WindowListener exitListener = new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.out.println("GUI SingleFrameApplication --> windowClosing");
shutdown();
// mainFrame.setVisible(false);
/*int confirm = JOptionPane.showOptionDialog(frame,
"Are You Sure to Close this Application?",
"Exit Confirmation", JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE, null, null, null);
if (confirm == JOptionPane.YES_OPTION) {
System.exit(1);
}*/
}
};
mainFrame.addWindowListener(exitListener);
mainFrame.setVisible(true);
}
然后,我有了MainFram类,该类扩展了JFrame,其中有一个JButton来执行注销操作,如下所示:
public class MainFrame extends JFrame {
private final Action actionLogOut = new AbstractAction() {
{
putValue(Action.NAME, _("log-out"));
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("logOutButton clicked !!!, firePropertyChange() will start");
// System.exit(0);
firePropertyChange("buttonLogOffClicked", false, true);
}
};
public MainFrame(Settings settings, TasksSettings tasksSettings, LogAppender logAppender) {
super();
......................
......................
......................
header.add(new JButton(actionLogOut));
......................
......................
......................
}
}
因此,当单击我的JButton时,将执行以下方法:
private final Action actionLogOut = new AbstractAction() {
{
putValue(Action.NAME, _("log-out"));
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("logOutButton clicked !!!, firePropertyChange() will start");
// System.exit(0);
firePropertyChange("buttonLogOffClicked", false, true);
}
};
当我单击控制台中的按钮时,实际上显示给我的输出是:
“单击logOutButton !!!,firePropertyChange()将启动”
然后执行firePropertyChange()方法,并希望此事件由GUI类的该方法处理:
@Override
public void propertyChange(PropertyChangeEvent arg0) {
System.out.println("GUI SingleFrameApplication ---> propertyChange(): " + arg0.getPropertyName());
if (arg0.getPropertyName().equals("buttonLogOffClicked")) {
//System.out.println("GUI SingleFrameApplication ---> richiamo exit");
//exit();
mainFrame.OnWindowClose();
mainFrame.dispose();
mainFrame = null;
showLoginFrame();
}
if (arg0.getPropertyName().equals("loginResult")) {
System.out.println("GUI SingleFrameApplication ---> richiamo MainFrame");
//loginFrame.setVisible(false);
loginFrame.dispose();
loginFrame = null;
showMainFrame();
}
}
但是不起作用,似乎没有输入firePropertyChange()方法?
为什么?我想念什么?
特纳克斯
安德里亚
最佳答案
当您从firePropertyChange
上下文调用MainFrame
时,它会触发MainFrame
,它实际上可以监听其属性更改事件。但是,您可以使用login frame
将侦听器添加到loginFrame.addPropertyChangeListener(this)
。如果更改事件是由自己的loginframe
函数触发的,则firePropertyChange
将监听更改。但是,您可以调用loginFrame.firePropertyChange("buttonLogOffClicked", false, true)
;从actionPerformed()
类的actionLogOut
操作的MainFrame
函数中获取。
编辑:
尝试将LoginFrame
的实例传递给已创建要使用的MainFrame
实例构造函数。
或者,在您的GUI类中声明一个名为static
的fireLogInPropEvent
函数。您将需要声明您的LoginFrame
实例为静态。然后在此函数内放loginFrame.firePropertyChange("buttonLogOffClicked", false, true)
来监听此属性。
public class GUI extends SingleFrameApplication implements PropertyChangeListener {
private MainFrame mainFrame = null;
private static LoginFrame loginFrame = new LoginFrame();
/// your other code
private void showLoginFrame() {
// loginFrame = new LoginFrame(); <------- already created hence commenting out
loginFrame.setVisible(true);
loginFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Notify every change to every bound property for that object:
loginFrame.addPropertyChangeListener(this);
}
public static void fireLogInPropEvent()
{
loginFrame.firePropertyChange("buttonLogOffClicked", false, true);
}
}