【问题标题】:Java Swing passing instance of class vs anonymous classJava Swing 传递类的实例与匿名类
【发布时间】:2016-10-20 03:18:36
【问题描述】:

我正在学习 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)可能是一种更昂贵的处理方式,因为我们正在传递 MainFrame 的整个实例,而真正需要的只是有关 TextListener 的信息。我想在 MainFrame 中有很多组件的大型程序中,这将开始成为一个问题。这是正确的思考方式吗?当我传递参数“this”时,是 MainFrame 创建的浪费内存的副本还是引用的原始副本的内存位置相同?

【问题讨论】:

  • 当添加this 时,您不会添加整个frame,您只需传递一个引用...因此它不会增加大小...
  • 这里没有具体的问题——你如何设计你的应用程序很大程度上取决于你的应用程序的目的——如果你只是想通过按下按钮在文本字段中添加一些文本,那么你应该只编码那(第一种方式)-如果您有其他目的而不是仅添加文本,那么其他方法可能会更好。

标签: java swing this anonymous-class


【解决方案1】:

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

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

现在,this 只是一个参考,所以没有复制,所以没有更多的内存使用。我认为不实例化匿名类占用的资源更少。

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-01-19
    • 1970-01-01
    • 2015-10-10
    • 2023-03-17
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    相关资源
    最近更新 更多