¿Cómo actualizar jLabel o setText de otra clase en java?

Estoy tratando de crear un JFrame donde se jLabel el jLabel y el botón y otra clase donde he creado un método putTextNow que establecerá el texto en el jLabel . He leído que debería hacerse utilizando subprocesos múltiples que es más complicado en mi parte. Aquí están mis códigos:

NuevoJFrame.java

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { NewClass nc = new NewClass(); nc.putTextNow(); } 

NewClass.java

 package test1; public class NewClass { public void putTextNow () { NewJFrame nf = new NewJFrame(); nf.jLabel1.setText("OK!"); } } 

Cuando presiono el botón, no está funcionando. No está cambiando la etiqueta. Estoy usando netbeans 8.0. Aquí están mis códigos completos

//NewJFrame.java

paquete test1;

la clase pública NewJFrame extiende javax.swing.JFrame {

 public NewJFrame() { initComponents(); } @SuppressWarnings("unchecked") //  private void initComponents() { jLabel1 = new javax.swing.JLabel(); jButton1 = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jLabel1.setText("jLabel1"); jButton1.setText("jButton1"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(114, 114, 114) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 107, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(layout.createSequentialGroup() .addGap(23, 23, 23) .addComponent(jButton1))) .addContainerGap(179, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(96, 96, 96) .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 73, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(43, 43, 43) .addComponent(jButton1) .addContainerGap(65, Short.MAX_VALUE)) ); pack(); }//  private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { NewClass nc = new NewClass(); nc.putTextNow(); } public static void main(String args[]) { /* Set the Nimbus look and feel */ // /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html */ try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (InstantiationException ex) { java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } // /* Create and display the form */ java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new NewJFrame().setVisible(true); } }); } // Variables declaration - do not modify public javax.swing.JButton jButton1; public javax.swing.JLabel jLabel1; // End of variables declaration 

}

//NewClass.java

  package test1; 

clase pública NewClass {public void putTextNow () {
NewJFrame nf = new NewJFrame (); nf.jLabel1.setText (“ok”); }}

 NewJFrame nf = new NewJFrame(); nf.jLabel1.setText("OK!"); 

En su clase NewClass está creando una nueva instancia de NewJFrame . Está intentando actualizar una etiqueta que no se encuentra en su JFrame actual (el que está viendo). Tienes que pasar una referencia de tu JLabel desde NewJFrame y actualizar desde allí:

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { NewClass nc = new NewClass(); nc.putTextNow(myJLabel); } 

y NewClass convierte en

 public class NewClass { public void putTextNow (JLabel label) { label.setText("OK!"); } } 

Corríjame si estoy equivocado, pero parece que está intentando crear un JFrame que contiene un JButton y un JLabel. Y hacer que el texto cambie una vez que haga clic en el botón.

Para ampliar lo que ha dicho Deutro. Básicamente desea seguir un patrón MVC (Modelo, Visor, Controlador).

Lo que hace este patrón es separar las partes del progtwig en elementos fácilmente definidos que permiten una separación de preocupaciones, esto parece ser lo que ha intentado.

A continuación se muestra una maqueta de cómo configurar el MVC.

En primer lugar la clase vista.

 package mvctest; import javax.swing.JFrame; import javax.swing.JLabel; import java.awt.BorderLayout; import javax.swing.JButton; public class View extends JFrame { private JLabel lblNewLabel; private JButton btnNewButton; public View() { lblNewLabel = new JLabel("New label"); getContentPane().add(lblNewLabel, BorderLayout.NORTH); btnNewButton = new JButton("New button"); getContentPane().add(btnNewButton, BorderLayout.SOUTH); } public JButton getBtnNewButton() { return btnNewButton; } public JLabel getLblNewLabel() { return lblNewLabel; } } 

La clase de modelo (la lógica para tu MVC)

 package mvctest; public class Model { private View view; public Model(View view) { this.view = view; } public void changeText() { view.getLblNewLabel().setText("Changed text"); } } 

Y finalmente el controlador.

 package mvctest; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Controller { public Controller() { View view = new View(); Model model = new Model(view); view.getBtnNewButton().addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { model.changeText(); } }); } } 

No necesitas multihilo. El código que has publicado debería funcionar si tu clase NewJFrame tiene una JLabel public con el nombre jLabel1 .

Como ya se ha señalado, su código ya debería funcionar. Además, no debes hacer público tu JLabel en la clase NewJFrame. Declararlo como privado y acceder a él con métodos get y setter. Algo como esto:

 public class NewJFrame extends JFrame{ private JLabel myLabel; public String getMyLabel() { return myLabel.getText(); } public void setMyLabel(String string) { myLabel.setText(string); } } 

Ahora puedes configurar tu etiqueta con:

 nf.setMyLabel("Set my label to this string");