Wie aktualisiert jLabel oder setText aus einer anderen Klasse in java?
Ich versuche, eines zu erstellen JFrame
wo die jLabel
und Knopf befinden und eine andere Klasse wo ich erstellt habe, eine Methode putTextNow
setzen wird, den text in die jLabel
. Ich habe gelesen, dass es getan werden sollte, mit multithreading, das ist komplizierter, in meinem Teil. Hier sind meine codes:
NewJFrame.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!");
}
}
Wenn ich auf den Knopf drücke, funktioniert es nicht. Es ist nicht die änderung der Beschriftung. Ich bin mit netbeans 8.0. Hier sind meine vollständigen codes
//NewJFrame.java
package test1;
public class NewJFrame extends javax.swing.JFrame {
public NewJFrame() {
initComponents();
}
@SuppressWarnings("unchecked")
//<editor-fold defaultstate="collapsed" desc="Generated Code">
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();
}//</editor-fold>
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 */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* 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);
}
//</editor-fold>
/* 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;
public class NewClass {
public void putTextNow ()
{
NewJFrame nf = neue NewJFrame();
nf.jLabel1.setText("ok");
}
}
- Benötigen Sie eine Referenz in Ihrer neuen Klasse, dass Sie Punkte auf Ihr Etikett 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Ihrem
NewClass
Klasse erstellen Sie eine neue Instanz vonNewJFrame
. Sie versuchen, zu aktualisieren, eine Marke, die nicht in Ihrer aktuellenJFrame
(die Sie sehen). Sie müssen übergeben Sie einen Verweis von IhremJLabel
ausNewJFrame
- und update gibt es unter:sowie
NewClass
wirdMich korrigieren, wenn ich falsch bin, aber es scheint, dass Sie versuchen, zu erstellen ein JFrame enthält ein JButton und einem JLabel. Und den text ändern, wenn Sie auf die Schaltfläche klicken.
Ergänzen, was Deutro gesagt hat. Im Grunde wollen Sie Folgen einem MVC-Muster (Modell-Viewer-Controller).
Was diesem Muster funktioniert, ist die separate Teile des Programms in leicht definiert Elemente, die Trennung der Anliegen, das scheint das zu sein, was Sie versucht haben.
Einem mockup, wie das MVC ist unten.
Erstens die View-Klasse.
Die Model-Klasse (die die Logik für Die MVC)
Und schließlich die Controller
Brauchen Sie nicht multithreading. Der code, den Sie gepostet habe sollte funktionieren, wenn Ihre
NewJFrame
- Klasse hat einepublic
JLabel
mit dem NamenjLabel1
.Wie schon Ihr code sollte schon funktionieren. Außerdem sollten Sie nicht machen Sie Ihren JLabel public in der NewJFrame Klasse. Deklarieren Sie es als privat und mit getter-und setter-Methoden. So etwas wie dieses:
Nun können Sie Ihr Etikett mit: