2011-11-19 19 views
25

Mi código no funciona:¿Cómo establecer el tamaño específico de ventana (marco) en java swing?

JFrame frame = new JFrame("mull"); 

mull panel = new mull(); 

// add panel to the center of window 
frame.getContentPane().add("Center", panel); 
frame.setSize(500, 300); // << not working!!! 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.pack(); // give a suitable size to window automatically 
frame.setVisible(true); // make window visible 

estoy recibiendo ventana muy pequeña. ¿Como arreglarlo?

+1

* "Cómo establecer el tamaño específico de ventana (marco) en java swing?" * Es más común que desee establecer el tamaño preferido del panel de contenido de un marco, o tal vez un componente en el panel de contenido . Presumir de saber qué tan grande es el marco en sí mismo y, a partir de ahí, cómo organizar o presentar el contenido, está plagado de problemas. –

Respuesta

47

Bueno, estás usando tanto frame.setSize() como frame.pack().

Debe usar uno de ellos al mismo tiempo.

Usando setSize() puede dar el tamaño de marco que desee pero si usa pack(), cambiará automáticamente el tamaño de los marcos de acuerdo con el tamaño de los componentes en él. No tendrá en cuenta el tamaño que ha mencionado anteriormente.

Intente eliminar frame.pack() de su código o antes de configurar el tamaño y luego ejecútelo.

+2

¡Gracias! ¡Funcionó! –

+1

¡bienvenido! :) – gprathour

+4

Mover 'pack()' antes de 'setSize()' pero ** no ** eliminarlo! Una llamada a 'paquete()' (marcos) o 'validate()' (applet) es necesaria para el diseño correcto fuera de la GUI. O mejor aún, agregue algunos contenidos al marco para que los administradores de diseño puedan calcular qué tamaño debe tener * cuando se empaquete (y elimine cualquier llamada para establecer el tamaño, el tamaño preferido, el tamaño máximo o (posiblemente incluso) mínimo). -1 –

8

La mayoría de los administradores de diseño funcionan mejor con el tamaño preferido de un componente, y es mejor que la mayoría de GUI permita que los componentes que contienen establezcan sus propios tamaños preferidos en función de su contenido o propiedades. Para utilizar estos administradores de diseño de la mejor manera posible, llame al pack() en sus contenedores de nivel superior, como sus JFrames, antes de hacerlos visibles, ya que les indicará a estos gerentes que realicen sus acciones: diseñar sus componentes.

A menudo, cuando he tenido que jugar un papel más directo al configurar el tamaño de uno de mis componentes, anularé getPreferredSize y le devolveré una dimensión que sea mayor que el super.preferredSize (o si no, entonces devuelve el valor del super)

Por ejemplo, he aquí una pequeña aplicación de arrastrar un rectángulo que he creado para another question on this site:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class MoveRect extends JPanel { 
    private static final int RECT_W = 90; 
    private static final int RECT_H = 70; 
    private static final int PREF_W = 600; 
    private static final int PREF_H = 300; 
    private static final Color DRAW_RECT_COLOR = Color.black; 
    private static final Color DRAG_RECT_COLOR = new Color(180, 200, 255); 
    private Rectangle rect = new Rectangle(25, 25, RECT_W, RECT_H); 
    private boolean dragging = false; 
    private int deltaX = 0; 
    private int deltaY = 0; 

    public MoveRect() { 
     MyMouseAdapter myMouseAdapter = new MyMouseAdapter(); 
     addMouseListener(myMouseAdapter); 
     addMouseMotionListener(myMouseAdapter); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     if (rect != null) { 
     Color c = dragging ? DRAG_RECT_COLOR : DRAW_RECT_COLOR; 
     g.setColor(c); 
     Graphics2D g2 = (Graphics2D) g; 
     g2.draw(rect); 
     } 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private class MyMouseAdapter extends MouseAdapter { 

     @Override 
     public void mousePressed(MouseEvent e) { 
     Point mousePoint = e.getPoint(); 
     if (rect.contains(mousePoint)) { 
      dragging = true; 
      deltaX = rect.x - mousePoint.x; 
      deltaY = rect.y - mousePoint.y; 
     } 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
     dragging = false; 
     repaint(); 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 
     Point p2 = e.getPoint(); 
     if (dragging) { 
      int x = p2.x + deltaX; 
      int y = p2.y + deltaY; 
      rect = new Rectangle(x, y, RECT_W, RECT_H); 
      MoveRect.this.repaint(); 
     } 
     } 
    } 

    private static void createAndShowGui() { 
     MoveRect mainPanel = new MoveRect(); 

     JFrame frame = new JFrame("MoveRect"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

Tenga en cuenta que mi clase principal es un JPanel, y que puedo reemplazar de JPanel getPreferredSize:

public class MoveRect extends JPanel { 
    //.... deleted constants 

    private static final int PREF_W = 600; 
    private static final int PREF_H = 300; 

    //.... deleted fields and constants 

    //... deleted methods and constructors 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
    } 

también tenga en cuenta que cuando muestro mi interfaz gráfica de usuario, lo coloco en un JFrame, llamo pack(); en el JFrame, fijar su posición, y luego llamo setVisible(true); en mi JFrame:

private static void createAndShowGui() { 
     MoveRect mainPanel = new MoveRect(); 

     JFrame frame = new JFrame("MoveRect"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
Cuestiones relacionadas