从另一个类更改jLabel的内容

时间:2018-01-17 22:14:36

标签: java swing user-interface netbeans label

我知道这看起来很简单,但我已经在堆栈和其他网站上阅读了这个问题的所有其他版本,但无法弄明白。我甚至简化了这个问题并制作了一个全新的单独程序,只有6行代码,但它仍然无法正常工作,我将解释......

我正在创建游戏,它需要两个jframe。当我点击FRAME1上的按钮时,我想要更改FRAME2上的jlabel。最初我想要标签'要更改为输入到FRAME1上的文本字段中的文本的内容,但在我开始挣扎之后,我更加简化了它以尝试解决问题的根源。

请附上我的FRAME1和FRAME2代码。

FRAME1:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    FRAME2 set = new FRAME2();
    set.setval("f");
}  

我只包含了我添加的代码,其余代码是在NetBeans IDE中生成的计算机。

式2:

public void setval(String v){
    val=v;
    System.out.println(val);
}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)   {                                         
    jLabel1.setText(val);         
} 

更新 - 完整计划

第1课

package crossjframe.image.change.test;


public class CrossjframeImageChangeTest {


public static void main(String[] args) throws InterruptedException {
   a a = new a ();
   a.setVisible(true);
     b b = new b ();
   b.setVisible(true);
}

}

第2类

package crossjframe.image.change.test;


public class a extends javax.swing.JFrame {


public a() {
    initComponents();
}


// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    jButton1 = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    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(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
            .addContainerGap(97, Short.MAX_VALUE)
            .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 171, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(132, 132, 132))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGap(77, 77, 77)
            .addComponent(jButton1)
            .addContainerGap(198, Short.MAX_VALUE))
    );

    pack();
}// </editor-fold>                        

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
b set = new b();
set.setval("f");
}                                        


public static void main(String args[]) {

    //<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(a.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(a.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(a.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(a.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>


    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new a().setVisible(true);
        }
    });
}

// Variables declaration - do not modify                     
private javax.swing.JButton jButton1;
// End of variables declaration                   
}

第3类

package crossjframe.image.change.test;


public class b extends javax.swing.JFrame {
String val="k";

public b() {
    initComponents();
}

// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    jLabel1 = new javax.swing.JLabel();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jLabel1.setText("jLabel1");
    jLabel1.addMouseListener(new java.awt.event.MouseAdapter() {
        public void mouseClicked(java.awt.event.MouseEvent evt) {
            jLabel1MouseClicked(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()
            .addContainerGap()
            .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 376, Short.MAX_VALUE)
            .addContainerGap())
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 49, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addContainerGap(238, Short.MAX_VALUE))
    );

    pack();
}// </editor-fold>                        

private void jLabel1MouseClicked(java.awt.event.MouseEvent evt)   {                                     
    // TODO add your handling code here:
}                                    
public void setval(String v){
val=v;
System.out.println(val);
jLabel1.setText(val); 
}

public static void main(String args[]) {

    //<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(b.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(b.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(b.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(b.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>


    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new b().setVisible(true);
        }
    });
    }

// Variables declaration - do not modify                     
private javax.swing.JLabel jLabel1;
// End of variables declaration                   
}

2 个答案:

答案 0 :(得分:1)

因此,为了更改任何对象的值,您需要对所述对象的引用。

虽然有些人会建议将JLabel的引用从第一个窗口传递到第二个窗口,但出于多种原因我会避免这种情况......

  • 它耦合了代码。您现在在两个窗口之间存在直接依赖关系,因此无法在不影响其中一个类的情况下修改代码
  • 它将标签暴露给第二个窗口部分的不受控制的修改(以及提供一种方法,通过该方法,第二个窗口可以访问其不应了解的第一个窗口的其他信息并执行它应该执行的操作被允许)。

可能会建议您创建一个interface,它提供第二个窗口需要的功能(设置标签值),第一个窗口符合该功能,然后将第一个窗口的引用传递给第二个窗口窗口。

这不是一个坏主意,但我们仍然可以做得更好。

大多数UI开发人员推动的主要原则之一是“模型 - 视图 - 控制器”的概念,它是“责任分离”概念的一部分。

这个想法是,实际上并不是UI负责进行状态(即得分),责任实际上是“模型”。这允许您将模型的引用传递给任意数量的视图,并且它们将使用它的信息来显示它们所需的状态。

在你的情况下,这意味着第一个窗口将更新模型的状态(通过控制器),然后模型将生成一个合适的事件通知,第二个窗口将被注册到,并且当被触发时,相应地更新UI的状态。

这通常被称为“观察者模式”。

根据代码的可用代码段,每次单击按钮时都会创建FRAME2的新实例,这是一个坏主意,并将值传递给它,但实际上并未应用标签的值,无论如何都可能是静音的,因为框架可能不可见 - 或者你知道屏幕上有三个窗口都显示不同的东西

答案 1 :(得分:0)

  

单击FRAME1上的按钮

所有ActionListener代码都会更改“val”变量的文本。

您实际上没有更新标签的文字。

如果要更新标签文本,则需要更新标签本身:

public void setval(String v) 
{
    //val=v;
    //System.out.println(val);
    jlabel1.setText( v );
}

编辑:

首先学习使用适当的Java命名约定。类名应以大写字符开头。您的“a”或“b”类都不遵循这些约定,使您的代码难以阅读。如果您希望人们花时间查看您的代码,那么让您的代码可读!

在main()方法中,您创建了类“a”的实例,并创建了类“b”的实例并使框架可见。但是你永远不会保持对“b”类的引用,所以你再也不能在类“b”上调用一个方法了。

在类“a”的ActionListener中,您创建了“b”类的第二个实例并调用了setVal(...)方法,但是您从不使框架可见,因此您永远不会看到更改。

所以你遇到的主要问题是你的课程设计。如果你想让类“a”调用类“b”的方法,那么你的类“a”需要引用类“b”。最简单的方法是在类“a”的构造函数中创建类“b”,然后为类“b”保留一个实例变量。

您无法继续创建类的新实例来调用类上的方法。您无法创建

的实例

然后在ActionListener代码中,您可以访问类“b”的此实例变量,而不是创建类“b”的新实例。