2012-09-21 23 views
6

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

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 elimino las llamadas al 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?

Edit: añadido imágenes (también cambiaron Frame2 a un JDialog en lugar de un JFrame)

Aero En: Aero On

Aero Off: Aero Off

Aero En pero de tamaño variable: Aero On but resizable

+0

¿Por qué desea mostrar 2 laterales diálogos unresizable al lado del otro sin tener fronteras se superponen? –

+0

Quiero mostrar 2 ventanas que inicialmente se encuentran una al lado de la otra – msam

+2

No establezca límites arbitrarios en un contenedor que no se puede cambiar de tamaño. Ver [* El uso de múltiples JFrames, Buena/Mala práctica *] (http://stackoverflow.com/a/9554657/230513)? – trashgod

Respuesta

7

¿Cuáles son los problemas con límites de puntos 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 diferente, por ejemplo, más grande, FontMetrics. 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.

image

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(); 
      } 
     }); 
    } 
} 
+1

¡Podrías haber sido rico! – trashgod

+0

Este es un buen punto en lo que respecta al cambio de tamaño (y sería una buena respuesta a la pregunta que hice en los comentarios si se toma solo), sin embargo, mi problema original es el posicionamiento. Supongamos que el uso de pack()/no text/size no cambiará o incluso cuadros de diálogo/cuadros vacíos como en mi propio ejemplo artificial. – msam

+1

Pruebe 'pack()', que "hace que esta' Ventana' se dimensione para ajustarse al tamaño y diseños preferidos de sus subcomponentes. " Lo siento, no uso aerodinámica; Un [sscce] (http://sscce.org/) que muestra el problema que describes puede ser útil. – trashgod

5

Parece que esto no es un problema de Java sino más bien una cuestión de aerodinámica appcompat, tal como se describe here.

Una solución que veo en Java es dejar que las ventanas sean de tamaño variable a continuación, trabajan alrededor de la setMaximumSize bug

+0

+1 buen hallazgo ... –

+0

Buen enlace; la plataforma posee las decoraciones del marco, por lo que el resultado no es completamente escandaloso; 'aqua' tiene su parte de anomalías similares. – trashgod

Cuestiones relacionadas