扩展java swing按钮?

扩展java swing按钮?,java,swing,jbutton,Java,Swing,Jbutton,我希望每个JButton也有一个与之关联的数字或id。这就是为什么我决定扩展JButton类来创建SuperJButton类 如何在单击此按钮时生成的操作事件中包含id/编号的值,以便响应此操作的类可以访问id?您不必更改操作事件。您可以这样做 SuperJButton jButton = (SuperJButton) actionEvent.getSource(); jButton.getId() jButton.getNumber() 您不必更改动作事件。您可以这样做 SuperJBut

我希望每个JButton也有一个与之关联的数字或id。这就是为什么我决定扩展JButton类来创建SuperJButton类


如何在单击此按钮时生成的操作事件中包含id/编号的值,以便响应此操作的类可以访问id?

您不必更改操作事件。您可以这样做

SuperJButton jButton = (SuperJButton) actionEvent.getSource();
jButton.getId() 
jButton.getNumber()

您不必更改动作事件。您可以这样做

SuperJButton jButton = (SuperJButton) actionEvent.getSource();
jButton.getId() 
jButton.getNumber()

另一种不需要子分类的方法是使用
JComponent.putClientProperty(对象键,对象值)
存储与按钮关联的ID

可以使用
getClientProperty(对象键)
检索它


这可能更灵活一些,因为您可以将此ID附加到每个按钮,而无需使用特定于应用程序的代码,例如,当使用GUI生成器时,更改按钮的创建代码有点复杂,或者当您需要使用现有组件时。

另一种不需要子分类的替代方法,可以使用
JComponent.putClientProperty(对象键,对象值)
存储与按钮关联的ID

可以使用
getClientProperty(对象键)
检索它



这可能更灵活一些,因为您可以将此ID附加到每个按钮,而无需使用特定于应用程序的代码,例如,在使用GUI生成器时,更改按钮的创建代码有点复杂,或者当您需要使用已有的组件时。

MVC
的角度来看:
JButton
是一个
视图
,而
JButton
类不是像
id
这样的更好的地方。id的更好位置是在您自己的
按钮模型
实现中。

MVC
的角度来看:
JButton
是一个
视图
,而
JButton
类并不是类似
id
的更好位置。id的更好位置是在您自己的
ButtonModel
实现中。

您可以通过使用
ae.getSource()
获得生成操作的源表单,在您的例子中是super按钮,其中
ae
ActionEvent
的参考。通过这种方式,您可以访问生成操作的按钮,然后可以获取与其关联的id。为什么要将id字段包含在其中。?它只是用来调查点击了哪个按钮吗?@VallabhPatade-没错。为什么要处理与该按钮关联的文本字符串?这就是网络上所有的示例代码响应一个动作所做的。不要扩展,JSomething就是要按原样使用的。不管怎样,你为什么要识别按钮?它已经有了各种各样的选项(f.i.它的name属性、actionCommand/name/Action上的任意值、clientProperty)——为什么这些选项都不能满足您的需要?哦,刚刚注意到为什么已经被问到了——虽然没有令人信服的答案,但是:字符串没有什么问题…@kleopatra:那不是真的。子类JComponent(或任何其他JXxxx类)完全可以。这就是拥有面向对象GUI框架的优势。任何构建在Swing之上的库/框架都将子类Swing组件(想想NetBeans平台或SwingX库),您可以通过使用
ae.getSource()
来获取生成操作的源代码表单,在您的例子中,超级按钮是通过
ae.getSource()
来实现的,其中
ae
ActionEvent
的引用。通过这种方式,您可以访问生成操作的按钮,然后可以获取与其关联的id。为什么要将id字段包含在其中。?它只是用来调查点击了哪个按钮吗?@VallabhPatade-没错。为什么要处理与该按钮关联的文本字符串?这就是网络上所有的示例代码响应一个动作所做的。不要扩展,JSomething就是要按原样使用的。不管怎样,你为什么要识别按钮?它已经有了各种各样的选项(f.i.它的name属性、actionCommand/name/Action上的任意值、clientProperty)——为什么这些选项都不能满足您的需要?哦,刚刚注意到为什么已经被问到了——虽然没有令人信服的答案,但是:字符串没有什么问题…@kleopatra:那不是真的。子类JComponent(或任何其他JXxxx类)完全可以。这就是拥有面向对象GUI框架的优势。任何构建在Swing之上的库/框架都将子类Swing组件(想想NetBeans平台或SwingX库),但如果我们想这样做只是为了找到事件的来源,我们可以使用setActionCommand()和getActionCommand()。要获取事件的源,必须使用
getSource()
,而不是getActionCommand().@VallabhPatade-我认为没有二传手。只有getter@davidblaine:在构造函数中提供action命令。如果我回忆正确,当按钮创建
ActionEvent
时,它将从与
JButton
@davidblaine关联的
action
传递操作命令:调用
actionPerformed()
方法的源将创建
ActionEvent
事件,并将自身作为源传递。你为什么不试试呢?或者阅读JavaDocs,或者检查源代码?但是如果我们只是想找到事件的源代码,我们可以使用setActionCommand()和getActionCommand()。要获取事件的源代码,必须使用
getSource()
,而不是getActionCommand()。@VallabhPatade-我认为没有setter。只有getter@davidblaine:在构造函数中提供action命令。如果我回忆正确,当按钮创建
ActionEvent
时,它将从与
JButton
@davidblaine关联的
action
传递操作命令:调用
actionPerformed()
方法的源将创建