我有一个名为myJPanel1的类,在其中创建了一个Student类的实例。我还在myJPanel1中创建了一个按钮,用于显示有关此新学生的信息。当我单击该按钮时,我想在名为JPanel的类中编写的单独的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());
        }
    }
}

09-27 23:05