Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Problema al dibujar los botones en un JPanel

Hola a todos,
estoy intentando hacer un calendario que se vaya refrescando automáticamente depende del mes y año que le ponga...y los dias los dibujo como botones. El problema es...que cuando creo la matriz de botones, y añado uno a uno en el JPanel donde voy a dibujar todos los dias (botones), no me dibuja ningún botón, pero al pasar el ratón por encima me va dibujando todos por donde voy pasando el ratón....y al minimizar la ventana y hacerla grande otra vez desaparece todo.
Estoy probando para cada botón con setVisible, repaint, updateUI, validate...y nada de nada....
Ayuda!!!
Saludos.

noviembre 16, 2012 | Unregistered Commentershao

Lo que quieres hacer ya existe: http://www.toedter.com/en/jcalendar/
De todos modos, sin ver ni una sola línea del código como creas esos botones, y los añades al JPanel, sospecho que estás creando bien el JPanel, bien los botones, fuera del EDT.
Como he dicho muchas veces en este foro, sin código, y que sea significativo, lo único que queda es adivinar
Digo lo de significativo, porque con frecuencia se publica código "donde se cree que está el problema", fuera de contexto, e imposible de verificar.

noviembre 16, 2012 | Registered Commenterchoces

Se que ya está existe...pero quiero hacer el mio propio y para usar javabeans y demás...me apetece desarrollar....
Te paso la parte del código donde creo y dibujo los botones a ver si estuviera ahí el problema:

public void creaTablero(){
for (int fila=0;fila<5;fila++){
for (int columna=0;columna<7;columna++){
this.MatDias[fila][columna]=new JButton();
this.PanelTablero.add(MatDias[fila][columna]);
this.MatDias[fila][columna].setVisible(true);
this.MatDias[fila][columna].updateUI();
this.MatDias[fila][columna].repaint();
//Font f = new Font( "Helvetica",Font.ITALIC,5);
//this.MatDias[fila][columna].setFont(f);
//MatDias[fila][columna].addActionListener(this);
}
}
this.add(this.PanelTablero);
this.repaint();
}

el panel ya está creado ya que lo creo con netbeans...esa es la única parte dinámica que inserta los botones

noviembre 17, 2012 | Unregistered Commentershao

No sé qué layout tienes declarado para ese JPanel; pero deberías, en principio, usar un GridLayout
http://docs.oracle.com/javase/tutorial/uiswing/layout/grid.html
con las mismas dimensiones de la matriz de botones.
Si los creas en el constructor, no son necesarios los setVisible, repaint y updateUI.
Si el panel ya está creado, esta línea this.add(this.PanelTablero); sobra también; suponiendo que ese this se refiere al contenedor del JPanel, que también estará creado a su vez.

noviembre 17, 2012 | Registered Commenterchoces

Efectivamente uso un gridLayout. La clase principal es un JFrame y dentro de él tengo varios JPanel, ese JPanel PanelTablero es donde pongo mis botones. Uso todos estos métodos porque no sabia que hacer ya para que me los dibujase..pero nada...solo me los dibuja al pasar el ratón por encima....
¿Alguna idea?

noviembre 17, 2012 | Unregistered Commentershao

He hecho un test simple, usando tu mismo método, y todos los botones se dibujan correctamente en el panel.
Lo que me lleva a pensar que haces algo extraño con ese método, como ejecutarlo desde algún listener, por ejemplo, con alguna clase de acoplamiento entre botones, panel y contenedor.

noviembre 18, 2012 | Registered Commenterchoces

A ese método lo llamo en el constructor del JFrame. Lo estoy haciendo bajo el IDE NetBeans... El constructor contiene lo siguiente:
public MiJCalendar() {
initComponents();
this.setResizable(false);
this.PanelTablero.setLayout(new GridLayout(6,7));
cal.setTime(hoy); //Pongo el calendario al dia actual
String diaSemana=obtenerDiaSemana();
iniciaSpinner();
iniciaComboBox();
creaTablero();
pintaCalendario();
}
En el pintaCalendario lo único que hago es mirar el día actual y poner el número del dia actual en el botón que corresponda con un simple setText(miTexto). No se dónde puede estar el fallo y me estoy volviendo loco. Lo tengo todo hecho ya, sólo me falta solucionar eso que me está dando problemas desde el principio. ALgo tiene que ver NetBeans o algo estoy haciendo mal que no veo...si vieras el error te lo agradeceria.
Gracias por contestar. Saludos.

noviembre 18, 2012 | Unregistered Commentershao

La clase de prueba:

public class NewJFrame extends javax.swing.JFrame {

private final JButton[][] matDias = new JButton[5][7];

/** Creates new form NewJFrame */
public NewJFrame() {
initComponents();

for (int fila = 0; fila < 5; fila++) {
for (int columna = 0; columna < 7; columna++) {
this.matDias[fila][columna] = new JButton();
this.PanelTablero.add(matDias[fila][columna]);
}
}
}

/** This method is called from within the constructor to
initialize the form.
WARNING: Do NOT modify this code. The content of this method is
always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

PanelTablero = new javax.swing.JPanel();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

PanelTablero.setLayout(new java.awt.GridLayout(5, 7));

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 400, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(PanelTablero, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
.addContainerGap()))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 300, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(PanelTablero, javax.swing.GroupLayout.DEFAULT_SIZE, 278, Short.MAX_VALUE)
.addContainerGap()))
);

pack();
}// </editor-fold>
// Variables declaration - do not modify
private javax.swing.JPanel PanelTablero;
// End of variables declaration
}

noviembre 18, 2012 | Registered Commenterchoces

La clase de test, que verifica que la anterior funciona correctamente:

public class NewMain {

/**
@param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new NewJFrame().setVisible(true);
}
});
}
}

Como puedes ver, ambas están creadas con NetBeans (he eliminado los imports, y algunos comentarios, para no alargar demasiado los mensajes), y los botones se crean sin problemas.

noviembre 18, 2012 | Registered Commenterchoces

Pues no entiendo dónde está el fallo...alguna idea de dónde puedo meterle mano??
Saludos y gracias por contestar.

noviembre 18, 2012 | Unregistered Commentershao

Hay algunas diferencias significativas entre tu código para crear los botones, y el que uso para el test.

1.- Declaro el layout únicamente en el Matisse, como puedes ver en el código generado.
2.- El PanelTablero se declara y se añade al JFame también únicamente en el Matisse.

Este es el único código que uso para crear los botones:

for (int fila = 0; fila < 5; fila++) {
for (int columna = 0; columna < 7; columna++) {
this.matDias[fila][columna] = new JButton();
this.PanelTablero.add(matDias[fila][columna]);
}

Lo único que se me ocurre, puesto que no veo tu código completo, es que compares ambas maneras de resolverlo, porque evidentemente hay diferencias.

noviembre 18, 2012 | Registered Commenterchoces

Muchas gracias choces por tus consejos....he quitado el asignar el layout desde el código y se lo he dejado a matisse al igual que el jpanel...que lo añada directamente matisse...y ya me funciona..aunque me quedo un poco mosca porque no se por qué no iba..pero bueno...
Gracias!
Saludos.

noviembre 18, 2012 | Unregistered Commentershao