Java - 这是使用类来编辑标签的不良做法吗?

时间:2012-02-18 00:12:15

标签: java swing class instantiation

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

此代码(粘贴在下面)创建一个新的ClassMain对象,该对象带有标签和静态方法来编辑标签。 ClassEditor是从ClassMain实例化的,它返回一个按钮。

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

很抱歉,如果这些问题很复杂,很难完全问清楚。我已经提供了下面的代码,以便您可以看到我的目标。

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

ClassMain:

import java.awt.GridLayout;

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


public class ClassMain extends JFrame {

    private static JLabel l;

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

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

        ClassEditor ce = new ClassEditor();

        add(l);
        add(ce.getButton());

        setVisible(true);
    }

    public static void setLabel(String stringA) {
        l.setText(stringA);
    }

}

类编辑:

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


public class ClassEditor implements ActionListener {

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

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

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

}

非常感谢能够帮助我的人,非常感谢。只是尝试学习和理解良好实践以及它们的工作原理。

3 个答案:

答案 0 :(得分:4)

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

ClassMain:

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);
    }

}

答案 1 :(得分:3)

虽然这有效,但它有一个很大的问题,即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!");
    }
});

答案 2 :(得分:1)

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