2011-08-24 679 views
13

Estoy utilizando el constructor de la interfaz gráfica de usuario de NetBeans para manejar mi diseño (soy terrible con los administradores de diseño) y estoy tratando de colocar un JLabel simple para que siempre esté centrado (horizontalmente) dentro de su JPanel padre . Idealmente, esto se mantendría cierto incluso si se cambiara el tamaño del JPanel, pero si esa es una cantidad de código loca, basta con centrarse solo cuando se crea el JPanel por primera vez.Centrar un JLabel en un JPanel

Ya soy lo suficientemente malo tratando de manejar diseños, pero como NetBeans GUI Builder genera automáticamente código inmutable, me ha resultado imposible encontrar la manera de hacer este centrado, y no he podido encontrar nada en línea para ayudarme.

Gracias a cualquiera que me pueda orientar en la dirección correcta!

Respuesta

11

Al usar Borderlayout, puede poner cualquiera de JComponents en el área CENTRO. Para un ejemplo, vea an answer to Stack Overflow question Get rid of the gap between JPanels. Esto debería funcionar.

+0

gracias por su respuesta, sin embargo, el NetBeans GUI Build utiliza GroupLayout y esto no es reemplazable. Recuerda que no solo estoy tratando de luchar contra Swing y sus amenazadores LayoutManagers, ¡estoy peleando contra un Generador de GUI que autogenera código específicamente para GroupLayout! – IAmYourFaja

+0

+1: BorderLayout es el correcto. – Heisenbug

+0

@Mara: realmente te sugiero que comiences a aprender a usar el administrador de diseño. No es tan difícil. En cambio, es difícil lograr los mismos resultados usando el generador de gui. – Heisenbug

10

Incluso con BoxLayout se puede lograr que: solución

JPanel listPane = new JPanel(); 
listPane.setLayout(new BoxLayout(listPane, BoxLayout.X_AXIS)); 

JLabel label = new JLabel(); 
listPane.add(Box.createHorizontalGlue()); 
listPane.add(label); 
listPane.add(Box.createHorizontalGlue()); 

de mKorbel es perfecto para su objetivo. De todos modos, siempre me gusta sugerir BoxLayout porque es muy flexible.

+0

Gracias Overbose, pero estoy atrapado con GroupLayout. Y si dedico mucho más tiempo en el lado del cliente, definitivamente haré su sugerencia y aprenderé los LayoutManagers desde cero. Solo estoy buscando una solución rápida y sucia. Eso usa GroupLayout. – IAmYourFaja

+2

* "Estoy atrapado con GroupLayout" * Solo porque no sabes cómo usar Netbeans. No lo uso, pero he visto código de usuarios de Netbeans (incluso cuando usaba el diseñador de GUI) que usaba todos los diseños estándar. –

26

Aquí hay cuatro maneras de centrar un componente:

4 Centered Components

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

class CenterComponent { 

    public static JLabel getLabel(String text) { 
     return getLabel(text, SwingConstants.LEFT); 
    } 

    public static JLabel getLabel(String text, int alignment) { 
     JLabel l = new JLabel(text, alignment); 
     l.setBorder(new LineBorder(Color.RED, 2)); 
     return l; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JPanel p = new JPanel(new GridLayout(2,2,4,4)); 
       p.setBackground(Color.black); 
       p.setBorder(new EmptyBorder(4,4,4,4)); 

       JPanel border = new JPanel(new BorderLayout()); 
       border.add(getLabel(
        "Border", SwingConstants.CENTER), BorderLayout.CENTER); 
       p.add(border); 

       JPanel gridbag = new JPanel(new GridBagLayout()); 
       gridbag.add(getLabel("GridBag")); 
       p.add(gridbag); 

       JPanel grid = new JPanel(new GridLayout()); 
       grid.add(getLabel("Grid", SwingConstants.CENTER)); 
       p.add(grid); 

       // from @0verbose 
       JPanel box = new JPanel(); 
       box.setLayout(new BoxLayout(box, BoxLayout.X_AXIS)); 

       box.add(Box.createHorizontalGlue()); 
       box.add(getLabel("Box")); 
       box.add(Box.createHorizontalGlue()); 
       p.add(box); 

       JFrame f = new JFrame("Streeeetch me.."); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.setContentPane(p); 
       f.pack(); 
       f.setLocationByPlatform(true); 
       f.setVisible(true); 
      } 
     }); 
    } 
} 
+2

excelente después de la actualización +1 – mKorbel

6

Mara: "Gracias por su respuesta, sin embargo, el NetBeans GUI Build utiliza GroupLayout y esto no es reemplazable."

¡No es cierto! Haga clic derecho en cualquier lugar dentro de JFrame (o en cualquier otro contenedor GUI) en el generador de la interfaz gráfica de usuario de NetBeans y seleccione "Establecer diseño". De forma predeterminada, se selecciona "Diseño libre", que es Diseño de grupo, pero puede seleccionar cualquier otro diseño, incluido el Diseño de borde, tal como lo recomienda mKorbel.