Подтвердить что ты не робот

Лучшая практика настройки местоположений JFrame

У меня есть (несколько философский) вопрос относительно Swing, или для программирования GUI в целом. Известны ли наилучшие методы определения местонахождения экземпляров JFrame, используемых в приложении?

  • Где должен располагаться первый и основной фрейм? Всегда в центре (setLocationRelativeTo(null))?
  • Где должен находиться ребенок JFrame? Относительно своего родителя JFrame, в центре экрана, где бы мы ни хотели?

Я всегда предполагал, что есть некоторые лучшие практики, вроде "GUI-библии" об этом, я ошибаюсь и должен ли я (вздохнуть) произвольно решить, что делать?

4b9b3361

Ответ 1

Вот пример, который включает в себя советы:

Но продолжаем добавлять 2 твики:

  • Сериализуйте ширину и высоту.
  • Если кадр максимизируется во время закрытия, он восстанавливается до получения границ. (Я ненавижу приложения, которые сериализуют параметры, но не учитывают это. Пользователь сидит там, нажав кнопку "Максимизировать/Восстановить" и задаваясь вопросом, почему ничего не происходит!)

Комбинированные 4 балла предлагают лучший пользовательский интерфейс!

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Properties;
import java.io.*;

class RestoreMe {

    /** This will end up in the current directory
    A more sensible location is a sub-directory of user.home.
    (left as an exercise for the reader) */
    public static final String fileName = "options.prop";

    /** Store location & size of UI */
    public static void storeOptions(Frame f) throws Exception {
        File file = new File(fileName);
        Properties p = new Properties();
        // restore the frame from 'full screen' first!
        f.setExtendedState(Frame.NORMAL);
        Rectangle r = f.getBounds();
        int x = (int)r.getX();
        int y = (int)r.getY();
        int w = (int)r.getWidth();
        int h = (int)r.getHeight();

        p.setProperty("x", "" + x);
        p.setProperty("y", "" + y);
        p.setProperty("w", "" + w);
        p.setProperty("h", "" + h);

        BufferedWriter br = new BufferedWriter(new FileWriter(file));
        p.store(br, "Properties of the user frame");
    }

    /** Restore location & size of UI */
    public static void restoreOptions(Frame f) throws IOException {
        File file = new File(fileName);
        Properties p = new Properties();
        BufferedReader br = new BufferedReader(new FileReader(file));
        p.load(br);

        int x = Integer.parseInt(p.getProperty("x"));
        int y = Integer.parseInt(p.getProperty("y"));
        int w = Integer.parseInt(p.getProperty("w"));
        int h = Integer.parseInt(p.getProperty("h"));

        Rectangle r = new Rectangle(x,y,w,h);

        f.setBounds(r);
    }

    public static void main(String[] args) {
        final JFrame f = new JFrame("Good Location & Size");
        f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        f.addWindowListener( new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                try {
                    storeOptions(f);
                } catch(Exception e) {
                    e.printStackTrace();
                }
                System.exit(0);
            }
        });
        JTextArea ta = new JTextArea(20,50);
        f.add(ta);
        f.pack();

        File optionsFile = new File(fileName);
        if (optionsFile.exists()) {
            try {
                restoreOptions(f);
            } catch(IOException ioe) {
                ioe.printStackTrace();
            }
        } else {
            f.setLocationByPlatform(true);
        }
        f.setVisible(true);
    }
}

Ответ 2

Я обычно позволяю платформе решать, вызывая:

myJFrame.setLocationByPlatform(true);

Это позволяет окну "отображаться в исходной папке по умолчанию для собственной системы окон". Подробнее об этом: API-интерфейс окна

Ответ 3

То, что я всегда делаю, начинается в центре экрана для основного фрейма или в центре родителя для дочерних кадров, я записываю это местоположение. Затем, когда пользователи перемещают кадры туда, где они хотят, я записываю новое местоположение, и когда следующее приложение запускается, я использую последнее место для размещения фрейма.

Ответ 4

Не уверен, есть ли передовая практика, поскольку она очень субъективна.

Установка его в центре и позволяющая пользователям изменять его в том месте, которое им нравится, кажется идеальным.

Что касается дочернего фрейма, в зависимости от его размера, в центре родительского фрейма или просто что-то легкого в использовании.