Как лучше всего позиционировать Swing GUIs?



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



JFrame frame = new JFrame("Foo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new HexagonGrid());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);


но у Эндрю Томпсона было другое мнение, чтобы вместо этого позвонить



frame.pack();
frame.setLocationByPlatform(true);


и пытливые умы хотят знать, почему?

529   2  

2 ответов:

на мой взгляд, графический интерфейс в середине экрана выглядит так.. "заставку иш". Я все жду, когда они исчезнут и реальные GUI, чтобы появиться!

С Java 1.5 у нас был доступ к Window.setLocationByPlatform(boolean). который..

задает, должно ли это окно отображаться в местоположении по умолчанию для собственной оконной системы или в текущем местоположении (возвращенном getLocation) при следующем отображении окна. Это поведение напоминает собственное окно отображается без программной установки его местоположения. большинство оконных систем каскадируют окна, если их расположение явно не задано. фактическое местоположение определяется после отображения окна на экране.

посмотрите на эффект этого примера, который помещает 3 графических интерфейса в позиции по умолчанию, выбранные ОС-на Windows 7, Linux с Gnome & Mac OS X.

Stacked windows on Windows 7enter image description hereStacked windows on Mac OS X

(3 лота) 3 ГИС аккуратно сложены. Это представляет собой "путь наименьшего удивления" для конечного пользователя, поскольку именно так ОС может позиционировать 3 экземпляра обычного текстового редактора по умолчанию (или что-то еще, если на то пошло). Моя благодарность trashgod для Linux & Mac. изображения.

вот простой код:

import javax.swing.*;

class WhereToPutTheGui {

    public static void initGui() {
        for (int ii=1; ii<4; ii++) {
            JFrame f = new JFrame("Frame " + ii);
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            String s =
                "os.name: " + System.getProperty("os.name") +
                "\nos.version: " + System.getProperty("os.version");
            f.add(new JTextArea(s,3,28));  // suggest a size
            f.pack();
            // Let the OS handle the positioning!
            f.setLocationByPlatform(true);
            f.setVisible(true);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater( new Runnable() {
            public void run() {
                try {
                    UIManager.setLookAndFeel(
                        UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {}
                initGui();
            }
        });
    }
}

я полностью согласен с этим setLocationByPlatform(true) Это самый хороший способ указать позицию нового JFrame, но на настройка двух мониторов вы можете попасть в проблемы. В моем случае дочерний JFrame порождается на "другом" мониторе. Пример: у меня есть мой основной графический интерфейс на экране 2, я начинаю новый JFrame с setLocationByPlatform(true) и он открывается на экране 1. Так вот более полное решение, я думаю:

        ...
        // Let the OS try to handle the positioning!
        f.setLocationByPlatform(true);
        if( !f.getBounds().intersects(MyApp.getMainFrame().getBounds()) ) {

          // non-cascading, but centered on the Main GUI
          f.setLocationRelativeTo(MyApp.getMainFrame()); 
        }
        f.setVisible(true);

Comments

    Ничего не найдено.