我知道这看起来很简单,但我已经在堆栈和其他网站上阅读了这个问题的所有其他版本,但无法弄明白。我甚至简化了这个问题并制作了一个全新的单独程序,只有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
}
答案 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”的新实例。