Лучшая практика настройки местоположений JFrame
У меня есть (несколько философский) вопрос относительно Swing, или для программирования GUI в целом. Известны ли наилучшие практики в отношении того, где найти экземпляры JFrame
используемые в приложении?
- Где должна располагаться первая и основная рама? Всегда в центре (
setLocationRelativeTo(null)
)? - Где должен находиться ребенок
JFrame
? Относительно его родительскогоJFrame
, в центре экрана, где бы мы ни хотели?
Я всегда предполагал, что в этом есть несколько лучших практик, вроде «GUI-библии», я ошибаюсь и должен ли я (вздохнуть) произвольно решить, что делать?
- Внедрение средства просмотра журналов с помощью WPF
- Выбор нескольких строк в JTable
- Как выполнять навигацию по страницам для многих, многих страниц? Логарифмическая навигация по страницам
- Как подключить одну панель к другой
- JavaFx tableview sort действительно медленный, как улучшить скорость сортировки, как в java swing
- Эффект JavaFX на фоне
- Отправка сообщений между двумя объектами JPanel
- Добавление JPanels от других classов к cardLayout
- ProgressBar в Javafx не обновляется в блоке onAction
- Qt сигнализирует по streamам, один - stream GUI?
- Предоставление имени JMenuItem его ActionListener
- Чтение из текстового поля в другом приложении
- Как получить экземпляр fragmentа из FragmentActivity?
Вот пример, который включает в себя советы:
-
Hovercraft Full Of Eels – установить местоположение по платформе .
- Aardvocate Akintayo Olu – сериализуйте местоположение.
Но добавляет 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); } }
Я обычно позволяю платформе решать, позвонив:
myJFrame.setLocationByPlatform(true);
Это позволяет окну «отображаться по умолчанию для собственной системы окон». Дополнительные сведения об этом: API windows
То, что я всегда делаю, начинается в центре экрана для основного кадра или в центре родителя для дочерних кадров, я записываю это местоположение. Затем, когда пользователи перемещают кадры туда, где они хотят, я записываю новое местоположение, и когда следующее приложение запускается, я использую последнее место для размещения фрейма.
Не уверен, есть ли передовая практика, поскольку она очень субъективна.
Устанавливая его в центре и позволяя пользователям изменять его в том месте, которое им нравится, кажется идеальным.
Что касается детского кадра, в зависимости от его размера, в центре родительского кадра или просто что-то легкого в использовании.