2011-12-06 7 views
0

私はJavaにはあまり新しく、シーザーシフト暗号デコーダを書くことにチャレンジしています。私は基本的に別のクラスからJTextAreaをクリアしようとしています。私は2つのクラス、CrackerGUIとシフトクラスと呼ばれるGUIクラスがあります。 JTextAreaには、以下の方法と一緒にGUIクラスである:別のクラスからJTextAreaをクリアする

public void setPlainTextBox(String text) 
{ 
    plainTextBox.setText(text); 
} 

GUIクラスには、以下でクリアボタンがあります。

private void btnClearActionPerformed(java.awt.event.ActionEvent evt) {           
    Shift classShift = new Shift(); 
    classShift.btnClear(); 
} 

最後に、私はクリアするシフトクラスのメソッドを持っていますJTextArea。

public class Shift extends CrackerGUI { 

public void btnClear() 
{ 
    CrackerGUI gui = new CrackerGUI(); 
    gui.setPlainText(" "); 
    System.out.println("testing"); 
} 
} 

テストテキストはコンソールに出力されていますが、JTextAreaはクリアされません。なぜ私は確信していない:)。私はそれが非常に単純な間違いだと確信していますが、それは私を困惑させます。どんな助けもありがとう。

ありがとうございます。

答えて

-2

静的メソッドを使用すると、新しいGUIが作成され、現在表示されているGUIの代わりに表示されます。

これは、親クラスも静的である必要があります。これは、いくつかのメソッドでエラーが発生する可能性があります。直接現在のGUIのコンポーネントを編集することができますこと

void setText(JTextField t, String s){ 
    t.setText(s); 
} 

さもないと、あなたはあなた自身のsetTextメソッドを作成することができます。

+1

号お風呂の水で赤ちゃんを投げてはいけません.OOPテクニックを使って、もっと簡単に解決できるこの問題を解決するために静的なものを使ってOOPプログラミングを捨てないでください。 –

+0

私は代理人がいると言ったときにも、ディックである必要はありません。 – Matt

+0

@ Firexranger8:あなたの静的な解決法は悪いことです。さらに、内部クラスを除いて、Javaには静的クラスはありません。あなたの選択は全く意味がありません。ああ、あなたもまた無礼になっています。 –

3

継承を伴わない問題を解決するために継承を悪用しようとしています。 Shiftキーを押しながらCrackerGUIを拡張したり、btnClear()メソッド内に新しいCrackerGUIオブジェクトを作成したりしないでください。どちらのCrackerGUiも表示されていないからです。 Shiftキーを押しながら表示されたCrackerGUIオブジェクトへの参照を保持し、このオブジェクトのパブリックメソッドを呼び出させます。

例えば、

public class Shift { 
    private CrackerGUI gui; 

    // pass in a reference to the displayed CrackerGUI object 
    public Shift(CrackerGUI gui) { 
    this.gui = gui; 
    } 

    public void btnClear() { 
    //CrackerGUI gui = new CrackerGUI(); 
    gui.setPlainText(" "); 
    System.out.println("testing"); 
    } 
} 

あなたはまた、おそらくあなたのGUIのactionPerformedメソッドに新しいシフト・オブジェクトを作成すべきではないのではなく、クラスフィールドでのみ1つのシフトオブジェクトを使用します。

+0

+1 OOPに関する良い点。 – GETah

+0

素晴らしい心は似ていると思います。 1 + –

0

CrackerGUIがあなたのGUIであると仮定すると、あなたの代わりに、以下が必要です:

public class CrackerGUI { 

    public void setPlainTextBox(String text) 
    { 
    plainTextBox.setText(text); 
    } 
    public void btnClear() 
    { 
    setPlainTextBox(""); 
    System.out.println("testing"); 
    } 
} 

最後に一つを、あなたのGUI要素を公開することはありません!あなたは、GUIにそれ自身をクリアし、その中に隠されている要素をクリアする知識を残すように頼むべきです。

+0

シフトがCrackerGUIを拡張するのはなぜですか? –

+0

@HovercraftFullOfEelsおっと!実際にはGUI自体を拡張する必要はありません少しの間違いでした – GETah

3

btnClearメソッドは、新しいCrackerGUIインスタンスのテキスト領域をクリアします。それは、新しい空白シートを取り出してクリアすることによって、あるシート上の図面をクリアしたい場合に似ています。元の紙はその絵を保持します。

あなたがシフトするためのGUIのインスタンスを渡す必要があります。

public class Shift { 
    private CrackerGUI gui; 

    public Shift(CrackerGUI gui) { 
     this.gui = gui; 
    } 

    public void btnClear() { 
     this.gui.setPlainText(" "); 
    } 
} 

とCrackerGUIクラスで:

private void btnClearActionPerformed(java.awt.event.ActionEvent evt) {           
    Shift classShift = new Shift(this); 
    classShift.btnClear(); 
} 
+0

偉大な心は似て考える。 1+ –

関連する問題