Salvare posizione e dimensione di un JFrame in Java

Salvare posizione e dimensione di un JFrame in Java

Ebbene, le vacanze sono finite cry!

Ricominciamo con un argomento easy.

Vogliamo salvare dimensione e posizione di un JFrame quando viene chiuso, in modo che, alla riapertura, abbia dimensione e posizione precedenti.

Salveremo tutto in un file di properties.

Cominciamo proprio dalla classe che si occupa di manipolare questo file;

public class ConfigurationProperties {

    public static synchronized HashMap<String, String> getProperties(String file) throws IOException, URISyntaxException {
        File fileProperties = new File(file);
        HashMap<String, String> map = new HashMap<>();
        Properties props = new Properties();
        props.load(new FileInputStream(fileProperties));
        props.stringPropertyNames().stream().forEach((name) -> {
            map.put(name, props.getProperty(name));
        });
        return map;
    }

    public static synchronized void setProperties(String key, String value, String file) throws IOException, URISyntaxException {
        File fileProperties = new File(file);
        Properties properties = new Properties();
        properties.load(new FileInputStream(fileProperties));
        properties.setProperty(key, value);
        properties.store(new FileOutputStream(fileProperties, false), null);
    }
}

Un metodo per leggere e uno per scivere; verranno richiamati rispettivamente in apertura e chiusura di finestra.

Poi abbiamo il JFrame, del quale vi posto solo il codice per effettuare queste operazioni; non ci sono componenti:

public class WindowTree extends JFrame {

    private final File fileConfig;
    private final String config = System.getProperty("user.home") + "/config.properties";
    private int w = 0;
    private int h = 0;
    private int x = 0;
    private int y = 0;

    public WindowTree() {
        super("Lista directory");
        fileConfig = new File(config);
        checkFileConfig();
        createGui();
        createEvents();
    }

    private void createGui() {
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        if (w != 0) {
            setPreferredSize(new Dimension(w, h));
        }
        setResizable(true);
        pack();
        if (x != 0) {
            setLocation(x, y);
        } else {
            setLocationRelativeTo(null);
        }
    }

    private void checkFileConfig() {
        try {
            if (fileConfig.exists()) {
                HashMap<String, String> map = ConfigurationProperties.getProperties(config);
                w = Integer.parseInt(map.get("w"));
                h = Integer.parseInt(map.get("h"));
                x = Integer.parseInt(map.get("x"));
                y = Integer.parseInt(map.get("y"));
            } else {
                fileConfig.createNewFile();
            }
        } catch (IOException | URISyntaxException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
    }

    private void createEvents() {
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosed(WindowEvent e) {
                setConfig();
            }
        });
    }

    private void setConfig() {
        try {
            ConfigurationProperties.setProperties("w", String.valueOf(getWidth()), config);
            ConfigurationProperties.setProperties("h", String.valueOf(getHeight()), config);
            ConfigurationProperties.setProperties("x", String.valueOf(getX()), config);
            ConfigurationProperties.setProperties("y", String.valueOf(getY()), config);
        } catch (IOException | URISyntaxException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
    }

    public static void main(String args[]) {
        if (System.getProperty("os.name").toLowerCase().contains("mac")) {
            System.setProperty("apple.laf.useScreenMenuBar", "true");
        } else {
            try {
                for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                    if ("Nimbus".equals(info.getName())) {
                        UIManager.setLookAndFeel(info.getClassName());
                        break;
                    }
                }
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                JOptionPane.showMessageDialog(null, ex.getMessage());
            }
        }

        SwingUtilities.invokeLater(() -> {
            new WindowTree().setVisible(true);
        });
    }
}

Nel costruttore andiamo a leggere il file di configurazione.

In chiusura andiamo a scrivere posizione e dimensione.

Enjoy!