Foro sobre Java SE > Actualizar JLabel desde Clase
Estás creando varios JFrame. Si solo quieres tener uno, asegúrate de tener una sola clase que extiende JFrame, y de crear un solo objecto de esa clase.
Te puede ayudar añadir más líneas System.out.println, e incluir en todas ellas un texto que diga "Valor de i en un objeto de clase X, método m: " (donde "i" es una variable que quieras vigilar, y "X" y "m" son los nombres de la clase y el método donde está la llamada a System.out.println). Así sabrás qué código se está ejecutando cuando aparece el mensaje.
También tienes que revisar las convenciones de nomenclatura en Java. Las clases comienzan por mayúscula (no es "prints", sino "Prints"), las variables y los métodos comienzan por minúscula (no es "Label", sino "label"; no es "Counter()", sino "counter()") y no se usan subrayados, sino camelCase (no es "My_frame()", sino "myFrame()"). Y, por convención y sentido común, para las variables y propiedades se usan sustantivos, porque representan objetos o valores primitivos, y para los métodos se usan casi siempre verbos, porque representan acciones.
Y te voy a poner una pregunta para que pienses en el código que has escrito. ¿Cuántas instancias de JFrame (o descendientes suyos) crea tu programa? Te doy opciones:
a) 2
b) 4
c) 5
d) 8
e) ∞ (infinitos)
hola @johana,
Si entendí bien lo que quieres que un objeto de la clase Prints escriba en un determinado objeto de la clase MyFrame, el problema como lo haces es que cada ves que escribes en un Myframe, creas uno, entonces estas escribiendo en un objeto distinto y como resultado tienes un monto de ventanas lo que te mencionaba @rickiees.
Solución:
que el objeto creado de la clase Prints conozca en que MyFrame imprimir.
pero como lo hago?
hay dos soluciones que tu método counter reciba como parámetro un objeto MyFrame o que sea una propiedad, ye mostrare lo segundo
//modificare un poco tu clase
------ // LOOP
package gui;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Prints {
//Prints ya no hereda de JFrame porque no es necesario ya que el solo se encarga
//de escribir en uno.
private Myframe out;//es el objeto donde escribira Prints
public void setOut(Myframe out){
this.out=out;
}
public Myframe getOut(){
return this.out;
}
prints() { }
public void Counter(){
//no hace nada si no has seteado un objeto Myframe
if(out!=null){
int x = 20;
for(int i =0; i < 21; i++){
System.out.println(i);
String n = Integer.toString(i);
out.c_text(n);
}
}//fin del if
else{
System.out.println("Out es null.");
}
}//fin del metodo
}//fin de la clase
ahora cambiamos tu main class
---------- // MAIN CLASS
package gui;
public class Gui {
public static void main(String[] args) {
Myframe a = new Myframe();
a.My_frame();
Prints b = new Prints();
b.setOut(a);
b.Counter();
}
}
por cierto si Myframe va usar un objeto Frame, entonces el no necesita heredar de JFrame porque no va ser un frame, asi que agregando otras cosa a la que te menciono @rickiees no heredes si no lo vas utilizar, primero porque haces confuso el código, y segundo porque tu objeto
es mas pesado en cuanto a memoria, por la herencia ya que tiene las propiedades del padre. y si
y si no lo vas a utilizar no tiene sentido reservar esta memoria.
así que ya sabes si quieres comunicación entre objetos, debes especificar a que objeto se va comunicar, y esto se logra, pasándola como parámetro el objeto, o teniéndolo como propiedad del la clase.
Ahora si quieres algo más elaborado para la comunicación puedes usar el patrón observador
link:
https://es.wikipedia.org/wiki/Observer_(patr%C3%B3n_de_dise%C3%B1o)
saludos.
---------- // MAIN CLASS
package gui;
public class Gui {
public static void main(String[] args) {
Myframe a = new Myframe();
a.My_frame();
prints b = new prints();
b.Counter();
}
}
-------- // JFRAME
package gui;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
public class Myframe extends JFrame {
public JLabel Label;
Myframe(){}
public void My_frame(){
prints m = new prints();
JFrame screen = new JFrame("Test");
screen.setSize(1024, 768);
screen.setExtendedState(JFrame.MAXIMIZED_BOTH);
screen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Label = new JLabel("Orginal Text", JLabel.LEFT);
screen.add(Label);
screen.setVisible(true);
screen.add(Label);
}
public void c_text(String text) {
Label.setText(text);
System.out.print(text);
}
}
------ // LOOP
package gui;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class prints extends JFrame{
prints() { }
public void Counter(){
int x = 20;
for(int i =0; i < 21; i++){
System.out.println(i);
Myframe f = new Myframe();
String n = Integer.toString(i);
f.c_text(n);
}
}
}
Prácticamente lo que quiero lograr es que el label se actualice con el resultado, una vez que esta iniciado el jframe no puedo acceder al elemento, si creo un nuevo jframe ( My_frame() ) y le paso el valor desde el loop a Label me crea ventanas nuevas y el valor si se actualiza pero es lo que no quiero crear miles de ventanas...
se que el valor del texto si pasa por que lo imprimo en consola pero al tratar de actualizar el jlabel, es el error.
Muchas gracias de antemano.