繁体   English   中英

在类java之间进行通信

[英]Communicating between classes java

我有一个名为myJPanel1的类,我在其中创建了Student类的实例。 我还在myJPanel1中创建了一个按钮,显示有关这个新学生的信息。 当我单击该按钮时,我想在单独的JPanel更改按钮的文本,该类在名为myJPanel2类中myJPanel2

我的问题是,我不知道如何让myJPanel1识别的按钮myJPanel2这样我就可以修改按钮的文本。

myJPanel1:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class myJPanel1 extends JPanel implements ActionListener {

    public myJPanel1() {
        super();
        setBackground(Color.yellow);

        Student st1 = new Student("John", "Lodger", 44);
        // the whatsUp of this student has to shown in the other panel

        JButton j11 = new JButton(st1.getInfo());
        j11.addActionListener(this);
        add(j11);

    }

    public void actionPerformed(ActionEvent Event) {
        Object obj = Event.getSource();

        if (obj == j11) {
            j2.setText(st1.whatsUp());
        }
    }  
}

myJPanel2:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class myJPanel2 extends JPanel {

    public myJPanel2() {
        super();
        setBackground(Color.pink);
        //setLayout(new GridLayout(3,1));
        JButton j1 = new JButton("When the user clicks on the button in the UPPER panel");
        add(j1);

        JButton j2 = new JButton("Display here whatsUp from the student in UPPER Panel");
        add(j2);

        JButton j3 = new JButton("===>>>>You CANNOT create a student here <======");
        add(j3);

        JButton j4 = new JButton("It has to be the student from the UPPER Panel");
        add(j4);
    }
}

你需要的是建立某种形式的合同,允许myJPanel1改变的状态myJPanel2不暴露任何部件的零件误操作。

例如, myJPanel1不应该关心myJPanel2想要对信息做什么,只是它可以向它提供信息。

您可以建立一个模型,该模型可以更改各种属性并向感兴趣的各方提供适当的更改通知,或者您可以在myJPanel2提供一个方法,允许myJPanel1提供您需要的信息。

例如...

public class myJPanel2 extends JPanel {
    // You'll want to use these beyond the scope of the
    // constructor
    private JButton j1;
    private JButton j2;
    private JButton j3
    private JButton j4;
    public myJPanel2() {
        super();
        setBackground(Color.pink);
        //setLayout(new GridLayout(3,1));
        j1 = new JButton("When the user clicks on the button in the UPPER panel");
        add(j1);

        j2 = new JButton("Display here whatsUp from the student in UPPER Panel");
        add(j2);

        j3 = new JButton("===>>>>You CANNOT create a student here <======");
        add(j3);

        j4 = new JButton("It has to be the student from the UPPER Panel");
        add(j4);
    }

    public void setText(String text) {
        j2.setText(text);
    }
}

然后在你的actionPerformed方法中,你只需要对myJPanel2进行活动引用并调用它的setText方法,例如......

public class myJPanel1 extends JPanel implements ActionListener {

    private myJPanel2 panel2;

    public myJPanel1() {
        super();
        //...
        panel2 = new MyJPanel2();
        add(panel2);
    }

    public void actionPerformed(ActionEvent Event) {
        Object obj = Event.getSource();

        if (obj == j11) {
            panel2.setText(st1.whatsUp());
        }
    }  
}

发生这种情况是因为你没有任何对按钮的引用,你创建它们并将它们分配给一个临时引用,当构造函数完成时它的作业j1将没有任何生存变量来保存它们。

您应该将按钮移动到JPanel类中。

例:

public class myJPanel2 extends JPanel {

    public JButton j1;

    public myJPanel2() {
        super();
        setBackground(Color.pink);
        //setLayout(new GridLayout(3,1));
        j1 = new JButton("When the user clicks on the button in the UPPER panel");
        add(j1);
        ....
    }
}

评论:如果您想在全班使用它的按钮, myJPanel1如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM