2017-01-19 11 views
0

実際にプログラミングの専門家ではなく、ちょうど学び始めているImです。ここに私の問題があります。 私はこれをclassと呼び、JButtonを使ってサーバーを起動しようとしましたが、ボタンを押した後にアプリケーションがフリーズしました。JButtonを使用してクラスを呼び出すとJFrameがフリーズする

は、ここで私はあなたがイベントディスパッチャスレッドをブロックしたと私のmouseClickedイベント

private void startbtnActionPerformed(java.awt.event.ActionEvent evt) {             
     new DisplayServer(80); 
} 
+0

チェックをお読みください。あなたのコードは、より良いインデントを持つ必要があります。私は半分それを読んで、あきらめた。 – user3437460

+2

ほとんどの場合、イベントスレッドでループを実行し、すべてのGUIイベントと描画をブロックします(別のスレッドが必要です)。 'new DisplayServer(80);'を使うと、オブジェクトを作成するよりも多くのことが起こるということも非常に悪い考えです。コンストラクタから直接実行を開始するのではなく、別の 'start()'メソッドを呼び出す必要があります。 Swingを使い始める前に、基本的なチュートリアルをすべてお勧めします。 – Kayaman

+0

@ user3437460、私はGITHUBがOPコードではないと信じています。コミット日付を見てください;) – AxelH

答えて

1

です。新しいスレッドで実行してみてください。詳細情報については

private void startbtnActionPerformed(java.awt.event.ActionEvent evt) {       
    new Thread(new Runnable() { 
     public void run() { 
      new DisplayServer(80); 
     } 
    }).start();      
} 

記事にあなたが無限ループに陥っていない程度Concurrency in Swing

+0

Githubでは、現在のスレッド 'client = ss.accept();' 27行目の 'DisplayServer'待機クライアントを見ることができます。これは正しいです。そのデザインが悪いと判断した場合、サーバーはスレッド自体を管理する必要があります(自分の設定) – AxelH

+0

はい、これは機能します!どうもありがとうございます! –

+0

@JarrelCostinianoこのようにリスナーを実装する必要がある理由を理解するために、上記の記事をお読みください。 –