Как лучше всего настроить Swing GUI?

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

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); 

и вопрошающие умы хотят знать, почему?

На мой взгляд, графический интерфейс в середине экрана выглядит так … «splash-screen’ish». Я продолжаю ждать, пока они исчезнут, и появится реальный GUI!

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

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

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

Сложенные окна на Windows 7введите описание изображения здесьСложенные окна в Mac OS X

(3 лота) 3 GUIs аккуратно сложены. Это представляет собой «путь наименьшего удивления» для конечного пользователя, так как OS может размещать 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)setLocationByPlatform(true) способ указать новую позицию JFrame, но при настройке с двумя мониторами вы можете столкнуться с проблемами. В моем случае ребенок JFrame появляется на «другом» мониторе. Пример: у меня есть мой основной графический интерфейс на экране 2, я начинаю новый setLocationByPlatform(true) с 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); 
  • Почему большинство пользовательских интерфейсов однопоточных?
  • Выбор нескольких строк в JTable
  • Как получить центр большого пальца изображения UISlider
  • Как установить размер изображения с помощью RescaleOp
  • как выйти из блокировки XNextEvent xlib
  • Простая всплывающая форма java с по меньшей мере двумя полями
  • Использование нескольких JFrames: хорошая или плохая практика?
  • Пользовательская строка заголовка без дополнения (Android)
  • Как настроить панель выполнения на Android
  • Измените сторону, которую текст появится на переключателе
  • Как реализовать воздушное сообщение в приложении WPF
  • Interesting Posts

    Возможно ли открыть несколько веб-страниц при запуске браузера?

    Что такое бит-маска?

    Lenovo T400 – большой объем памяти, зарезервированный для аппаратного обеспечения

    Многоуровневые таблицы (внутри другого при нажатии)

    Что означает смывание буфера?

    Игнорировать пространства имен в LINQ to XML

    Возможно ли создать клиент REST с помощью Flex?

    Программно подключаться к сопряженному устройству Bluetooth

    Удаление водяного знака из PDF iTextSharp

    При воспроизведении DVD-дисков с мультимедийным проигрывателем VLC, как видео, так и аудио пауза несколько раз в секунду

    Как отправить данные из одного fragmentа в другой fragment?

    ASP.NET WebApi: как выполнить многостраничную запись с загрузкой файла с помощью WebApi HttpClient

    Настройки кодировки FFmpeg x264

    Серийный цикл ActiveRecord с использованием JSON вместо YAML

    Почему есть чипы RAM с шинной скоростью 1600 МГц, поскольку нет процессоров, поддерживающих более 1333?

    Давайте будем гением компьютера.