4

import javax.swing.*;

class Labels extends JFrame{ JPanel pnl = new JPanel();

ImageIcon duke = new ImageIcon("duke.png");

JLabel lbl1 = new JLabel(duke);
JLabel lbl2 = new JLabel("Duke is the friendly mascot of Java technology.");
JLabel lbl3 = new JLabel ("Duke", duke, JLabel.CENTER);

public Labels(){

    super("Swing Labels");
    setSize(1000 , 800);
    setDefaultCloseOperation( EXIT_ON_CLOSE);
    add(pnl);
    setVisible(true);

    lbl1.setToolTipText("Duke - the Java Mascot");

    lbl3.setHorizontalTextPosition(JLabel.CENTER);
    lbl3.setVerticalTextPosition(JLabel.BOTTOM);

    pnl.add(lbl1);
    pnl.add(lbl2);
    pnl.add(lbl3);

}
    public static void main(String [] args){
        Labels gui = new Labels();
    }

}

これを JApplet として使用したい場合はどうすればよいですか? 何をしなければなりませんか?変えるのは難しいですか?

JFrame で実行されるものは、JApplet で実行されるものと同じですか?

4

4 に答える 4

3

以前の質問の1つで推奨したように、 Model-View-Controllerパターン、またはそのバリアントの1つに準拠するようにプログラムを再編成する必要があります。これにより、制御コード( GUIからのActionListener)。MVCプログラムの例については、この最近の回答の私の提案とコードを確認してください。

于 2012-06-17T13:48:54.263 に答える
3

一部のクラス (JPanel B からの入力のみを許可する場合は B の内部クラスが望ましい) は、ActionListener を実装する必要があります。その ActionListener を JTextField に追加する必要があります。

myInputTextField.addActionListener(theActionListenerIAmGoingToWrite). 

その ActionListener は、次のような actionPerformed() を定義する必要があります。

String text = inputTextField.getText();
Integer inputInteger = Integer.getInteger(text).toInt(); 
graph.doStuffWithIntegerInput(inputInteger);

回答が必要な設計上の質問は次のとおりです。

ActionListener は匿名の内部クラスですか? お互いを認識しているグラフと B の特定のインスタンスでのみ使用する場合は、このようにします。その場合、それを含むクラスから Graph インスタンスへの参照を取得する必要があります。これは、B がそれを提供するそのようなインスタンスを持っていることを意味します。

ActionListener のアクションは他の場所で再利用できますか? 「数字を入力」ウィジェットは、他の JPanel のどこかに表示されますか? その場合は、スタンドアロン クラスにします。グラフへの参照がまだ必要なので、コンストラクターパラメーターとしてグラフを作成するか、setGraph メソッドを使用します。これは、メッセージを送信できるようにグラフインスタンスについて知る必要があるためです。

終わり!

編集 2

では、持っているものを MVC フレームワークにマッピングしましょう。したがって、ビューは Graph クラスとクラス B と textFields で構成されます。

グラフ クラスに含まれるようになったので、グラフ化するデータも取得できます。それが、定義した開始、終了、 x 、 y 変数です。MVC ランドの善良な市民になるには、これらを引き出して、グラフのモデルを構成する別のオブジェクトに含める必要があります。モデルは、非常に基本的に、表示方法に関係なく、表示したい一連の事実であり、ビューは画面への描画に関連するすべてのコードです。

したがって、このモデル オブジェクトは、定義したすべての変数のゲッターとセッターを持つ単純なデータ オブジェクトになり、コンストラクターで、または Graph オブジェクトのセッターを介して Graph オブジェクトに渡されます。

この GraphData オブジェクトを作成することにより、ビュー、つまりグラフをそのモデルである GraphData オブジェクトから分離しました。

より複雑な Graph では、実際に GraphModel で、作成する Graph オブジェクトの「種類」、軸の名前、描画する線の種類などを指定しますが、それはやり過ぎです。あなたが持っているもの。

これで、Graph オブジェクトと GraphData オブジェクト、およびそれらをまとめる方法ができました。

次に、クラス B を見てみましょう。これは JPanel、つまりビューであるため、本質的には含まれているビューのアグリゲーターおよびプレゼンターです。それらは Graph と JTextFields です。したがって、レイアウトを指定して、そのまま追加します。

したがって、仮想的なリファクタリングは次のようになります。

メインプログラムを作成します。そのメインで、JTextFields、ActionListener、JPanel (B)、Graph、および GraphModel を作成します。

GraphModel を Graph に関連付けます。

Graph を JPanel に関連付けます。

ActionListener を JJtextField に関連付ける

JTextField を JPanel に関連付ける

ActionListener を独自のクラスとして記述する限り、これが最も簡単に記述して理解できます。したがって、次のようになります。

public class MyTextFieldListener implements ActionListener
{
   private Graph graph;
   public   MyTextFieldListener(Graph graph)
   {   
      this.graph = graph;
   }// construtor

   public void actionPerformed (ActionEvent ae) 
  {
      String text =  ((JTextField)ae.getSource()).getText();
      Integer inputInteger = Integer.getInteger().(text).toInt();
      graph.doStuffWithIntegerInput(inputInteger); 
  } // actionPerformed
}// class

ここで、4 つのテキストフィールドすべてから情報が得られるまでグラフを更新できないという複雑な問題が発生する可能性があります。それに対応するためにこのコードを変更するにはさまざまな方法がありますが、これはどこに行く必要があるかの基本的な考え方です。

HTH

于 2012-06-17T14:09:32.813 に答える
3

さて、まずこれをチェックしてください:別のクラスのアクションリスナー - Java

あとは、必要に応じて編集するactionPerformed(ActionEvent ae)だけです。次に、アクセサー/get メソッドを使用してデータにアクセスすることにより、controlB.java クラスの値を取得するか、Actionlistener クラスで ControlB を拡張して、アクセスできるようにします。すべての公開データに値を取得したら、開始時またはミューテーター/セット メソッドを使用して Graph.java に渡しますか?

于 2012-06-17T13:58:40.317 に答える
1

わかった。RangeXY オブジェクトについて話しましょう。その目的は何ですか?JTextFields から、つまりユーザー入力からは何も必要ないように見えるので、私は尋ねます。

実際、graph.doStuffWithIntegerInput() を呼び出す場所では、ユーザーからの整数入力を使用していません。これは、テキスト フィールドからのものです。RangeXY のコンストラクターに渡した int を使用しています (これは間違っています)。それからあなたは(そしてここに「ちょうど間違った」部分があります)そのintをInteger静的メソッドgetInteger()に与えています。実際には、getInteger は String を受け取り、それを Integer に変換するため、コンパイルされません。

よし、これにしよう。一度に 1 つのことを行います。まず、この説明に適合するクラスを作成します。

ActionListener を実装します。Graph のメンバー変数があります。Graph のメンバー変数は、セッターで設定されるか、コンストラクターに渡されます。EMPTY actionPerformed メソッドがあります (今のところ)

それを行うだけで、そこから取得します。

于 2012-06-17T23:20:59.033 に答える