Problemas al diseñar un interfaz con swings

Akane
23 de Mayo del 2003
Mi problema consiste a la hora de diseñnar una interfaz con swings para mi aplicacion (que trata sobre tratamiento de imagenes y como modificarlas)

Para el siguiente JApplet en el cual mi programa muestra una JComboBox, JButton, JText y diferentes JPanel (Imagen,Histograma,Funcion que se van a dibujar en pantalla y que voy a ir modificando durante la ejecucióon), me da el problema de que tal y como lo he programado, al quitarlos del panel contenedor en el que estan, se me mueven un poco, y me desaparecen algunos elementos (como el JText y JComboBox). Esto sucede cuando invoco a los metodos 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, le estaria muy agradecida.

import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MiApplet extends JApplet{

Imagen picture,picture2; //son JPanel, cuyo paintComponents ha sido redefinido
JPanel paneli,panelc,panelf,panelc2,panelif,panelh,panel,panel2;
Histograma hist; //son JPanel, cuyo paintComponents ha sido redefinido
Funcion funcion; //son JPanel, cuyo paintComponents ha sido redefinido
JComboBox cajaImagen;
JButton baplicar;
JTextField parametro;
String[] listaImagen = { "camara", "lenna", "peppers", "scully", "flor" };

public void init(){
super.init();
iniciarComponentes();
}

private void iniciarComponentes(){
JPanel panel,panel2;
parametro=new JTextField(10);
parametro.setHorizontalAlignment(JTextField.LEFT);
funcion=new Funcion();
cajaImagen = new JComboBox(listaImagen);
cajaImagen.setSelectedIndex(4);
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);

//Set up the picture.
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();

//Lay out the demo.

panelc.setLayout(new GridLayout(2,2)); // contiene los paneles de las Imagen,Funcion e Histograma
panelc2.setLayout(new GridLayout(1,1)); // es el panel base de panel y panel2
panel.setLayout(new FlowLayout(FlowLayout.LEFT,15,15)); // contiene la JComboBox
panel2.setLayout(new FlowLayout(FlowLayout.RIGHT,15,15)); // contiene el JTextField y el JButton
updateLabel(listaImagen[cajaImagen.getSelectedIndex()]);
panel.add(cajaImagen);
panel2.add(parametro);
panel2.add(baplicar);
panelc2.add(panel);
panelc2.add(panel2);
getContentPane().add(panelc2,BorderLayout.NORTH);
paneli.add(picture); // contiene la Imagen original
panelf.add(funcion); // contiene la Funcion
panelif.add(picture2); // contiene la Imagen copiada que se va modificar
panelh.add(hist); // contiene el Histograma de la Imagen a modificar
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);
}
/** Listens to the combo box. */
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éetodo definido anteriormente que me crea una Imagen a partir de un String (abre 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){
String texto="";
float valor;
texto=parametro.getText(); // leemos el parametro de la funcion y lo pasamos a float
valor=(Float.valueOf(texto)).floatValue();
panelf.remove(funcion);
panelif.remove(picture2);
panelh.remove(hist);
funcion=new FuncionBrillo(valor); //FuncionBrillo hereda de Funcion, recibe un float como parametro 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 metodos puede funcionar para visualizar los cambios en los paneles ???
getContentPane().repaint(); // cual es el que realmente dispara la actualizacion ???
}
}

phelipe
23 de Mayo del 2003
llama a repaintAll()