从另一个匿名类访问匿名类中的“无名”Jbutton?

时间:2008-11-13 09:38:29

标签: java swing actionlistener keylistener

我在匿名actionListener中创建了26 JButton ,标记为字母表中的每个字母。

for (int i = 65; i < 91; i++){
    final char c = (char)i;
    final JButton button = new JButton("" + c);
    alphabetPanel.add(button);
    button.addActionListener(
        new ActionListener () {
            public void actionPerformed(ActionEvent e) {
                letterGuessed( c );
                alphabetPanel.remove(button);
            }
        });
        // set the name of the button
        button.setName(c + "");
} 

现在我有一个匿名keyListener类,我想根据键盘上按下的字母禁用按钮。因此,如果用户按下A,则禁用 A 按钮。鉴于我目前的实施情况,这甚至可能吗?

3 个答案:

答案 0 :(得分:6)

难道你不能简单地在类级别声明一个包含26个JButton对象的数组,这样两个侦听器都可以访问它们吗?我相信匿名内部类可以访问类变量以及最终变量。

答案 1 :(得分:1)

我不知道您是要禁用该按钮还是要删除它?在您的代码中,您正在调用删除,在您的回答中,您正在谈论禁用。您可以通过向alphabetPanel添加KeyListener来实现此目的。所以你可以在开始for循环之前添加它:

InputMap iMap = alphabetPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap aMap = alphabetPanel.getActionMap();

而不是你的ActionListener添加到JButton调用这个:

iMap.put(KeyStroke.getKeyStroke(c), "remove"+c);
aMap.put("remove"+c, new AbstractAction(){
    public void actionPerformed(ActionEvent e) {
        // if you want to remove the button use the following two lines
        alphabetPanel.remove(button);
        alphabetPanel.revalidate();
        // if you just want to disable the button use the following line
        button.setEnabled(false);
    }
});

答案 2 :(得分:0)

您还可以遍历组件,将getText()与按下的键进行比较。

正如其他人提到的,匿名类也可以访问外部类的成员以及本地决赛