Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > No entiendo el funcionamiento de paintComponent

Hola, gracias por leer mi duda.

Tengo 4 clases pequeñas, en una tengo un panel que servirá para que cambie de color. En otra clase tengo otro panel en donde estará el botón y el evento del mismo.
En otra tengo el frame en donde agrego los paneles.
Y el main.

Bien, el objetivo es el siguiente:

Al clickear el boton, que se abra un JColorChooser, elegir el color y de acuerdo al color elegido, se pintará el panel.

Lo que pasa es que hace todo menos Pintarlo. Puse un getter metodos getColorActual() para verificar que el color se haya establecido correctamente, pero no pinta.


Aquí dejo mis clases:


PintaPanel.java

package jcolorchooser;


import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import javax.swing.JPanel;


public class PintaPanel extends JPanel {

private static Color colorPintar = Color.WHITE;


public PintaPanel() {
super();
this.setPreferredSize(new Dimension(400,400));
this.setLayout(new GridLayout());
}
public void setColorActual(Color color) {
colorPintar = color;
repaint();
}
public Color getColorActual(){
return colorPintar;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
this.setBackground(colorPintar);
}

}

PanelBoton.java

import javax.swing.JColorChooser;


public class PanelBoton extends JPanel {
private PintaPanel panelColor;
private JButton btnElegirColor;
private JColorChooser paletaColores;
private Color colorElegido = Color.LIGHT_GRAY;

public PanelBoton() {
super();
panelColor = new PintaPanel();
this.setLayout(new GridLayout());
btnElegirColor = new JButton("Elegir Color...");
this.add(btnElegirColor);
btnElegirColor.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
colorElegido = paletaColores.showDialog(PanelBoton.this,"Elige el color de fondo...",Color.BLACK);
panelColor.setColorActual(colorElegido);
panelColor.repaint();
System.out.print("\nEl valor de colorPanel es: "+panelColor.getColorActual().toString());
} catch(NullPointerException np){
System.out.print(np.getMessage());
}
}
});

}

}

Marco.java

import java.awt.BorderLayout;
import javax.swing.JFrame;

public class Marco {


public Marco(){
init();
}
private void init() {
JFrame marco = new JFrame();
marco.setTitle("Pintado de Panel");
marco.setLayout(new BorderLayout());
marco.add(new PintaPanel(),BorderLayout.CENTER);
marco.add(new PanelBoton(),BorderLayout.SOUTH);
configFrame(marco);
}
private void configFrame(JFrame frame) {
frame.setSize(400,500);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

Man.java

package jcolorchooser;

import javax.swing.SwingUtilities;

public class Main {

public static void main(String... args) {
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
new Marco();
}
});
}
}


Gracias.

octubre 18, 2013 | Unregistered CommenterMigu

Solucionado. En un post anterior, dice un usuario, que el panel que invoca la llamada a repaint() no esta agregado a ningun contenedor, por ende las llamadas que se hacen a el no generan accion.

Cree un objeto estatico de PintaPanel en el Marco, y lo instancié y agregé al marco. Luego, desde el panel los botones llame al metodo repaint por medio del objeto.


Saludos.

octubre 18, 2013 | Unregistered CommenterMigu