我正在为类的GUI java程序工作,其中网格布局中有10个编号按钮。用户试图猜测每个数字唯一的3位数字。当他们点击一个数字时,相应的数字应该存储为猜测中的一个数字,然后应该禁用该按钮。这是在actionPerformed方法中完成的。
我的问题是如何判断哪个按钮被禁用。
目前我正在尝试成功读取该值并禁用一位数的按钮,我的代码如下所示:
private class NumberListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent click){
Object source = click.getSource();
keyTry1 = getButtonNumber(source);
source.setEnabled(false); //error
}
然而,在标记错误的行中,NetBeans抱怨源没有方法setEnabled,可能是因为在方法中它被声明为Object类型。但是,如果我尝试将其声明为JButton,我就不能使用click.getsource();
我知道我可以采用强力方法并拥有一长串if / else语句,或者甚至是另一种根据它代表的数字禁用按钮的方法,但我想知道是否有办法访问源代码一个JButton,因为它显然引用了一个JButton。
答案 0 :(得分:3)
source
是Object
并且没有setEnabled
方法,因此编译器允许您进行此类调用是没有意义的。您需要先将source
的实例设置为适当的类类型。
假设您可以保证动作的来源是按钮,您可以使用类似......
的内容((JButton)click.getSource()).setEnabled(false);
如果您无法保证来源是JButton
,但可能是某种类型的组件,您甚至可能会使用类似的内容......
((Component)click.getSource()).setEnabled(false);
如果您无法保证,那么您需要进行适当的检查(无论如何都要做)......
Object source = click.getSource();
if (source instanceof JButton) {
((JButton)source).setEnabled(false);
}
这个概念是Polymorphism的一个例子,其中Object
的一个实例可以像它的父母那样行事