0

我有一个任务,我必须单击面板 1 中的按钮 1 并更改面板 2 中按钮 2 上的信息,但是我不知道如何传递信息。

我以为我可以将方法 b() 中的信息从 panel2 传递回一个,但这不起作用。

我很困惑,不知道如何推进该计划。任何帮助表示赞赏。

面板1

public class MyJPanel1 extends JPanel implements ActionListener {
    Student st1 = new student("Fred","Fonseca",44);

    JButton j = new JButton(st1.getInfo());
    JButton b1 = new JButton("..");

    public myJPanel1() {
        super();
        setBackground(Color.yellow);
        // the whatsUp of this student has to shown in the other panel
        j.addActionListener(this); 
        add(j);         
    }   
    public void actionPerformed(ActionEvent event) {         
        Object obj = event.getSource();
        //=====================================                            
            if (obj == j){
                b1.setText(st1.whatsUp()); // Output on JButton in JPanel2 
            }
        }
    }
 }

面板2

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

public class myJPanel2 extends JPanel {
    JButton j1 = new JButton("");

    public void b(JButton b1) {
        JButton j1 = b1;            
    }   
    public myJPanel2() {
        super();
        setBackground(Color.pink);
        setLayout(new GridLayout(3,1));
        add(j1);
        // j1.setText(b1);
    }

 }
4

3 回答 3

0

创建一个方法,在MyJPanel2其中设置文本JButton

public class myJPanel2 extends JPanel {
    JButton button = new JButton("");

    ...........

    public void setButtonText(String text) {
        button.setText(text);
    }
}

MyJPanel2中,您需要存储 的引用MyJPanel1setButtonText然后只需调用ActionListener

public class MyJPanel1 extends JPanel implements ActionListener {
    private MyJPanel2 panel;

    public MyJPanel1(MyJPanel2 panel) {
        this.panel = panel;
    }

    public void actionPerformed(ActionEvent event) {                       
            if (obj == j){
                panel.setButtonText(yourText);
            }
        }
    }
 }
于 2013-09-30T18:25:36.420 回答
0

有几件事要记住。Java 是一种面向对象的语言,这意味着您希望使用类来定义您的对象,然后尽可能地重用这些对象。如果您有两个面板,每个面板都包含一个按钮,那么这是定义Class 一次的最佳时机

public class MyPanel extends JPanel{
  protected JButton button;

  public MyPanel(String buttonName){
    button = new JButton(buttonName);
  }
  //etc etc etc
}

然后一遍又一遍地使用 Class

public class MyProgram {
  protected MyPanel panel1;
  protected MyPanel panel2;

  public MyProgram(){
    panel1 = new MyPanel("Button 1");
    panel2 = new MyPanel("Button 2");
  }
  //etc etc
}

现在,一旦您像这样设置了程序,两个面板之间的通信就很容易了,因为在MyProgram中,您的面板的两个实例都可用。

因此,假设您的MyPanel类有一个名为setButtonText的方法

public void setButtonText(String text){
  button.setText(text);
}

您可以在MyProgram中调用此方法以更改其中一个按钮上的文本

myPanel1.setText("New Button 1 text");

但是我们如何知道myPanel1myPanel2中的按钮是否被按下?您可以了解 Java 如何使用ActionListener在不同对象之间传递事件。

祝你好运!

于 2013-09-30T18:27:38.177 回答
0

如果我写海,您没有将这两个面板连接在一起。将它们连接在一起的最好方法是从你声明这两个类的第三类开始。并将这两个类设置为彼此。例子:

class conecctor{

ClassA first;
ClassB secod;
    public void init(){
    {
        first=new ClassA();
        second=new ClassB();
        first.setClasB(second);
        second.setClasA(first);
    }
}
class ClassA{
    ClassB classB;
    public void setClassB(ClassB classB){
       this.classB=classB;
    }
}
class ClassB{
    ClassA classA;
    public void setClassA(ClassA classA){
       this.classA=classA;
    }
}

然后,当您在每个类中有实例时,您可以从 evrywher 调用所有公共方法。

更好的方法是创建接口并仅传递接口(侦听器),如果该类实现接口,则窃取您传递整个类,但它更清晰和其他优点。

于 2013-09-30T18:32:04.760 回答