使用Java:我有一个JFrame
类,以及添加到JPanels
的两个JFrame
的单独类。其中一个JPanel
类中有一些按钮,可以互相交互(当我点击一个按钮时,它可以禁用另一个按钮)。但是,我无法弄清楚如何让按钮调用另一个JPanel
中的方法(在一个单独的类中编写)。
所以,我的程序看起来像这样:
的JFrame
任何提示都表示赞赏,谢谢!
答案 0 :(得分:5)
执行此操作的一种方法是将(使用您的术语)Jpanel1的实例传递给Jpanel2。这不必在构造函数中完成,例如,您可以使用setConnectedPanel(JPanel)
方法。
以下是一些演示您想要做的事情的代码:
MyFrame.java
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class MyFrame extends JFrame {
public MyFrame() {
ReactionPanel rp = new ReactionPanel();
ActionPanel ap = new ActionPanel(rp);
setLayout(new GridLayout(2, 1));
add(ap);
add(rp);
pack();
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new MyFrame();
}
});
}
}
ActionPanel.java
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
public class ActionPanel extends JPanel implements ActionListener {
private ReactionPanel rp;
private JButton button;
public ActionPanel(ReactionPanel rp) {
this.rp = rp;
button = new JButton("Click");
button.addActionListener(this);
this.add(button);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource().equals(button)) {
rp.react();
}
}
}
ReactionPanel.java
import javax.swing.JLabel;
import javax.swing.JPanel;
public class ReactionPanel extends JPanel {
private JLabel label;
public ReactionPanel() {
label = new JLabel("PING");
this.add(label);
}
public void react() {
if(label.getText().equals("PING")) {
label.setText("PONG");
} else {
label.setText("PING");
}
}
}
正如您所看到的,当我编写Swing GUI时,我倾向于覆盖所有JFrame / JPanel,因为我发现它更容易,更灵活但是YMMV。