[英]Reconstruct JFrame after using dispose by static method in nested static class
我有一个公共类AppHelper,用于使用jframe显示一些帮助内容。 在同一个JFrame上有一个退出按钮,点击它可以处理jframe。 ActionListener实现为上面提到的类的静态嵌套类。
此外,帮助窗口的所有组件都在外部类中定义,并且所有组件都是私有和静态的。 显示帮助窗口的方法也是静态的。
这是我实现的一些代码:
public class AppHelper {
// helper frame
private static JFrame appHelperFrame;
// helper panel
private static JPanel appHelperPanel;
// helper pane
private static JEditorPane appHelperPane;
// exit helper button
private static JButton exitAppHelperButton;
// constraints
private static GridBagConstraints appHelperPaneCons, exitAppHelperButtonCons;
/**
set layout
*/
private static void setLayoutConstraints () {
// defines layout
}
/**
* initialize the helper elements
* @param void
* @return void
*/
public static void initializeElements () {
// initialize constraints
setLayoutConstraints();
// handler
AppHelper.AppHelperHandler appHelpHandler = new AppHelper.AppHelperHandler();
appHelperFrame = new JFrame("App Help");
appHelperPanel = new JPanel();
appHelperPanel.setLayout(new GridBagLayout());
appHelperPane = new JEditorPane();
exitAppHelperButton = new JButton("Exit");
exitAppHelperButton.addActionListener(appHelpHandler);
java.net.URL helpURL = null;
try {
helpURL = new File("AppHelp.html").toURI().toURL();
} catch (MalformedURLException ex) {
Logger.getLogger(AppHelper.class.getName()).log(Level.SEVERE, null, ex);
}
try {
appHelperPane.setPage(helpURL);
} catch (IOException ex) {
Logger.getLogger(AppHelper.class.getName()).log(Level.SEVERE, null, ex);
}
appHelperPane.setEditable(false);
appHelperFrame.add(appHelperPanel);
appHelperPanel.add(appHelperPane, appHelperPaneCons);
appHelperPanel.add(exitAppHelperButton, exitAppHelperButtonCons);
appHelperFrame.setSize(350, 400);
appHelperFrame.setResizable(false);
appHelperFrame.setVisible(true);
}
/**
* TODO
*/
public static void showAboutApp() {
//throw new UnsupportedOperationException("Not yet implemented");
}
/**
*
* Acts as the handler for the help window components
* Implement actionListener interface.
*/
private static class AppHelperHandler implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if(source == exitAppHelperButton) {
appHelperFrame.dispose();
}
}
}
}
处理JFrame而不是将其设置为不可见的原因是,当不使用此JFrame时,我不希望此JFrame占用内存。
现在问题是我第一次点击帮助按钮(在其他窗口上),显示JFrame。 现在,当我单击此帮助窗口上的退出按钮时,处理程序将处理JFrame。 下次我再次单击帮助按钮时,不会显示帮助窗口。 我想知道我的代码中是否有任何错误,或者我需要做其他事情。
Window.dispose()的javadoc说明了这一点
通过随后调用pack或show重建本机资源,可以再次显示Window及其子组件。
这也有效,我已经尝试过了。 只需调用appHelperFrame.setVisible(true)
可以了。 如果窗口未激活,请尝试调用appHelperFrame.setState(Frame.NORMAL)
来激活它。
您只需要调用一次initializeElements
方法。 您的showAboutApp()
方法应如下所示:
public static void showAboutApp() {
if (appHelperFrame == null)
initializeElements(); // This also makes the frame visible
else {
appHelperFrame.setVisible(true);
appHelperFrame.setState(Frame.NORMAL);
}
}
最后的说明:
如果你总是从EDT(事件调度线程)调用这个showAboutApp()
)那么你就是好的。 如果从多个线程调用它,您可能希望在EDT中使用类似SwingUtilities.invokeAndwait()
或SwingUtilities.invokeLater()
执行它,这也可以确保多个线程之间的同步。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.