gpt4 book ai didi

Java Swing 传递类实例与匿名类

转载 作者:行者123 更新时间:2023-11-30 02:46:09 26 4
gpt4 key购买 nike

我正在学习 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 是一个基本上在按钮和文本区域之间进行通信的接口(interface),这样当按下按钮时,该按钮内的文本将出现在文本区域中。

这两种方法是否被认为是更好的方法?实际上是否存在我没​​有意识到的显着差异?

对我来说,第二种方法(MainFrame 实现 TextListener)可能是一种更昂贵的处理方式,因为当真正需要的只是有关 TextListener 的信息时,我们正在传递 MainFrame 的整个实例。我想在一个较大的程序中,MainFrame 中有很多组件,这将开始成为一个问题。这是正确的思考方式吗?当我传递参数时,“this”是 MainFrame 创建的浪费内存的副本,还是引用的原始副本的相同内存位置?

最佳答案

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

还有第三种选择 - 创建一个单独的类来自行实现该接口(interface)。该选项允许为监听器定义构造函数。有时这很有用。

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

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

关于Java Swing 传递类实例与匿名类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40144848/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com