La mejor práctica para establecer ubicaciones de JFrame

Tengo una pregunta (algo filosófica) relativa a Swing, o a la progtwigción de GUI en general. ¿Existen mejores prácticas reconocidas sobre dónde ubicar las instancias de JFrame utilizadas en la aplicación?

  1. ¿Dónde deberían ubicarse el primer y principal marco? Siempre en el centro ( setLocationRelativeTo(null) )?
  2. ¿Dónde debería ubicarse un niño JFrame ? ¿Relativamente a su JFrame padre, en el centro de la pantalla, donde sea que queramos?

Siempre he supuesto que hubo algunas mejores prácticas, una especie de “GUI biblia” al respecto, ¿me equivoco y debería (jadear) decidir arbitrariamente qué hacer?

Aquí hay un ejemplo que incorpora el consejo de:

  1. Hovercraft Full Of Eels: establece la ubicación por plataforma .

  2. Aardvocate Akintayo Olu: serialice la ubicación.

Pero continúa para agregar 2 ajustes:

  1. Serializar el ancho / alto también.
  2. Si el marco se maximiza en el momento del cierre, se restaura antes de obtener los límites. (Detesto las aplicaciones que serializan las opciones pero no las tienen en cuenta. El usuario está sentado allí haciendo clic en el botón “Maximizar / Restaurar” y preguntándose por qué no está pasando nada ).

¡Los 4 puntos combinados ofrecen la mejor experiencia de usuario!

 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(); // restre 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 restreOptions(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 { restreOptions(f); } catch(IOException ioe) { ioe.printStackTrace(); } } else { f.setLocationByPlatform(true); } f.setVisible(true); } } 

Por lo general, dejo que la plataforma decida llamando:

 myJFrame.setLocationByPlatform(true); 

Esto permite que la ventana “aparezca en la ubicación predeterminada para el sistema de ventanas nativo”. Para más sobre esto: Window API

Lo que siempre hago es comenzar en el centro de la pantalla para el cuadro principal, o en el centro de un elemento primario para cuadros secundarios, grabo esta ubicación. Luego, a medida que los usuarios mueven los fotogtwigs a donde quieran, grabo la nueva ubicación y cuando comienza la aplicación, utilizo la última ubicación para ubicar el fotogtwig.

No estoy seguro si hay una mejor práctica ya que es muy subjetiva.

Establecerlo en el centro y permitir a los usuarios cambiarlo a la ubicación que les gusta parece ser el ideal.

En lo que respecta al marco del niño, dependiendo de su tamaño, en el centro del marco principal, o simplemente algo fácil de usar.