Java—使用类编辑标签是一种不好的做法吗?

Java—使用类编辑标签是一种不好的做法吗?,java,swing,class,instantiation,Java,Swing,Class,Instantiation,我正在构建一个大得多的程序,我尝试了几种方法(所有方法都有效),但我现在喜欢这种方法,尽管我不知道它的某些方面是否代表了糟糕的编程实践。本例中使用的代码只是为了在不粘贴整个代码的情况下传达想法 这段代码(粘贴在下面)创建了一个新的ClassMain对象,其中包含一个标签和一个编辑标签的静态方法。ClassEditor是从ClassMain实例化的,它返回一个按钮 现在我想知道这是否是一个坏习惯,我在按钮上有一个动作,当点击按钮时,调用ClassMain中的静态方法,并将标签设置为随机数。我想知道

我正在构建一个大得多的程序,我尝试了几种方法(所有方法都有效),但我现在喜欢这种方法,尽管我不知道它的某些方面是否代表了糟糕的编程实践。本例中使用的代码只是为了在不粘贴整个代码的情况下传达想法

这段代码(粘贴在下面)创建了一个新的ClassMain对象,其中包含一个标签和一个编辑标签的静态方法。ClassEditor是从ClassMain实例化的,它返回一个按钮

现在我想知道这是否是一个坏习惯,我在按钮上有一个动作,当点击按钮时,调用ClassMain中的静态方法,并将标签设置为随机数。我想知道这是否是一种不好的做法的原因是,我实际上并没有从ClassMain对象的直接实例化调用该方法,我只是这样做:
ClassMain.setLabel(“”)。我不完全确定这叫什么。我有一个ClassMain的实例化,但如果我有多个,它还能工作吗?那么,如何通过这种方式而不是使用引用变量来编辑已创建对象的各个方面呢?如果我有多个类,它会产生问题吗

很抱歉,如果这些问题是漫无边际的,很难准确地提问。我已经提供了下面的代码,所以你可以看到我在讲什么

PS:关于是否会是ClassMain的多个对象的问题,我创建了另一个,两个窗口中的两个按钮只更新了一个标签。为什么会这样?这是否意味着,如果用于一个实例化,这不是一个坏的实践,但如果用于更多实例化,这是一个坏的实践?我希望有人能帮我解决这些问题

ClassMain:

类编辑器:


非常感谢任何能帮助我的人,非常感谢。只是尝试学习和理解好的实践以及它们为什么会起作用。

尽管这是可行的,但它有一个大问题,即ClassEditor与ClassMain紧密耦合,即它不能用于任何其他目的

最好将JButton传递给其构造函数中的编辑器类

这种松散耦合使代码更简单、更易于修改、更易于重用和测试

public class ClassEditor implements ActionListener {

    JButton button;

    public ClassEditor(JButton b) {
        button = b;
        button.setLabel("Click the button for a random number!");
    } 

    public void actionPerformed(ActionEvent arg0) {
        int i = (int) (Math.random()*10);
        button.setLabel("Random Number: "+i);
    }
}
另一种常见模式是使用匿名侦听器:

final JButton button = new JButton();
button.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
        button.setLabel("Boo!");
    }
});

尽管这是可行的,但它有一个大问题,即ClassEditor与ClassMain紧密耦合,即它不能用于任何其他目的

最好将JButton传递给其构造函数中的编辑器类

这种松散耦合使代码更简单、更易于修改、更易于重用和测试

public class ClassEditor implements ActionListener {

    JButton button;

    public ClassEditor(JButton b) {
        button = b;
        button.setLabel("Click the button for a random number!");
    } 

    public void actionPerformed(ActionEvent arg0) {
        int i = (int) (Math.random()*10);
        button.setLabel("Random Number: "+i);
    }
}
另一种常见模式是使用匿名侦听器:

final JButton button = new JButton();
button.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
        button.setLabel("Boo!");
    }
});

我可能不会使用静态方法和变量,而只是像这样重写它(我还更改了名称-一个好的做法是以每个人都知道其含义的方式命名所有内容):

ClassMain:

类编辑器:


我可能不会使用静态方法和变量,而只是像这样重写它(我还更改了名称-一个好的做法是以每个人都知道其含义的方式命名所有内容):

ClassMain:

类编辑器:


两个实例都更新了相同的标签,因为您将其设置为静态变量。这意味着主类的任何实例都将引用相同的jlabel对象。我花了很长时间才真正理解静力学是如何工作的。我的swing应用程序中到处都有静态变量。

两个实例都更新了相同的标签,因为您将其设置为静态变量。这意味着您的主类的任何实例都将引用相同的jlabel对象。我花了很长时间才真正理解静力学是如何工作的。我的swing应用程序中到处都是静态变量。

很好,你只有一个标签。您可以考虑只返回标签本身,比如“代码> CalsMeNest.GETabelEL())SEText(text);<代码>。很好,你只有一个标签。您可以考虑只返回标签本身,比如“代码> CalsMeNest.GETabelEL())SEText(text);<代码>。混乱的东西,但很好的解释。因为它是静态的,所以它指的是原始的JLabel对象?是的。它基本上是一个全局变量,这可能是解释它的最好方法。我为这个概念挣扎了一段时间。对我来说最好的例子是一个计数器变量。假设在类main中有一个int计数器,每次构造函数创建一个新对象时,都会向该计数器添加1。然后可以调用ClassMain.getCounter()来查找ClassMain总共创建了多少个对象。如果变量不是静态的,那么每次你得到计数器的值时,它将只是1而不是一个全局计数。这可能是一个愚蠢的问题,但是为什么在ClassMain类的下一个实例化中的下一个JLabel不更新,只更新第一个?这根本不是一个愚蠢的问题,实际上是一个非常好的问题。如果看不到所有的代码,很难判断。也许在action-performed方法中放一个System.out.println(),以确保它像您认为的那样调用每个按钮的方法。我总是对静态变量存储在内存中的位置以及其他实例如何知道(除非它们位于同一JVM上)感到困惑。我理解服务器上的概念,但是独立应用程序,如果静态是主类的一部分,我会感到困惑。所以,从你的角度来看,我是不是在用这种糟糕的编程方法?令人困惑的东西,但很好的解释。因为它是静态的,所以它指的是原始的JLabel对象?是的。它基本上是一个全局变量,这可能是解释它的最好方法。我为这个概念挣扎了一段时间。对我来说最好的例子是一个计数器变量。假设在类main中有一个int计数器,每次构造函数创建一个新对象时,都会向该计数器添加1。然后你可以打电话给Cl
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;


public class ClassMain extends JFrame {

    private JLabel label;

    public static void main(String[] args) {
        new ClassMain();
    }

    public ClassMain() {
        super("This is my app");
        setSize(450,80);
        setLayout(new GridLayout(0,2));
        label = new JLabel("Hi");

        ClassEditor classEditor = new ClassEditor(this);

        add(label);
        add(classEditor.getButton());

        setVisible(true);
    }

    public void setLabel(String text) {
        label.setText(text);
    }

}
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;


public class ClassEditor implements ActionListener {

    private ClassMain classMain;

    public ClassEditor(ClassMain classMain) {
        this.classMain = classMain;
        classMain.setLabel("Click the button for a random number!");
    } 

    public JButton getButton() {
        JButton button = new JButton("Click me!");
        button.addActionListener(this);
        return button;
    }

    public void actionPerformed(ActionEvent event) {
        int i = (int) (Math.random()*10);
        classMain.setLabel("Random Number: "+i);
    }

}