2012-03-02 25 views
8
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

class Demo 
{ 
    JFrame jf; 
    Demo() 
    { 
     jf=new JFrame("Demo"); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jf.setSize(5000,5000); 
     jf.setVisible(true); 
     System.out.println(jf.getSize()); 
    } 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 

      @Override 
      public void run() 
      { 
       new Demo(); 
      } 
     }); 
    } 
} 

utilizo para jf.setSize(5000, 5000) JFrame pero después de que los rendimientos getSize otro tamaño: java.awt.Dimension[width=1386,height=788] (mi resolución de pantalla es 1366x768) ¿Puedo configurar el tamaño de fotograma mayor que el tamaño de la pantalla? probablemente ese comportamiento se proporciona con algunas propiedades de marco pero no sé sobre ellas.setSize() no funciona para JFrame

+0

¿Cuál es el comportamiento previsto de una ventana más grande que la pantalla? – Thomas

+6

@Thomas - enfureciendo al usuario final, creo ... – mcfinnigan

+0

Este código solo funciona en mi máquina Linux – Robin

Respuesta

10

Intente utilizar setPreferredSize en lugar de setSize. Funciona en mi caso (Ubuntu 12.04 + GNOME 3).

+0

más corto, es decir, la mejor respuesta – jan

+0

esto lo resolvió. ¡Gracias! – anon58192932

3

probé unas cuantas combinaciones de llamadas, y la siguiente parecía funcionar:

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
jf.setPreferredSize(new Dimension(5000,5000)); 
jf.setMaximumSize(new Dimension(5000,5000)); 
jf.setMinimumSize(new Dimension(5000,5000)); 
jf.pack(); 
jf.setVisible(true); 

Todavía imprime un tamaño diferente, pero la ventana parece ser mucho mayor de lo que se imprime.

+0

En este caso, el tamaño se cambia después del primer movimiento de la ventana. Inicialmente, la ventana tiene el mismo tamaño. – eXXXXXXXXXXX2

+0

@eXXXXXXXXXXX Desafortunadamente eso fue lo mejor que pude hacer. Podría intentar agregar 'jf.setResizable (falso);'. – jjnguy

+0

configuración pref y min más minimizar el fotograma "trabajado" aquí - nada para producción, sin embargo, ya que es muy probable que dependa mucho del sistema operativo como se muestra en @Stephen C – kleopatra

7

el Javadoc dice esto:

"El método cambia los datos relacionados con la geometría-Por lo tanto, el sistema de ventanas nativo puede ignorar tales solicitudes, o puede modificar los datos solicitados, de modo que el objeto de ventana. se coloca y se dimensiona de una manera que se corresponde estrechamente con la configuración del escritorio ".

Esto cubre el comportamiento que está observando/quejándose.

No es claro como el cristal, pero una razón por la que Window.setSize(...) tiene este comportamiento es que los administradores de ventanas (fuera de Java) suelen vetar los intentos de aplicación para hacer esto. Presumiblemente, eso es porque está abierto al abuso y "no es lo que el usuario quiere". De todos modos, en última instancia, no es la llamada de su aplicación para anular las restricciones del administrador de la ventana.

4

Solo para la diversión del viernes (es decir, nada que deba considerar hacer en el entorno de producción :-) - jugando un poco más con el código @jinguy, noté que el tamaño más grande que la vida se usó después de minimizar el marco. Si lo hace, mediante programación dejar que aparezca como monstruo desde el principio

jf.setPreferredSize(new Dimension(5000,5000)); 
    jf.setMinimumSize(new Dimension(5000,5000)); 
    jf.pack(); 
    jf.setVisible(true); 
    jf.setState(Frame.ICONIFIED); 
    jf.setState(Frame.NORMAL); 
    System.out.println(jf.getSize()); 
1

Estas son mis observaciones (1,6 usados, ahora estoy usando 1.7 en XP):

se puede tener sin decorar marco de "casi" cualquier tamaño - uso una resolución de pantalla de 1280x1024 (rotada) y no noté ningún problema con el marco 1500x1500, aunque algunos cuadros 2000x2000 parecen incompletos (pero funcionan) y el marco de 4000x4000 muestra su pulgar en la barra de tareas, pero este pulgar es inactivo y el el propio cuadro no aparece. Creo que el mayor tamaño posible de JFrame no decorado depende de las capacidades del sistema, que depende del hardware gráfico.

Con marcos decorados hay una historia simple: pueden ser un poco más grandes que el tamaño de la pantalla (por unos pocos píxeles en general).

En mi solicitud con un tamaño determinado durante el tiempo de ejecución (por ejemplo juegos donde se define el tamaño del tablero de forma dinámica) utilizo el siguiente enfoque:

1). antes de empaquetar establecer la ubicación del marco relativo a nulo. Coloca la esquina superior izquierda de JFrame en el medio de la pantalla (antes de empacar, el JFrame está (0,0) dimensionado)

2). establecer los tamaños preferidos de mi contenido de fotograma (siempre uso JPanel único) y recordarlos

3). paquete el marco

4).si los tamaños de fotograma tras paquete no coinciden con los del paquete anterior, elimine el JPanel del contenido, agregue JScrollPane con este JPanel y establezca los tamaños preferidos de JScrollPane como tamaños preferidos de JPanel MÁS las dimensiones fijas de JScrollBar (es decir, el ancho de la barra de desplazamiento vertical y una altura de la horizontal).

5). empaquetar de nuevo: esto garantiza que solo aparezcan las barras de desplazamiento necesarias (si no aumenta los tamaños del JFrame, siempre aparecerán ambas barras de desplazamiento, también es necesario eliminar el borde predeterminado de JScrollPane).

6). Establezca una nueva ubicación del marco moviéndolo hacia la izquierda y hacia arriba por la mitad del tamaño correspondiente para centrarlo.