Foros del Web » Programación para mayores de 30 ;) » Java »

Problema con GridBagConstraints

Estas en el tema de Problema con GridBagConstraints en el foro de Java en Foros del Web. Hola! Tengo un panel con GridBagLayout en el que me gustaría que apareciera un JlAbel en el centro y un JButton en la esquina superior ...
  #1 (permalink)  
Antiguo 17/01/2007, 06:04
 
Fecha de Ingreso: noviembre-2006
Mensajes: 35
Antigüedad: 18 años
Puntos: 0
Problema con GridBagConstraints

Hola!

Tengo un panel con GridBagLayout en el que me gustaría que apareciera un JlAbel en el centro y un JButton en la esquina superior derecha, pero no consigo colocar el botón, ponga lo que ponga siempre me aparece pegado a la etiqueta. Este es mi código:

firstPanel = new JPanel();
firstPanel.setBorder(BorderFactory.createEmptyBord er(0, 0, 0, 0));
firstPanel.setOpaque(false);
firstPanel.setLayout(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();

remoteUserLabel = new JLabel("Sesión de chat con " + contact);
remoteUserLabel.setHorizontalAlignment(AbstractBut ton.LEFT);

ImageIcon icocerrar = new ImageIcon("//Web/wwwroot/Clinic/img/close.gif");
closeButton = new JButton(icocerrar);
closeButton.setPreferredSize(new Dimension(20,20));

closeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
//!Lo que hace el botón
}
}
);

constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 1.0;
constraints.fill = GridBagConstraints.BOTH;
firstPanel.add(remoteUserLabel,constraints);

constraints.gridx = 1;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 0;
constraints.anchor=GridBagConstraints.EAST;
constraints.fill = GridBagConstraints.NONE;
firstPanel.add(closeButton,constraints);

¿Alguien me podría echar una mano con esto?

Muchas gracias!
  #2 (permalink)  
Antiguo 17/01/2007, 23:16
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Re: Problema con GridBagConstraints

Hola:

No sé qué valor tiene weighty por defecto, pero ponlo a 1.0 por si acaso. De esta forma los "huecos" para el botón y la etiqueta se estirarán verticalmente.

El fill y anchor de la etiqueta deberían ser NONE y CENTER. Así la etiqueta no se agrandará dentro de su hueco y quedará centrada. Otra opción es la que tú tienes de fill=BOTH, pero entonces el JLabel se agranda con su hueco y debes poner en el jLabel los setAlignement() adecuados para que el texto salga centrado dentro del JLabel. Por defecto sale a la izquierda, creo.

anchor debería ser NORTHEAST para el botón, para que se vaya arriba a la derecha en su hueco. El fill del botón a NONE.

No lo he probado, pero inténtalo y si tienes problemas, cuenta cual es el resultado y trataré de ponerte aquí el código. Por si te sirve de ayuda, aquí tienes un pequeño tutorial sobre el GridBagLayout.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 18/01/2007, 03:51
 
Fecha de Ingreso: noviembre-2006
Mensajes: 35
Antigüedad: 18 años
Puntos: 0
Re: Problema con GridBagConstraints

Hola!

Ya he probado todo lo que me has sugerido pero sigue quedando todo igual, la etiqueta y el botón pegado a su derecha

Gracias por el tutorial, fue el que utilicé ayer para enterarme 1 poco de cómo funciona un GridBagLayout y me fue muy útil :)

No se me ocurre qué más probar, te pego el código completo del método initComponents por si el fallo está en otro sitio.

Ah, y mil gracias por la ayuda!

public class ChatFrame extends JPanel {

...

public void initComponents() {

this.setSize(100, 100);
Point point = imGUI.getLocation();
this.setLocation(point.x, point.y);

firstPanel = new JPanel();
firstPanel.setBorder(BorderFactory.createEmptyBord er(0, 0, 0, 0));
firstPanel.setOpaque(false);
firstPanel.setLayout(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();


remoteUserLabel = new JLabel("Sesión de chat con " + contact);
remoteUserLabel.setHorizontalAlignment(AbstractBut ton.LEFT);
remoteUserLabel.setForeground(Color.black);
remoteUserLabel.setFont(new Font("Dialog", 1, 12));
remoteUserLabel.setOpaque(true);

ImageIcon icocerrar = new ImageIcon("//Web/wwwroot/Clinic/img/close.gif");
closeButton = new JButton(icocerrar);
closeButton.setPreferredSize(new Dimension(20,20));

closeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
}
}
);

constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 1.0;
constraints.weighty = 1.0;
constraints.fill = GridBagConstraints.NONE;
constraints.anchor=GridBagConstraints.CENTER;
firstPanel.add(remoteUserLabel,constraints);

constraints.gridx = 1;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 0;
constraints.anchor=GridBagConstraints.NORTHEAST;
constraints.fill = GridBagConstraints.NONE;
firstPanel.add(closeButton,constraints);

