为了解释这个问题我的意思,我将使用下面的代码示例。想象一下,你有这个功能。
private void fadeButton(JButton b, int timeToFade) {
//Fade code goes here
}
如何将其实现为可以像
一样运行的函数JButton b = new JButton("Press Me");
b.fadeButton(20000);
fadeButton
现在看起来像
private void fadeButton(int timeToFade) {
//Fade code goes here
}
因为该函数是在按钮本身上声明的。
答案 0 :(得分:3)
通常,您创建派生类:
public JFadableButton extends JButton
这将包含方法private void fadeButton(int timeToFade)
。
答案 1 :(得分:2)
简短的回答是:你没有。
更长的答案:
您无法直接在Java中执行此操作(将方法添加到该类源代码之外的类)。在其他语言中可能会有所不同,例如Kotlin提供类似的东西。
在java中,你必须走弯路,例如转向decorator模式。
仅仅是为了记录:我没有提到简单的“你可以扩展那个类”,因为我把你的问题读作“如何直接向JButton添加方法”。但是,当然,创建自己的扩展JButton的类允许您添加方法;但是,当然,它们只存在于派生类的对象上。
答案 2 :(得分:1)
您可以创建一个扩展JButton
的新类,然后添加任何可以帮助您实现所需内容的方法。但这是一个例子,有很多方法可以达到这个目的。
如果您想在其他地方而不是在课堂内使用此方法,请不要将此方法设置为私有。
答案 3 :(得分:1)
您可以使用新类扩展 JButton,从而继承JButton的方法并添加添加自己代码的功能:
public class FadingButton extends JButton {
//Constructors go here
private void fadeButton(int timeToFade) {
//Fade code goes here
}
}
你也可以用另一个类装饰 JButton:
public class JButtonDecorator {
private JButton btn;
//Constructor here
private void fadeButton(int timeToFade) {
//Fade code goes here, hiding the held button
}
//getter and setter method for button
}
或者,如果您想要许多不同的方式来影响您的用户界面,您可以创建一个实用程序类,类似于上面的内容:
//You could use a factory pattern to make this a singleton instead of having static methods
public abstract class UIUtils {
private UIUtils{} //Don't instantiate this class
public static void fadeComponent(JComponent toFade) {
//Fade code goes here
}
//Other static utility methods
}
编辑:利用这些模式。扩展类是不言自明的,是简单继承的一个例子,所以它只是JButton btn = new FadingButton();
的问题。以下是其他人:
要使用装饰器,请将其实例化为与您现在使用的按钮相同的范围。例如:
JButton myButton = new JButton();
//Customize button and add to UI
JButtonDecorator jbDec = new JButtonDecorator(myButton);
jbDec.fadeButton(20000);
虽然按钮是装饰器的一个字段,但它在UI中会正常运行。装饰器只使用有用的方法包装类,例如fadeButton
方法。
要使用实用程序类,有两种方法。一个是两个用静态方法制作一个抽象类(如上所述),有些人认为它形式不好但对简单程序有好处:
UIUtils.fadeComponent(myButton); //It's just that simple!
//The UIUtils class itself is never instantiated.
//All the methods are static, so no instances are needed.
或者,如果您想要更高级的方法,请将实用程序类设为 singleton 。这会将实用程序类更改为:
public class UIUtils {
UIUtils singleton;
private UIUtils{} //Don't instantiate this class publicly
public static UIUtils getInstance() {
if(singleton==null) //This is the first time the method is called
singleton = new UIUtils();
return singleton; //Return the one instance of UIUtils
}
public void fadeComponent(JComponent toFade) {
//Fade code goes here
}
//Other utility methods
}
然后,您将在类级别声明您的UIUtils
对象以在您的UI中使用:
UIUtils uiUtil = UIUtils.getInstance();
代码中的某处:
uiUtil.fadeComponent(myButton);
这种模式对内存更有效,而且更面向对象,但我个人并不觉得它非常适合实用类。
答案 4 :(得分:0)
这是我想到的最简单的方法。你已经得到了它。但只需使用此方法:
private void fadeButton(int timeToFade) {
//Fade code goes here
}
这假设您已经有淡入淡出的代码,是吗?我认为这是你应该使用的那个。您不需要该按钮作为参数。如果要调用方法淡化按钮,只需将其放入ActionListener
即可。因此,在您获得按钮的ActionListener
后,请执行以下操作:btnName.fadeButton(timeToFade);
以下是ActionListener的编码方法:
btnHome.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
}
}