1

基本的な質問が 2 つあります。

  • Java Swing を使用した GUI プロジェクトがあります。フレームにボタンを配置してダブルクリックすると、 のコードが表示actionPerformedされましたが、ブロックされています。

    そこにボタンを配置して、それを で使用するにはどうすればよいactionListenerですか?

  • 私のプロジェクトはサーバークライアント(マルチスレッドとソケット)に関するものです

    1 つのメソッドを呼び出して、JtextField に書き込むことができる 1 つの文字列を受け取り、それは PrintWriter と getOutputStream を使用してしばらくの間保持されます。

    何かのようなもの:


do{
...
}while(thisstring!=null || thisstring!="exit")

だから..何かを書いてボタンを押して送信すると、それはシクルとボタンブロックにとどまります。ボタンのブロックを解除して別のことを書くにはどうすればよいですか?
編集:
EDT の問題は理解できましたが、解決できません。

タイマーを使用しようとしましたが、成功しませんでした。

  int delay = 1000; //milliseconds
  ActionListener listener = new ActionListener() {
  public void actionPerformed(ActionEvent e) {
  //My action calling the Thread class with the while cicle that has the PrintWriter
       }

  };
new Timer(delay, listener).start();

ボタンを押したときにタイマーを実行するにはどうすればよいですか?

1 人のユーザーがテキスト フィールドに何かを入力するたびに、その cicle にとどまって (コメント行を読んで) OutputStream で情報を送信するにはどうすればよいですか? たとえば、コンソール アプリケーションの場合、BufferedReader を使用し、ReadLine() を使用してコンソールから送信されるものを待機することを知っていますが、GUI インターフェイスでは常にフリーズします。

4

2 に答える 2

3

Java GUI開発には、開発者がボタンクリックなどのユーザーインタラクション処理を実装するスレッドを取り巻く基本的な概念があります。

つまり、アクション処理メソッドを呼び出すスレッドの外部で処理を実行する必要があります。この単一のスレッドはイベントディスパッチスレッド(EDT)と呼ばれ、数ミリ秒をはるかに超えるロジックが実行されている場合、UIがボタンのリリースなどを描画し続けることができなくなります。

長時間実行されるソケットコードをEDTから移動することをお勧めします。そうすることで、ボタンが解放され、ユーザーが他のコントロール(または同じボタン)を操作できるようになります。

このトピックに関する他の議論が重複するのを避けるために、私はあなたをこのかなり良いものに導きます。さらに、この記事では、Swingのスレッドの概念について簡単に説明します。

よろしく、

ScottH

于 2012-12-15T20:18:21.223 に答える
3

あなたのコメントによると、いくつかの命名の問題があります。ActionListenerのように -interfaceを実装するクラスが必要ですが、class YourListenerClass implements ActionListenernew ActionListener { public void actionPerformed(ActionEvent e) { //ボタンのコードをここに } }); のような匿名クラスを介してそれを行うこともできます。を設定するときActionListener
重要なことは、メソッドに正しい名前を付ける必要があるということです。それ は必須であり、間違いなく-interfacepublic void actionPerformed(ActionEvent e)を実装する必要があります。ActionListener次のことは、次のようにリスナーをボタンに登録する必要があることです。

yourButton.addActionListener(new YourListenerClass);

または、前に示したような匿名クラスを挿入します。

2 つ目は、コメントで述べたように、マルチスレッドの問題のように聞こえます。私は scotth のリンクをたどりませんでしたが、彼の説明によれば、ブロックの問題をさらに解決するために読みたいソースかもしれません。
編集: まあ、最初は説明したくありませんでした。コードのかなりの部分だからですが、問題が解決しないのでSwingWorker、答えに s について何かを追加したいと思います。
実行時間の長いコードがTimerある場合、イベントによってトリガーされるため、それによって呼び出されるコードも EDT にあるため、を使用しても役に立ちません。その代わりに、 a を使用してこれを解決
できます。SwingWorkerただし、これには追加のコードが必要です。従うことができる簡単なアプローチは次のとおりです。

public class WorkingHard{
  SwingWorker<String, String> worker;
  JButton yourButton = ...;
  ...
  //do some cool stuff, as register those listeners!
  ...

  public void actionPerformed(ActionEvent evt){
      if(evt.getSource().equals(yourButton);
      // Construct a new SwingWorker
      worker = new SwingWorker<String, Void>(){


    @Override
    protected String doInBackground(){
      //do your reading in this method, it will be executed in an own thread
      String readText = "i will be read".
      /*your reading algorithm, you could also call publish(...) to post your results,
      e.g. likewise), then you also have to override process(...). this process will be
      thread save, too*/
      readText += ... ;

      ...
      return readText;
    }

    @Override
    protected void done(){
      try {
        //do sth. with your result, now thread safe.
        someGuiElement.setText(get());
      } catch (InterruptedException e) {
        e.printStackTrace();
      } catch (ExecutionException e) {
        e.printStackTrace();
      }
    }
  };
  // Execute the SwingWorker; the GUI will not freeze
  worker.execute();
}

}

これらのワーカーについて詳しく知りたい場合は、これについて扱っているスレッドがいくつかあります。

于 2012-12-15T20:42:53.653 に答える