2011-05-07 25 views
15

Estoy desarrollando un juego Snake usando Java. El ancho y el alto de la Junta (donde toda acción se lleva a cabo) deben ser fijos (640 píxeles * 480 píxeles).¿Cómo configurar el ancho y la altura de JPanel?

Estructura:

  • Clase principal que se extiende desde JFrame clase,
  • Junta clase que se extiende desde JPanel clase;

En Clase principal tengo algo así como ...

setSize(1024, 768); 

... y en la clase Junta tengo ...

setSize(BOARDS_WIDTH, BOARDS_HEIGHT); 

El problema es que la principal y única Windows parece ser como 1024 * 768, pero dentro del panel no es como 640 * 480. Tengo setBackground() y el fondo está lleno más de 640 * 480.

¿Hay alguna manera de hacer que el ancho y la altura de la placa sean 640 * 480, pero el ancho y la altura de las ventanas principales, tanto como el ancho y la altura de la placa son correctos?

En este momento se ve así ...

Width and height are ~1000 * ~750, not 640 * 480.

Editar:

Todas las obras ... casi.

principal clase:

add(new Board(), BorderLayout.CENTER); 
pack(); 
setResizable(false); 
setLocationRelativeTo(null); 
setVisible(true); 
setDefaultCloseOperation(EXIT_ON_CLOSE); 
setTitle("Snake (by daGrevis)"); 

Junta clase:

setPreferredSize(new Dimension(640, 480)); 

gris de fondo es 642 * 482! ¡Como si hubiera un borde que lo envolviera todo por 1 píxel!

+0

Generalmente, no es necesario extender componentes a menos que se agregue funcionalidad adicional (p. nuevos métodos). –

+0

Lo tendré en mente. ¡Solo soy novato en Java! – daGrevis

+2

Para obtener ayuda más allá de lo que ya ha sido ofrecido (por alguien a quien considero como uno de los 'Gurus of Swing'), le sugiero que publique un [SSCCE] (http://pscode.org/sscce.html). –

Respuesta

9

favor, algo salió x x x * x, y eso no es cierto en absoluto, compruebe que

JButton Size - java.awt.Dimension[width=400,height=40] 
JPanel Size - java.awt.Dimension[width=640,height=480] 
JFrame Size - java.awt.Dimension[width=646,height=505] 

código (cosas básicas de Trail: Creating a GUI With JFC/Swing, y sin embargo sigo convencido de que eso sería ser obsoleta)

EDIT: olvidar setDefaultCloseOperation()

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class FrameSize { 

    private JFrame frm = new JFrame(); 
    private JPanel pnl = new JPanel(); 
    private JButton btn = new JButton("Get ScreenSize for JComponents"); 

    public FrameSize() { 
     btn.setPreferredSize(new Dimension(400, 40)); 
     btn.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("JButton Size - " + btn.getSize()); 
       System.out.println("JPanel Size - " + pnl.getSize()); 
       System.out.println("JFrame Size - " + frm.getSize()); 
      } 
     }); 
     pnl.setPreferredSize(new Dimension(640, 480)); 
     pnl.add(btn, BorderLayout.SOUTH); 
     frm.add(pnl, BorderLayout.CENTER); 
     frm.setLocation(150, 100); 
     frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // EDIT 
     frm.setResizable(false); 
     frm.pack(); 
     frm.setVisible(true); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       FrameSize fS = new FrameSize(); 
      } 
     }); 
    } 
} 
+0

-1 para setXXSize – kleopatra

+0

El "gran problema" era que necesitaba llamar a setResizable (falso) falso antes de agregar()! – daGrevis

6
Board.setPreferredSize(new Dimension(x, y)); 
. 
. 
//Main.add(Board, BorderLayout.CENTER); 
Main.add(Board, BorderLayout.CENTER); 
Main.setLocations(x, y); 
Main.pack(); 
Main.setVisible(true); 
+2

Sí, +1, pero no he usado setLocations - quizás el s es un error tipográfico. También a veces llamo a setLocationRelativeTo (null) después de llamar al paquete para centrar la GUI. –

+0

Gracias, funcionó para mí. Solo 'Borderlayout' debería ser 'BorderLayout'. – daGrevis

+1

@ daGrevis, gracias ese es mi Java integrado. – mKorbel

Cuestiones relacionadas