gpt4 book ai didi

java - 从另一个类更改 jLabel 的内容

转载 作者:行者123 更新时间:2023-12-02 11:44:18 24 4
gpt4 key购买 nike

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

我正在创建一个游戏,它需要两个 jframe。当我单击 FRAME1 上的按钮时,我希望 FRAME2 上的 jlabel 发生变化。最初,我希望标签的内容更改为输入到 FRAME1 上的文本字段中的文本,但在我开始努力之后,我进一步简化了它,以尝试找出问题的根源。

请查找随附的我的 FRAME1 和 FRAME2 代码。

框架1:

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
}

最佳答案

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

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

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

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

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

大多数 UI 开发人员所追求的主要原则之一是“模型- View - Controller ”的概念,它是“责任分离”概念的一部分。

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

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

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

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

关于java - 从另一个类更改 jLabel 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48310891/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com