2012-02-18 8 views
1

私ははるかに大きなプログラムを構築していますが、いくつかの方法を試しましたが、現在はこの方法が好きです。この例で使用されているコードは、コード全体を貼り付けることなくアイデアを得るためのものです。Java - ラベルの悪い習慣を編集するのに、このクラスを使用していますか?

このコード(以下に貼り付けます)は、ラベルとスタティックメソッドを使用してラベルを編集する新しいClassMainオブジェクトを作成します。 ClassEditorはClassMainからインスタンス化され、ボタンを返します。

ここで私はそれが悪い習慣であるかどうかを知りたがっています。クリックすると、ClassMainの静的メソッドが呼び出され、そのラベルが乱数に設定されます。私が実際にClassMainオブジェクトの直接インスタンス化からメソッドを呼び出すわけではないので、私はそれが悪い習慣であるかどうか疑問に思っている理由は、私だけです:ClassMain.setLabel("");。そして、私はこれが何を呼んでいるのか完全にはわからない。私はClassMainのインスタンスを1つ持っていますが、複数の場合はまだ動作しますか?では、参照変数を使用するのではなく、このようにして作成されたオブジェクトのアスペクトをどのように編集できますか?私が複数のクラスを持っていたら、それは問題を作りますか?

ご迷惑をおかけして申し訳ございませんが、正確に質問するのは難しいです。以下のコードを用意して、私が何をしているかを見ることができます。

PS:ClassMainの複数のオブジェクトの問題であるとの問題に関して、私は両方のウィンドウに両方のボタンを作成して、1つのラベルのみを更新しました。どうしてこれなの?これは、1つのインスタンス化に使用すると悪い習慣ではないが、それ以上使用すると悪いことを意味するのだろうか?私は誰かがこれらの問題で私を助けることを願っています!

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

} 

ClassEditor:私を助けることができる誰にでも

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

これは完全にうまくいきます。あなたは1つのラベルしか持たないでしょう。代わりに 'CalssMain.getLabel()。setText(text);'のようなものでラベル自体を返すことも考えられます。 – rtheunissen

答えて

4

私はおそらく私も名前を変更する(このようにそれを書き換えるだけで、静的metodsと変数を使用していないでしょう。

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

もう一つの一般的なパターンは、匿名のリスナーを使用することです誰もがそれがどういう意味を知っていること)の方法で指定されたすべてのものを持っている:

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

} 

ClassEditor:あなたはそれが静的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

3

これは機能しますが、ClassEditorはClassMainと緊密に結合されているため、他の目的では再利用できないという大きな問題があります。

JButtonをそのコンストラクタのエディタクラスに渡す方が良いでしょう。

このような疎結合によって、コードが簡単になり、変更が容易になり、再利用が容易になり、テストが容易になります。 - 良い習慣がある

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

両方のインスタンスが同じラベルを更新しました。統計がどのように機能するかを実際に理解するまでには、長い時間がかかりました。私はスイングアプリのどこでも静的変数を持っていました。

+0

混乱しているものの、良い説明です。それは静的なので、元のJLabelオブジェクトを参照していますか? – mino

+1

はい。これは基本的にグローバル変数であり、これを説明する最良の方法です。私はしばらくこのコンセプトに苦しんでいました。私にとって最良の例は、カウンター変数です。 ClassMainにintカウンタがあり、コンストラクタが新しいオブジェクトを作成するたびに1を加算するとします。次に、ClassMain.getCounter()を呼び出して、ClassMainが全体的に作成したオブジェクトの数を調べることができます。変数が静的でない場合は、カウンタの値を取得するたびに、グローバルカウントの代わりに1になります。 – Logan

+0

これは愚かな質問かもしれませんが、なぜClassMainクラスの次のインスタンス化で次のJLabelが更新されないのですか? – mino

関連する問題