我正在跟踪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中包含很多组件的较大程序中,这将成为一个问题。这是思考的正确方法吗?当我传递参数“ this”时,是MainFrame创建的副本浪费了内存,还是引用了原始副本的相同内存位置?

最佳答案

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

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

现在,this只是一个参考,因此不进行任何复制,因此不再使用更多的内存。我认为不实例化匿名类会占用更少的资源。

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

10-08 13:46