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在动作监听器中引用类的主要内容,如果未能解决你的问题,请参考以下文章

无法在动作侦听器(Jframe)中引用非变量

java 使手势监听器在片段中可行

无法将其他flas动画片段访问到动作脚本3

3个按钮的通用动作监听器

事件处理机制

如何在片段类而不是活动类中使用底页?