ventana tamaño sirve setsize setpreferredsize redimensionar que para evento ejemplos ejemplo como cambiar boton java windows swing aero absolutelayout

tamaño - swing java ejemplos



borde de ventana no redimensionable y posicionamiento (2)

¿Cuáles son los problemas con los límites de configuración en contenedores no redimensionables?

Supongamos que ajusta los límites para verse bien en su plataforma. Supongamos que la plataforma del usuario tiene una fuente con FontMetrics diferente, por ejemplo más grande. Este ejemplo es un tanto artificial, pero entiendes la idea. Si cambia los límites de un contenedor no redimensionable, asegúrese de que cualquier texto esté visible independientemente de la fuente predeterminada de la plataforma del host.

import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; /** * @see http://stackoverflow.com/a/12532237/230513 */ public class Evil extends JPanel { private static final String s = "Tomorrow''s winning lottery numbers: 42, "; private JLabel label = new JLabel(s + "3, 1, 4, 1, 5, 9", JLabel.LEFT); public Evil() { this.add(label); } private void display() { JFrame f = new JFrame("Evil"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(this, BorderLayout.WEST); f.pack(); int w = SwingUtilities.computeStringWidth( label.getFontMetrics(label.getFont()), s); int h = f.getHeight(); f.setSize(w, h); f.setResizable(false); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new Evil().display(); } }); } }

Si creo JFrames no modificables, y Windows Aero está habilitado, setLocation no parece tener en cuenta el borde de la ventana correctamente.

En el siguiente código, esperaría que el segundo fotograma se coloque a la derecha del primer fotograma, en cambio, los bordes se superponen. Si Aero está desactivado o si setResizable las llamadas a setResizable esto se hace como se esperaba.

import java.awt.Rectangle; import javax.swing.JFrame; public class FrameBorders { public static void main(String[] args) { JFrame frame1 = new JFrame("frame 1"); JFrame frame2 = new JFrame("frame 2"); frame1.setResizable(false); frame2.setResizable(false); frame1.setVisible(true); Rectangle bounds = frame1.getBounds(); frame2.setLocation(bounds.x+bounds.width, bounds.y); frame2.setVisible(true); } }

¿Estoy haciendo algo mal o es esto un error? ¿Cómo puedo mostrar dos cuadros de diálogo no ajustables uno al lado del otro sin tener bordes superpuestos?

Editar: capturas de pantalla agregadas (también cambió frame2 a un JDialog en lugar de un JFrame)

Aero encendido:

Aero Off:

Aero encendido pero redimensionable:


Parece que esto no es un problema de Java, sino más bien un problema de aplicación aérea, como se describe aquí .

Una solución que veo en Java es permitir que las ventanas sean redimensionables y luego trabajar alrededor del error setMaximumSize