chatTextArea = new JTextArea(11, 40);
chatTextArea.setToolTipText("Mensajes recibidos");
chatTextArea.setEditable(false);
chatTextArea.setBackground(Color.white);
chatTextArea.setLineWrap(true);
chatTextArea.setWrapStyleWord(true);

JScrollPane incomingScroller = new JScrollPane(chatTextArea);
incomingScroller.setVerticalScrollBarPolicy(JScrol lPane.
VERTICAL_SCROLLBAR_ALWAYS);
incomingScroller.setHorizontalScrollBarPolicy(JScr ollPane.
HORIZONTAL_SCROLLBAR_ALWAYS);
//EVA: Añadido para que el Scroll siempre aparezca abajo del todo
incomingScroller.getVerticalScrollBar().setValue(i ncomingScroller.
getVerticalScrollBar().getMaximum());

infoLabel = new JLabel("");
infoLabel.setHorizontalAlignment(AbstractButton.CE NTER);
infoLabel.setForeground(Color.black);
infoLabel.setFont(new Font("Dialog", 1, 10));
infoLabel.setOpaque(false);

textToSendLabel = new JLabel("Texto a enviar:");
textToSendLabel.setHorizontalAlignment(AbstractBut ton.CENTER);
textToSendLabel.setForeground(Color.black);
textToSendLabel.setFont(new Font("Dialog", 1, 11));
textToSendLabel.setOpaque(true);

messageTextArea = new JTextArea(3, 32);
messageTextArea.setEditable(true);
messageTextArea.setFont(new Font("Helvetica", Font.PLAIN, 13));
messageTextArea.setSelectedTextColor(Color.blue);
messageTextArea.setSelectionColor(Color.lightGray) ;
messageTextArea.setLineWrap(true);
messageTextArea.setWrapStyleWord(true);


// create scroll bars for text areas
JScrollPane outgoingScroller = new JScrollPane(messageTextArea);
outgoingScroller.setVerticalScrollBarPolicy(JScrol lPane.
VERTICAL_SCROLLBAR_ALWAYS);
outgoingScroller.setHorizontalScrollBarPolicy(JScr ollPane.
HORIZONTAL_SCROLLBAR_AS_NEEDED);

messageTextArea.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
messageTextAreaKeyPressed(evt);
}
});


secondPanel = new JPanel();
secondPanel.setOpaque(false);
secondPanel.setBorder(BorderFactory.createEmptyBor der(2, 2, 2, 2));
secondPanel.setLayout(new GridLayout(2, 1, 0, 0));

sendButton = new JButton(" ENVIAR ");
sendButton.setToolTipText("Enviar el mensaje");
sendButton.setFocusPainted(false);
sendButton.setFont(new Font("Dialog", 1, 13));

sendButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
chatSession.sendIMActionPerformed(evt);
}
}
);


JPanel subPanel2 = new JPanel();
subPanel2.setOpaque(false);
subPanel2.setLayout(new GridLayout(2, 1, 0, 0));

JPanel subPanel3 = new JPanel();
subPanel3.setOpaque(false);
subPanel3.setLayout(new BorderLayout());
subPanel3.add("Center", outgoingScroller);
subPanel3.add("East", sendButton);
secondPanel.add(subPanel3);

this.add("North", firstPanel);
this.add("Center", incomingScroller);
this.add("South", secondPanel);

}
  #4 (permalink)  
Antiguo 18/01/2007, 07:52
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Re: Problema con GridBagConstraints

Hola:

He probado este codigo (copy-paste, pero simplificado) del tuyo y funciona bien. Estira la ventana en horizontal y veras que está bien.

public static void main(String[] args) {
JFrame v = new JFrame();
v.getContentPane().setLayout(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();

constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 1.0;
constraints.weighty = 1.0;
constraints.fill = GridBagConstraints.NONE;
constraints.anchor=GridBagConstraints.CENTER;
v.getContentPane().add(new JLabel("hola"),constraints);

constraints.gridx = 1;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 0;
constraints.anchor=GridBagConstraints.NORTHEAST;
constraints.fill = GridBagConstraints.NONE;
v.getContentPane().add(new JButton("Cerrar"),constraints);
v.pack();
v.setVisible(true);

}

Quizas el problema venga en this.add("North", firstPanel);
Según qué layout tenga this, es posible que a firstPanel no se le estire y ocupe justo el tamaño de la etiqueta y del botón. Para verificar esto, puedes ponerle un color de background a firstPanel y así ver exactamente que tamaño ocupa dentro de this.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 18/01/2007, 08:33
 
Fecha de Ingreso: noviembre-2006
Mensajes: 35
Antigüedad: 18 años
Puntos: 0
Re: Problema con GridBagConstraints

Un millón de gracias, sí que era ese el problema, el layout de this . Lo he convertido en GridBagLayout y ya me muestra el botón donde quería (aunque ahora se me ha descolocado todo lo demás... jeje!)

Parecerá 1 tontería, pero llevaba 2 días perdidos peleándome con el botón
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:21.