Enregistrer l'emplacement JFrame dans un environnement multi-affichages
Question
Je veux stocker l'emplacement d'un JFrame (bounds, extendedState) lorsque l'utilisateur le ferme. Cependant, lorsque l'utilisateur déplace le cadre sur le deuxième écran et le maximise, comment puis-je stocker ces informations? Mon implémentation naïve (et affichage unique) est la suivante:
void saveFrame(JFrame frame) throws IOException {
Properties props = new Properties();
props.setProperty("State", String.valueOf(frame.getExtendedState()));
props.setProperty("X", String.valueOf(frame.getX()));
props.setProperty("Y", String.valueOf(frame.getY()));
props.setProperty("W", String.valueOf(frame.getWidth()));
props.setProperty("H", String.valueOf(frame.getHeight()));
props.storeToXML(new FileOutputStream("config.xml"), null);
}
void loadFrame(JFrame frame) throws IOException {
Properties props = new Properties();
props.loadFromXML(new FileInputStream("config.xml"));
int extendedState = Integer.parseInt(props.getProperty("State", String.valueOf(frame.getExtendedState())));
if (extendedState != JFrame.MAXIMIZED_BOTH) {
frame.setBounds(
Integer.parseInt(props.getProperty("X", String.valueOf(frame.getX()))),
Integer.parseInt(props.getProperty("Y", String.valueOf(frame.getY()))),
Integer.parseInt(props.getProperty("W", String.valueOf(frame.getWidth()))),
Integer.parseInt(props.getProperty("H", String.valueOf(frame.getHeight())))
);
} else {
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
}
}
Comment savoir sur quel écran se trouve le cadre? Comment puis-je déplacer un cadre vers le deuxième écran et l’agrandir?
La solution
Pour trouver l'ID du périphérique graphique utilisé:
frame.getGraphicsConfiguration().getDevice().getIDString()
Inversement, vous pouvez trouver les périphériques graphiques avec:
GraphicsEnvironment.getLocalGraphicsEnvironment().getDevices()
Vous pouvez ensuite utiliser une configuration du périphérique dans le constructeur JFrame
. Je ne crois pas que vous puissiez le définir après la construction.
Bien sûr, vous devez faire attention à ne pas, par exemple, ouvrir le cadre hors écran car la résolution a changé.