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
Respuesta
1
No se si ya hayas intendo usar el método repaint de los Applets
public void repaint(){
}
Existen algunos objetos como las etiquetas que no necesitas repintar solo cambialos con el método setText y se cambia el valor.
No entiendo muy bien como en tu solución paso de trabajar con un JApplet a hacerlo con un Frame. De todas formas esto va a ir en una página web, por lo que tengo que apañármelas con los applets.
De todas formas la duda que tengo es como hacer que un objeto ya pintado, cuando lo modifique, lo vuelva a colocar en la misma posición y lo actualice sin que se me borre el fondo.
Bueno un JApplet no funciona igual que el JFrame.
En el JApplet es un componente. En el JFrame tienes que declararlo como tal.
public static void main(String[] args) {
//Esto te maneja el look and Feel de Swing
try {
UIManager.setLookAndFeel(
UIManager.getCrossPlatformLookAndFeelClassName());
} catch (Exception e) { }
JFrame frame = new JFrame("SwingApplication");
SwingApp app = new SwingApp ();
Component contents = app.createComponents();
frame.getContentPane().add(contents, BorderLayout.CENTER);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.pack();
frame.setVisible(true);
}
//tu clase puede quedar declara
public class SwingApp {
..
..//Las variables
..
//Tu método principal queda..
public Component createComponents() {
...
..
// Elementos que necesites
JButton myButton = new JButton(new ImageIcon(leftButtonFilename));
..
..
..
JPanel pane = new JPanel();
pane.setLayout(new GridLayout(0, 1));
pane.add(button);
pane.add(label);
return pane;
}
Si tienes de como armarlo escribe con confianza.

1 respuesta más de otro experto

Respuesta
No tengo el tiempo suficiente para revisar todo tu código, pero me ha pasadoalgo similar y lo solucione seteando el layout de la siguiente forma:
getContentPane().setLayout(null);
luego ubico los objetos a mi manera con:
objeto.setBounds(10,20,180,15);
asi me independizo del problema, y luego hago:
pack();
setBounds(300,250,250,150);
show();
Claro que esto en los puntos cruciales, obviamente debe haber más código entre medio, pero estos son los puntos críticos, ojala te sirva
Por falta de tiempo no puedo ayudarte más, quizás en otra ocasión te hubiera dado el código fuente

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas