Interfaz con swing
Mi problema consiste a la hora de diseñar una interfaz con swings para mi aplicación (que trata sobre tratamiento de imágenes y como modificarlas). Para el siguiente JApplet en el cual mi programa muestra una JComboBox, JButton y diferentes JPanel cuyo paintComponent ha sido modificado (Imagen, Histograma, Función que se van a dibujar en pantalla y que voy a ir modificando durante la ejecución), me da el problema de que tal y como lo he programado, al quitarlos del panel contenedor en el que están, se me mueven un poco, y me desaparecen algunos elementos (como el JText y JComboBox). Esto sucede cuando invoco a los métodos updateLabel y updateBaplicar definidos en el.Si alguien puede indicarme la forma de repintar todo el JApplet sin que de esos problemas o de una mejor forma de trabajar con el, enviar respuestas a :[email protected]
El código es el siguiente:
public class MiApplet extends JApplet{
Imagen picture,picture2;
JPanel paneli,panelc,panelf,panelc2,panelif,panelh,panel,panel2;
Histograma hist;
Funcion funcion;
JComboBox cajaImagen;
JButton baplicar;
String[] listaImagen = { "camara", "lenna", "peppers"};
public void init(){
JPanel panel,panel2;
funcion=new Funcion();
cajaImagen = new JComboBox(listaImagen);
cajaImagen.setSelectedIndex(1);
baplicar=new JButton("Aplicar");
ActionListener al=new ActionListener(){
public void actionPerformed(ActionEvent evento){
Object obj=evento.getSource();
if(obj==cajaImagen)
cambiarImagen(evento); //selecciono una nueva Imagen para visualizar
if(obj==baplicar)
updateBaplicar(evento); //aplico la Funcion funcion sobre la Imagen seleccionada
}
};
cajaImagen.addActionListener(al);
baplicar.addActionListener(al);
picture = new Imagen();
picture2= new Imagen(picture); // una copia de picture
hist = new Histograma(picture); // representa el histograma de picture
panel=new JPanel();
panel2=new JPanel();
paneli=new JPanel();
panelc=new JPanel();
panelf=new JPanel();
panelif=new JPanel();
panelc2=new JPanel();
panelh=new JPanel();
panelc.setLayout(new GridLayout(2,2));
panelc2.setLayout(new GridLayout(1,1));
panel.setLayout(new FlowLayout(FlowLayout.LEFT,15,15));
panel2.setLayout(new FlowLayout(FlowLayout.RIGHT,15,15));
updateLabel(listaImagen[cajaImagen.getSelectedIndex()]);
panel.add(cajaImagen);
panel2.add(baplicar);
panelc2.add(panel);
panelc2.add(panel2);
getContentPane().add(panelc2,BorderLayout.NORTH);
paneli.add(picture);
panelf.add(funcion);
panelif.add(picture2);
panelh.add(hist);
panelc.add(paneli);
panelc.add(panelf);
panelc.add(panelif);
panelc.add(panelh);
panelc.repaint();// no se si esto es correcto para que lo pinte ?
getContentPane().add(panelc,BorderLayout.CENTER);
}
public void cambiarImagen(ActionEvent evento){
JComboBox caja = (JComboBox)evento.getSource();
String imName = (String)caja.getSelectedItem();
updateLabel(imName);
}
protected void updateLabel(String name){
panelh.remove(hist);
panelf.remove(funcion);
paneli.remove(picture);
panelif.remove(picture2);
funcion=new Funcion();
picture=creaImagen(name); // método que me crea una Imagen abriendo una *.jpg
picture2=new Imagen(picture);
hist=new Histograma(picture2);
panelh.add(hist);
paneli.add(picture);
panelif.add(picture2);
panelf.add(funcion);
getContentPane().repaint();//tengo dudas sobre que esto funcione ???
}
public void updateBaplicar(ActionEvent evento){
panelf.remove(funcion);
panelif.remove(picture2);
panelh.remove(hist);
funcion=new FuncionEcualizado(); //FuncionEcualizado hereda de Funcion y se aplica sobre Imagen, modificandola
picture2=new Imagen(picture);
picture2.aplicarFuncion(funcion); //llama a un metodo que modifica la Imagen de acuerdo a la Funcion creada
hist=new Histograma(picture2);
panelf.add(funcion);
panelif.add(picture2);
panelh.add(hist);
panelc.repaint(); //No se cual de estos dos métodos puede funcionar para visualizar los cambios en l
El código es el siguiente:
public class MiApplet extends JApplet{
Imagen picture,picture2;
JPanel paneli,panelc,panelf,panelc2,panelif,panelh,panel,panel2;
Histograma hist;
Funcion funcion;
JComboBox cajaImagen;
JButton baplicar;
String[] listaImagen = { "camara", "lenna", "peppers"};
public void init(){
JPanel panel,panel2;
funcion=new Funcion();
cajaImagen = new JComboBox(listaImagen);
cajaImagen.setSelectedIndex(1);
baplicar=new JButton("Aplicar");
ActionListener al=new ActionListener(){
public void actionPerformed(ActionEvent evento){
Object obj=evento.getSource();
if(obj==cajaImagen)
cambiarImagen(evento); //selecciono una nueva Imagen para visualizar
if(obj==baplicar)
updateBaplicar(evento); //aplico la Funcion funcion sobre la Imagen seleccionada
}
};
cajaImagen.addActionListener(al);
baplicar.addActionListener(al);
picture = new Imagen();
picture2= new Imagen(picture); // una copia de picture
hist = new Histograma(picture); // representa el histograma de picture
panel=new JPanel();
panel2=new JPanel();
paneli=new JPanel();
panelc=new JPanel();
panelf=new JPanel();
panelif=new JPanel();
panelc2=new JPanel();
panelh=new JPanel();
panelc.setLayout(new GridLayout(2,2));
panelc2.setLayout(new GridLayout(1,1));
panel.setLayout(new FlowLayout(FlowLayout.LEFT,15,15));
panel2.setLayout(new FlowLayout(FlowLayout.RIGHT,15,15));
updateLabel(listaImagen[cajaImagen.getSelectedIndex()]);
panel.add(cajaImagen);
panel2.add(baplicar);
panelc2.add(panel);
panelc2.add(panel2);
getContentPane().add(panelc2,BorderLayout.NORTH);
paneli.add(picture);
panelf.add(funcion);
panelif.add(picture2);
panelh.add(hist);
panelc.add(paneli);
panelc.add(panelf);
panelc.add(panelif);
panelc.add(panelh);
panelc.repaint();// no se si esto es correcto para que lo pinte ?
getContentPane().add(panelc,BorderLayout.CENTER);
}
public void cambiarImagen(ActionEvent evento){
JComboBox caja = (JComboBox)evento.getSource();
String imName = (String)caja.getSelectedItem();
updateLabel(imName);
}
protected void updateLabel(String name){
panelh.remove(hist);
panelf.remove(funcion);
paneli.remove(picture);
panelif.remove(picture2);
funcion=new Funcion();
picture=creaImagen(name); // método que me crea una Imagen abriendo una *.jpg
picture2=new Imagen(picture);
hist=new Histograma(picture2);
panelh.add(hist);
paneli.add(picture);
panelif.add(picture2);
panelf.add(funcion);
getContentPane().repaint();//tengo dudas sobre que esto funcione ???
}
public void updateBaplicar(ActionEvent evento){
panelf.remove(funcion);
panelif.remove(picture2);
panelh.remove(hist);
funcion=new FuncionEcualizado(); //FuncionEcualizado hereda de Funcion y se aplica sobre Imagen, modificandola
picture2=new Imagen(picture);
picture2.aplicarFuncion(funcion); //llama a un metodo que modifica la Imagen de acuerdo a la Funcion creada
hist=new Histograma(picture2);
panelf.add(funcion);
panelif.add(picture2);
panelh.add(hist);
panelc.repaint(); //No se cual de estos dos métodos puede funcionar para visualizar los cambios en l
2 Respuestas
Respuesta de pacotv
1
Respuesta de retsam