1

私は Java プログラミングの初心者で、理解も理解もできない (おそらく) 簡単な問題に直面しています。

私は 3 つの異なる Java ファイルを持っています。1 つはインターフェース (SimulatorGui.java) を作成する場所、もう 1 つはインターフェース (CollisionPanel.java - CollisionPanel クラス) で作成された jTabbedPanel で使用するパネルを作成する場所、3 つ目は私が必要な出力を作成するコードを実行します (Collision.java - Collision クラス)。

Collision.java のメイン メソッドでは、次のことを行っています。

  public static void main (String[] args) {

    //<editor-fold defaultstate="collapsed" desc="Simulation start procedures">
    Tally statC = new Tally ("Statistics on collisions");
    Collision col = new Collision (100, 50);
    col.simulateRuns (100, new MRG32k3a(), statC);
    //</editor-fold>


    new SimulatorGUI().setVisible(true);
    CollisionPanel update = new CollisionPanel();
    update.updatepanel();

最初のブロックは、目的の出力を作成します。次に、その出力を updatepanel に送信します。私はまだこれをデバッグしようとしているので、メソッドに引数を渡していません。updatepanel メソッドは、次のように CollisionPanel ファイルに作成されます。

public void updatepanel(){
    System.out.println ("debug");
    jTextArea1.setText("update\n");
}

Collision.java ファイルを実行すると、「デバッグ」テキストが出力されますが、テキストが jTextArea1 に設定されません (追加も機能しません)。次に、試してみるためのボタンを作成しましたが、その場合は機能します。CollisionPanel.java 内:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    updatepanel();
}

これでうまくいきます!さまざまなことを検索して試しましたが、なぜこれが機能しないのか理解できないようです。

ご協力いただきありがとうございます。問題が解決したことを願っています。

4

3 に答える 3

1

さて、最終的に問題が発生したと思います。これは IDE のせいです。メイン メソッドで new を開始していることがわかりますがCollisionPanel、これは間違っています。netbeans はすでにそのパネルを追加して開始しているSimulatorGUIので、必要なものは行うには、開始されたパネルを取得するために get メソッドを追加し、SimulatorGUIそのパネルで update メソッドを呼び出します。

これをに追加しSimulatorGUIます:

public CollisionPanel getCollisionPanel1() {
    return collisionPanel1;
}

updatePanel()古い方法を次のように置き換えます。

 void updatepanel(String str) {
            System.out.println ("debug");
            jTextArea1.setText(str);
         //   jTextArea1.revalidate();
            jLabel1.setText("test");
        }

その後、メインも次のように変更します。

            SimulatorGUI simulatorGUI = new SimulatorGUI();
            simulatorGUI.setVisible(true);
            CollisionPanel cp=simulatorGUI.getCollisionPanel1();
            cp.updatepanel("Hi");

updatePanel()コンストラクターから古いメソッド呼び出しを削除することを忘れないでください。コンストラクターでのみ呼び出すのではなく、クラスで呼び出すことCollisionPanelができるようになったためです。cp.updatePanel("text here");SimulatorGUI

簡単に理解できると思いますが、わからない場合はお知らせください

于 2012-07-02T16:51:40.640 に答える
1

CollisionPanel をメイン GUI のどこに追加しますか? これはあなたの問題であり、コードを機能させるにはこれを行う必要があるのではないかと心配しています。実際、3 つのクラスのいずれかが他のクラスへの参照をどこで取得するのでしょうか? プログラムで異なるクラスが機能するためには、それらの間で何らかの通信が必要です。GUI 内に CollisionPanel オブジェクトを作成し、main メソッド内に別の CollisionPanel オブジェクトを作成する場合、2 つの完全に異なるエンティティであるため、一方のオブジェクトでメソッドを呼び出しても他方には影響しないことを理解してください。

たとえば、次のコード:

new SimulatorGUI().setVisible(true);
CollisionPanel update = new CollisionPanel();
update.updatepanel();

実際には CollisionPanel で updatePanel() を呼び出しているようですが、GUI で視覚化されている CollisionPanel にはありません。

SimulatorGUI に、CollisionPanel を渡して使用できるようにするメソッドを与えることを検討してください。これは実際にはコンストラクターのパラメーターである可能性があります。

CollisionPanel update = new CollisionPanel();
SimulatorGUI simulatorGUI = new SimulatorGUI(update);
update.updatePanel();

つまり、SimulatorGUI のコンストラクターは次のようになります。

public SimulatorGUI(CollisionPanel update) {
   this.update = update;
   // add update to GUI somewhere
}
于 2012-07-02T16:51:41.073 に答える
0

の開発には、次の 3 つのレベルがありますGUI

  • ビュー: グラフィカル コンポーネント
  • モデル: 実行するコード
  • コントローラー: ビューを更新するためにモデルが更新されているかどうかを確認します。

したがって、プログラムを最初に起動すると、ビューにはコードで値が割り当てられます。たとえばJTextArea、初期値の型 hereを使用して作成したとします。ビューには、ここJTextAreaにテキストタイプの が表示されます。
モデルに変更が加えられた場合、ビューはそれを認識しません。モデルの更新を確認してからビューを更新するのはコントローラーの仕事です。

したがって、この:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    updatepanel();
}

プロパティが変更されたことを示すイベントを生成します。したがって、コントローラーはビューを更新します。

それ以外の場合、変更はビューに表示されません。

お役に立てれば..

于 2012-07-02T16:53:03.133 に答える