java在动作监听器中引用类
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java在动作监听器中引用类相关的知识,希望对你有一定的参考价值。
我有JPanel包含其他两个JPanels,gamePanel和OptionsPanel。我希望OptionsPanel包含一个按钮,它会在点击时触发gamePanel的方法。有没有更好的方法来做到这一点,而不仅仅是引用对象本身? (我想接下来做op.getParent.getComponents()
)
class OptionsPanel extends JPanel{
OptionsPanel op = this;
public OptionsPanel(){
JButton start = new JButton("Rozwiąż sudoku");
start.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//some code to do
}
});
this.add(start);
}
}
这是包含gamePanel和OptionsPanel的类的片段
public Sudoku () {
Dimension ScreenSize = Toolkit.getDefaultToolkit().getScreenSize();
setPreferredSize( new Dimension(1000,550) );
GamePanel gamePanel = new GamePanel();
this.gamePanel = gamePanel;
OptionsPanel optionsPanel = new OptionsPanel();
this.optionsPanel = optionsPanel;
add(gamePanel);
add(optionsPanel);
}
答案
Java 8
因为JPanel
扩展Component
,它可以使用Component#setName(String)
命名。我会给gamePanel一个自定义名称,以便它可以在数组中识别。对于eaxmple,您的gamePanel构造函数可能如下所示:
public GamePanel() {
this.setName("gamePanel");
}
你可以用这个名字单挑出来:
start.addActionListener(e -> java.util.Arrays.stream(op.getComponents()).forEach(c -> {
if (c.getName().equals("gamePanel")) {
((GamePanel) c).method();
}
}));
Java 7
如果你不能使用Stream
API或lambda表达式,你可以简单地使用for循环:
start.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < op.getComponentCount(); i++) {
Component c = op.getComponent(i);
if (c.getName().equals("gamePanel")) {
((GamePanel) c).method();
}
}
}
});
其他
还有一种方法更有效,更少杂乱。您可以在GamePanel
构造函数中包含OptionsPanel
参数,并将您的游戏面板传递给:
public OptionsPanel(GamePanel gamePanel){
JButton start = new JButton("Rozwiąż sudoku");
start.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
gamePanel.method();
}
});
this.add(start);
}
然后,您需要做的就是更改构造optionsPanel实例的方式:
public Sudoku () {
Dimension ScreenSize = Toolkit.getDefaultToolkit().getScreenSize();
setPreferredSize( new Dimension(1000,550) );
GamePanel gamePanel = new GamePanel();
this.gamePanel = gamePanel;
// Pass your GamePanel instance to the constructor.
OptionsPanel optionsPanel = new OptionsPanel(gamePanel);
this.optionsPanel = optionsPanel;
add(gamePanel);
add(optionsPanel);
}
以上是关于java在动作监听器中引用类的主要内容,如果未能解决你的问题,请参考以下文章