package dasherJava.gui;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
public class DefaultLocationJFrame extends JFrame {
//This class contains a workaround for an issue that is probably caused by a Java bug (tested on Manjaro Linux
//with XFCE desktop and Java 17.0.12+7): When using setLocationByPlatform(true) to make the frame appear in the
//center of the screen instead of the top left corner when it is opened for the first time, it is placed as
//expected, but the x and y fields of the frame stay at (0, 0), breaking placement of sub-dialogs and making
//global mouse input return incorrect results (because it believes that the frame is at (0, 0), while it actually
//is somewhere else). Fortunately, there is an easy workaround available: The location fields apparently get
//updated on every state change of the frame, so we initially minimize (iconify) it and then restore it to normal
//state when it is opened for the first time.
private boolean alreadyRestored = false;
public DefaultLocationJFrame(String title) {
super(title);
addWindowListener(new WindowAdapter() {
@Override
public void windowOpened(WindowEvent e) {
if (alreadyRestored) return; //already done, don't need to do this again when the
//frame is closed and re-opened
setExtendedState(JFrame.NORMAL);
alreadyRestored=true;
}
});
setLocationByPlatform(true);
setExtendedState(JFrame.ICONIFIED);
}
}