如何向预先存在的Java组件添加新功能?

时间:2016-07-08 12:37:23

标签: java

为了解释这个问题我的意思,我将使用下面的代码示例。想象一下,你有这个功能。

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
}

因为该函数是在按钮本身上声明的。

5 个答案:

答案 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) {
    }
}