Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Refrescar campos JPanel

Hay alguna forma de refrescar el contenido de un JLabel en el momento que se modifica y no tener que esperar que termine el actionPerformed del actionListener de un JButton ?

agosto 23, 2013 | Unregistered CommenterLeuqim

El método setText(<texto>) de JLabel actualiza su contenido en el momento en que se ejecuta. No es necesario esperar a que termine ningún listener.
Publica tu código, a ver qué tipo de problema tienes.

agosto 23, 2013 | Registered Commenterchoces

Solución encontrada: Si en lugar de utilizar objetos swing (JFrame, JPanel y JLabel) utilizo componentes awt,(Frame, Panel y Label) la modificación del label es inmediata y no hace falta esperar que termine el actionPerformed.

agosto 23, 2013 | Unregistered CommenterLeuqim

Parece ser que utilizan thread(hilos de ejecución ) diferentes los componentes awt de los swing

agosto 23, 2013 | Unregistered CommenterLeuqim

Perdona chocas, no me he expresado bien. Me referia al refresco visual de dicho campo, no al contenido interno, que este si se actualiza al momento

agosto 23, 2013 | Unregistered CommenterLeuqim

El Event Dispatch Thread es el mismo, tanto para AWT como para Swing:

http://docs.oracle.com/javase/7/docs/api/java/awt/EventQueue.html

Luego no puede ser que el problema se resuelva porque "...utilizan thread(hilos de ejecución ) diferentes los componentes awt de los swing", como dices.

Es indudable que tienes algún problema con tu código. Pero si no quieres publicarlo...

agosto 23, 2013 | Registered Commenterchoces

Guenas.

¿Porque deseas refrescar la imagen del label antes de terminar el action?
El action solo debe ejecutar código muy corto para no congelar el interface
Si lo que deseas es que realice un proceso largo como p.ej. una copia de archivos, debes lanzarlo en una tarea aparte. Usa Swingworker para ello si esta tarea debe interaccionar con el interfaz.

Un saludo
Paposo

agosto 24, 2013 | Unregistered CommenterPaposo

Si ejecutais el codigo siguiente con debugger poniendo un punto de stop en la instruccion : "jlNota.setText("JLabel 2")" y avanzais step a step vereis que la actualizacion del JLabel se produce al terminar el preformed, mientras que el Label es inmediato:

package awt_fora_swing;

import java.awt.FlowLayout;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

/**
*
* @author Miquel
*/
public class AWT_fora_SWING extends JFrame{
JLabel jlNota;
JButton bB;
JPanel pane;
Label lNota;

public AWT_fora_SWING(){


pane = new JPanel();
pane.setLayout(new FlowLayout());
jlNota = new JLabel("JLabel");
lNota = new Label("Label");
bB = new JButton("Boto");

bB.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent eb1) {
jlNota.setText("JLabel 2");
lNota.setText("Label 2");
System.out.println(lNota.getText());
}
});
// UIManager.setLookAndFeel(UIManager.);
pane.add(jlNota);
pane.add(bB);
pane.add(lNota);
this.add(pane);
this.setVisible(true);
}

/**
* @param args the command line arguments
*/
public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable()
{
public void run() {
AWT_fora_SWING f = new AWT_fora_SWING();
f.setTitle("Proba");
f.setSize(320, 420);
}
});
/*
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we){
System.exit(0);
}
});
*/
}
}

agosto 25, 2013 | Unregistered CommenterLeuqim

Hola.
No sé si puede influir en el resultado, yo como editor utilizo el BetBeans 7.3.

Saludos cordiales.

agosto 25, 2013 | Unregistered CommenterLeuqim

El editor de NetBeans no tiene nada que ver.

Un listener de Swing debe tardar unos pocos milisegundos en ejecutarse. Si tarda más de de 250 o 300 ms hay un serio problema de diseño.

No comprendo cuál es el problema de que el UI tarde unos ms más o menos en actualizarse. Desde luego, no veo la "ventaja" de usar AWT frente a Swing, por ese motivo.

agosto 25, 2013 | Registered Commenterchoces

No se como utilizar Listener en Swing ya que automaticamente cuando a un JButton le indico el Listener el sistema me indica que importe de AWT.

agosto 26, 2013 | Unregistered CommenterLeuqim

Si en NetBeans le añades un listener a un componente, por ejemplo un botón, desde el Editor Gráfico, te crea estos dos bloques de código:

Dentro del código generado:
public void actionPerformed(java.awt.event.ActionEvent evt) {
if (evt.getSource() == jButton1) {
NewJFrame.this.boton1(evt);
}
}// </editor-fold>

En la sección de código editable:

private void boton1(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}

En la declaración de la clase:
public class NewJFrame extends javax.swing.JFrame implements ActionListener

Y la declaración del botón, dentro del código generado:

jButton1 = new javax.swing.JButton();
jButton1.addActionListener(this);

Tanto ActionEvent como ActionListener son clases de AWT; sin embargo, el botón, que es de Swing, añade el listener a la lista de listeners, que es del tipo EventListenerList, una clase de Swing.

No tienes por qué preocuparte de esos detalles internos cuando añades un listener a un componente de Swing. Siempre que añades un listener a un componente de Swing, los eventos lanzados por el componente se recogen en ese listener.

http://docs.oracle.com/javase/tutorial/uiswing/events/

agosto 26, 2013 | Registered Commenterchoces