2008-11-11 87 views
0

我想知道是否有一种方法来实现没有名字的Jbutton的动作监听器。例如,我有以下for循环,为字母表的每个字母创建一个按钮。用于无名JButton的Java actionListener?

for (int i = 65; i < 91; i++){ 
    alphabetPanel.add(new JButton("<html><center>" + (char)i)); 
} 

有,我可以为每个按钮添加一个动作监听器没有摆脱我的for循环和硬编码每一个JButton,然后创建每个动作侦听器的方法吗?

由于提前,

托梅克

回答

4

你的问题有点含糊。这将是微不足道的修改循环添加循环内的监听器:

ActionListener listener = something; 

for (int i = 65; i < 91; i++){ 
    JButton button = new JButton("<html><center>" + (char)i); 
    button.addActionListener(listener); 
    alphabetPanel.add(button); 
} 

,如果你不能改变你可以遍历所有小组的孩子们的环路,并添加监听到任何孩子的那是jbuttons。

也为什么你使用html来居中文本?这不是矫枉过正? jbutton已经不在文本中心了吗?
你可以使用setHorizo​​ntalAlignement(SwingConstants.CENTER)来完成它。

+0

为某种原因,我认为动作监听器的工作方式是在创建之后,它会以某种方式在代码中停止,直到执行一个动作,但我想这会破坏它的全部目的。我改变了它,它完全按照我想要的那样工作。谢谢! P.S. HTML是矫枉过正 – Tomek 2008-11-12 00:10:28

2

这样做的问题是什么?

for (int i = 65; i < 91; i++){ 
    JButton button = new JButton("<html><center>" + (char)i)); 
    button.addActionListener(new ButtonListener()); 
    alphabetPanel.add(button); 
} 

...

class ButtonListener implements ActionListener { 
    ButtonListener() { 
    } 
    public void actionPerformed(ActionEvent e) { 
     //TODO: 
    } 
} 

而且,如果该按钮的文本不识别按钮,你可以用拼音的字母设置按钮的名称。

button.setName((char)i)); // or button.setName(i); 
0

有可能的ActionListener添加到匿名部件象下面这样:

new JButton().addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       // TODO your action    
      }   
     }); 

然而,在你的情况,你试图匿名的JButton添加到您的面板,这种做法会不会因为工作addActionListener方法,方法(它是无效的)的返回类型将被代替采取JButton的构造的,如下所示:

for (int i = 65; i < 91; i++){ 
      alphabetPanel.add(new JButton("<html><center>" + (char)i).addActionListener(new ActionListener(){ 
        @Override 
        public void actionPerformed(ActionEvent arg0) { 
         // TODO your action    
        }   
       })); 
     } 

上述代码抱怨FO约无效的参数r panel.add()方法。

所以在你的情况下,你将不得不创建一个JButton的命名实例。

希望澄清。

最好的问候, 苏雷什

1

通过命名,你似乎意味着该按钮实例存储在您的直接方法的局部变量。试图避免这种情况可能会使您的代码更难以阅读。但要回答你的问题:

最明显的方法是使用旧的,但最近流行的双大括号成语。

alphabetPanel.add(new JButton("<html><center>" + (char)i) {{ 
    addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent event) { 
      ... 
     } 
    }); 
}}); 

注意,在这种情况下,i是不是最终也不会从匿名内部类使用。将其分配给另一个(最终)变量或重新构建循环。

另一条路线是通过一个Action。 (通常我会建议避免行动,因为它们仅仅指刚穷人的哈希表ButtonModel的是“好”,虽然。)

alphabetPanel.add(new JButton(new AbstractAction("<html><center>" + (char)i) { 
    public void actionPerformed(ActionEvent event) { 
     ... 
    } 
})); 

然后,当然还有就是应用特定库的方式:

Form alphabetForm = new Form(alphabetPanel); 
for (char c='A'; c <= 'Z'; ++c) { 
    alphabetForm.button("<html><center>" + c, new ActionListener() { 
     public void actionPerformed(ActionEvent event) { 
      ... 
     } 
    }); 
}