Java Swing传递类与匿名类的实例

时间:2016-10-20 03:18:37

标签: java swing this anonymous-class

我正在关注Swing教程,我找到了两种方法来使下面的代码工作。基本上我们正在创建一个框架并在其中放置按钮和文本区域。据我所知,他们实现了相同的功能,但我很好奇下面是什么区别/如果一个更好的方法用于大型项目。

这是教程中显示的方式:

public class MainFrame extends JFrame {

    private TextPanel textPanel;
    private ButtonPanel buttonPanel;

    public MainFrame(String title){
        this.setTitle(title);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(800,600);
        this.setLayout(new BorderLayout());


        this.textPanel = new TextPanel();
        this.buttonPanel = new ButtonPanel();

        this.buttonPanel.setTextListener(new TextListener(){
            public void deliverText(String text) {
                textPanel.appendText(text);
            }
        });     

        this.add(textPanel, BorderLayout.CENTER);
        this.add(buttonPanel, BorderLayout.SOUTH);
        this.setVisible(true);
    }

这是我在弄乱代码时发现的另一种方法:

public class MainFrame extends JFrame implements TextListener{

    private TextPanel textPanel;
    private ButtonPanel buttonPanel;

    public MainFrame(String title){
        this.setTitle(title);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(800,600);
        this.setLayout(new BorderLayout());

        this.textPanel = new TextPanel();
        this.buttonPanel = new ButtonPanel();
        this.buttonPanel.setTextListener(this); 

        this.add(textPanel, BorderLayout.CENTER);
        this.add(buttonPanel, BorderLayout.SOUTH);
        this.setVisible(true);
    }

     public void deliverText(String text){
        this.textPanel.appendText(text);
     }

}

TextListener是一个基本上在按钮和文本区域之间进行通信的界面,这样当按下按钮时,该按钮内的文本将出现在文本区域中。

这些方法中的任何一种都被认为是更好的方法吗?实际上是否存在我不知道的显着差异?

对我而言,似乎第二种方法(MainFrame实现TextListener)可能是一种更昂贵的处理方式,因为当真正需要的是有关TextListener的信息时,我们传递的是MainFrame的整个实例。我想,在一个更大的程序中,MainFrame中有很多组件,这将开始成为一个问题。这是考虑它的正确方法吗?当我通过论证"这个"是MainFrame创建的浪费内存的副本还是与引用的原始副本相同的内存位置?

2 个答案:

答案 0 :(得分:2)

由于这里有一个简单的例子,它确实不是你使用的问题。

还有第三个选项 - 创建一个单独的类,它自己实现接口。该选项允许为侦听器定义构造函数。有时这很有用。

现在,this只是一个引用,因此不会创建副本,因此不再使用内存。我认为不实例化匿名类需要的资源更少。

基本上,我是如何解释这种方法的,当时有许多不同的按钮都添加了this作为界面。在接口方法的实现中,使用if语句检查按钮的源。与为每个组件处理相同事件添加单独的匿名类相比,这需要的资源更少。

答案 1 :(得分:0)

如果您的代码附加除了按钮以外的其他位置的文本是有益的,请使用非匿名void deliverText(String text)方法。

否则请使用匿名TextListener。唯一的缺点是你在编译的类/ JAR中有一个额外的.class文件。