package com.revolsys.swing.component; import java.awt.Font; import java.awt.FontFormatException; import java.awt.GraphicsEnvironment; import java.awt.HeadlessException; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.io.IOException; import java.io.InputStream; import javax.swing.JFrame; import javax.swing.JMenuBar; import com.revolsys.logging.Logs; import com.revolsys.spring.resource.ClassPathResource; import com.revolsys.swing.WindowManager; import com.revolsys.swing.parallel.Invoke; public class BaseFrame extends JFrame implements WindowListener { private static final long serialVersionUID = 1L; static { try { final GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment(); final ClassPathResource resource = new ClassPathResource( "com/revolsys/fonts/fontawesome-webfont.ttf"); final InputStream inputStream = resource.newInputStream(); final Font font = Font.createFont(Font.TRUETYPE_FONT, inputStream); environment.registerFont(font); } catch (IOException | FontFormatException e) { } } public BaseFrame() throws HeadlessException { this(true); } public BaseFrame(final boolean iniaitlize) throws HeadlessException { if (iniaitlize) { initUi(); } } public BaseFrame(final String title) throws HeadlessException { this(title, true); } public BaseFrame(final String title, final boolean iniaitlize) throws HeadlessException { super(title); if (iniaitlize) { initUi(); } } protected void close() { setJMenuBar(null); removeWindowListener(this); WindowManager.removeWindow(this); } @Override public void dispose() { close(); try { super.dispose(); } catch (final IllegalStateException e) { Logs.debug(this, e); } } protected void initUi() { setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); addWindowListener(this); newMenuBar(); } protected JMenuBar newMenuBar() { final JMenuBar menuBar = new JMenuBar(); setJMenuBar(menuBar); WindowManager.addMenu(menuBar); return menuBar; } @Override public void setVisible(final boolean visible) { Invoke.later(() -> { if (visible) { WindowManager.addWindow(this); } else { WindowManager.removeWindow(this); } final boolean oldVisible = isVisible(); super.setVisible(visible); if (!visible && oldVisible) { close(); } }); } @Override public void windowActivated(final WindowEvent e) { } @Override public void windowClosed(final WindowEvent e) { dispose(); } @Override public void windowClosing(final WindowEvent e) { setVisible(false); } @Override public void windowDeactivated(final WindowEvent e) { } @Override public void windowDeiconified(final WindowEvent e) { } @Override public void windowIconified(final WindowEvent e) { } @Override public void windowOpened(final WindowEvent e) { } }