2012-08-13 20 views
5

Código:setPreferredSize no funciona

import java.awt.Dimension; 

import javax.swing.*; 

public class Game extends JFrame { 
    private static final long serialVersionUID = -7919358146481096788L; 
    JPanel a = new JPanel(); 
    public static void main(String[] args) { 
     new Game(); 
    } 
    private Game() { 
     setTitle("Insert name of game here"); 
     setLocationRelativeTo(null); 
     setLayout(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     a.setPreferredSize(new Dimension(600, 600)); 
     add(a); 
     pack(); 
     setVisible(true); 
    } 
} 

Así que ajustar el tamaño preferido de la JPanel 600 x 600 y el paquete de la trama, pero el tamaño de la trama sigue siendo 0 por 0.

¿Por qué es esto y cómo lo arreglo?

+2

Ver: [? ¿Por qué es mal visto usar un diseño nulo en oscilación] (http://stackoverflow.com/questions/6592468/why-is- it-frowned-upon-to-use-a-null-layout-in-swing) –

Respuesta

8

Como usted ha dicho, pack() tratarán de arreglar la ventana para que todos los componentes se cambia el tamaño de su preferredSize.

El problema es que parece que el administrador de disposición es el que intenta organizar los componentes y sus tamaños preferidos respectivos. Sin embargo, como configura el administrador de diseño como nulo, no hay nadie a cargo de eso.

Intente comentar la línea setLayout(null), y verá el resultado. Por supuesto, para una ventana completa, tendrá que elegir y establecer un significativo LayoutManager.

Esto funciona bien para mí:

import java.awt.Dimension; 

import javax.swing.*; 

public class Game extends JFrame { 
    private static final long serialVersionUID = -7919358146481096788L; 
    JPanel a = new JPanel(); 
    public static void main(String[] args) { 
     new Game(); 
    } 
    private Game() { 
     setTitle("Insert name of game here"); 
     setLocationRelativeTo(null); 
     //setLayout(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     a.setPreferredSize(new Dimension(600, 600)); 
     add(a); 
     pack(); 
     setVisible(true); 
    } 
} 
+0

ah, esto funciona, gracias :) – Doorknob

2

pack() consulta el tamaño preferido del contenedor primario sobre la del niño por lo que tendría que utilizar:

setPreferredSize(new Dimension(600, 600)); 

Otra nota es llamar

setLocationRelativeTo(null); 

después pack() ha sido llamado a calcular las coordenadas del centro :)

OK, acabo de ver el diseño nulo, ¿por qué no utilizar el valor predeterminado BorderLayout of JFrame?

+0

bien gracias que funciona, pero ahora todo lo que agregue al JPanel ¡no aparece! – Doorknob

+0

Ver mi actualización arriba – Reimeus

+1

+1 para pedir cambiar la secuencia, en la que se están realizando las llamadas. Primero agregue componentes al 'JFrame', para que su tamaño se pueda realizar, luego guíe su posición en la pantalla en relación con su tamaño y luego configúrelo como visible. buen enfoque :-) –

2

Su problema es setLayout(null), becase los documentos dicen para pack():

Causas esta ventana para tener el tamaño para ajustarse al tamaño preferido y diseños de sus subcomponentes

por lo tanto sin diseño lo hace no se ejecuta correctamente

Esto parece funcionar bien para mí:

import java.awt.Dimension; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Game extends JFrame { 

    JPanel panel = new JPanel(); 

    private void createAndShowGUI() { 
     setTitle("FrameDemo"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     panel.setPreferredSize(new Dimension(600, 600)); 
     add(panel); 

     //setLayout(null); //wont work with this call as pack() resizes according to layout manager 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Game().createAndShowGUI(); 
      } 
     }); 
    } 
}