2012-02-18 56 views
1

我正在構建一個更大的程序,並且我嘗試了幾種方法(所有這些方法都可行),但我目前喜歡這種方法,但我不知道它的某些方面是否代表糟糕的編程實踐。這個例子中使用的代碼只是爲了在不粘貼整個代碼的情況下實現這個想法。Java - 這是一個類的使用來編輯一個標籤壞習慣嗎?

此代碼(粘貼在下面)使用標籤和靜態方法創建一個新的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); 
    } 

} 

非常感謝的人誰可以幫助我,非常感謝。只是試圖學習和理解良好的做法,爲什麼他們的工作。

+1

這很好,你只會有一個單一的標籤。你可以考慮只用'CalssMain.getLabel()。setText(text);'返回標籤本身。 – rtheunissen 2012-02-18 00:16:24

回答

4

我可能不會使用靜態metods和變量,只是把它改寫像這樣(我也改了個名字 - 一個很好的做法是有一個命名方式的一切,每個人都知道這是什麼意思):

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

} 

類編輯:因爲你做一個靜態variable.That意味着你的主類的任何實例都指向同一個對象的JLabel

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

} 
+0

+1不適用於使用靜態方法和變量。 – camickr 2012-02-18 16:21:34

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!"); 
    } 
}); 
1

兩個實例更新相同的標籤。我花了很長時間才真正瞭解靜力學的工作原理。我的swing應用程序中到處都有靜態變量。

+0

令人困惑的東西,但很好的解釋。因爲它是靜態的,它指的是原始的JLabel對象? – mino 2012-02-18 14:00:33

+1

是的。它基本上是一個全局變量,可能是解釋它的最好方法。我在這個概念上掙扎了一段時間。對我來說最好的例子是一個計數器變量。假設你的ClassMain中有一個int計數器,每當你的構造函數創建一個新對象時,你就加1。然後你可以調用ClassMain.getCounter()來查找ClassMain創建了多少個對象。如果變量不是靜態的,那麼每次獲得計數器的值時,它只會是1而不是全局計數。 – Logan 2012-02-18 14:12:56

+0

這可能是一個愚蠢的問題,但爲什麼下一個JLabel在ClassMain類的下一個實例化中更新,只有第一個? – mino 2012-02-18 14:23:11

相關問題