我认为这更好。为什么标签文字没有变化?
主类为NewJFrame形式
public class NewJFrame extends javax.swing.JFrame {
public NewJFrame() {
initComponents();
NewJPanel jpanel = new NewJPanel();
anotherPanel.add(jpanel);
//there is also a label in this frame outside of the anotherPanel
}
}
这是一个JPanel表单。我将此jpanel添加到NewJFrame(anotherPanel)
public class NewJPanel extends javax.swing.JPanel {
public NewJFrame newJFrame;
public NewJPanel() {
initComponents();
this.setSize(200, 200);
//there is a button here
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
this.newJFrame = newJFrame;
newJFrame.jLabel1.setText("Need To change the text from here"); // this is not working, text is not changing
}
}
最佳答案
您的问题是,在您的JPanel代码中,您正在创建一个与正在显示的JFrame完全不同的新JFrame对象:
public NewJPanel() {
NewJFrame newfr = NewJFrame(); // *** here ***
因此,调用NewJFrame方法或设置其字段在可视化的GUI上没有可见的效果。
要解决此问题,必须在可行的引用上调用要更改其行为的类的方法,这里是NewJFrame类。因此,您必须将该类的引用传递到您的NewJPanel类中,也许是在其构造函数中,以便NewJPanel类可以在实际显示的NewJFrame对象上调用方法。
例如:
public class NewJPanel extends javax.swing.JPanel {
private NewJFrame newJFrame;
// pass in the current displayed NewJFrame reference when calling this constructor
public NewJPanel(NewJFrame newJFrame) {
this.newJFrame = newJFrame;
newJFrame.setMyLabelText("qqqqqq");
}
}
然后在NewJFrame类中,传递对可视化JFrame对象
this
的引用:public NewJFrame() {
NewJPanel pane= new NewJPanel(this);
最重要的是,甚至不要以为这些人是JFrames或JPanels。只需将它们视为需要相互通信的类的对象,这通常是通过公共方法完成的。对于GUI而言,这与对于非GUI程序而言没有什么不同。