2016-03-20 11 views
1

NetBeans 6.9.1プログラミングを使用していますが、現在はSwing GUIを使用しています。プログラムを実行し、結果を決定するために「計算」ボタンをクリックするたびに、プログラムがフリーズします。ここではそれがフリーズする原因と私のコードの塊がある:NetBeans GUIアプリケーションは、実行しようとするとフリーズし続けます

private void calculateButtonActionPerformed(java.awt.event.ActionEvent evt) { 
    String backTrouble; 
    String heartTrouble; 
    int riderHeight = Integer.parseInt(inputHeight.getText()); 

    backTrouble = inputBack.getText(); 
    heartTrouble = inputHeart.getText(); 

    while ((riderHeight >= 122) && (riderHeight <= 188)){ 

     if ((backTrouble.equals("N")) && (heartTrouble.equals("N"))){ 

      responseField.setText("It is OK for you to ride this roller coaster. Have fun!"); 
     } 

     else if ((backTrouble.equals("Y")) && (heartTrouble.equals("N"))){ 

      responseField.setText("Sorry, it is not safe for you to ride this roller coaster."); 
     } 

     else if ((backTrouble.equals("N")) && (heartTrouble.equals("Y"))){ 

      responseField.setText("Sorry, it is not safe for you to ride this roller coaster."); 
     } 
     else{ 

      responseField.setText("Sorry, it is not safe for you to ride this roller coaster."); 
     } 

    while ((riderHeight < 122) || (riderHeight > 188)){ 

     responseField.setText("Sorry, it is not safe for you to ride this roller coaster."); 
    } 
    } 


} 

それが凍結し続ける理由を私は本当に理解していない、といくつかの助けをいただければ幸いです、ありがとうございました。

+0

[tag:javascript]タグを削除しました。 JavaとJavascriptは完全に異なる2つのプログラミング言語で、ハムはハンバーガーと密接に関連しています。あなたの質問に誤ってタグを付けると、適切な専門家がレビューを行うことができず、これがチャンスを傷つける可能性があります。まともな助けを得ること。 –

+1

[Swingの同時実行](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/) – MadProgrammer

答えて

2

while (such and such)ループが連続して実行され、Swingイベントスレッドをブロックし、スレッドがGUIにペイントするのを防ぎ、ユーザーと対話してアプリケーションを効果的にフリーズさせます。これらのループはコンソールプログラムでは意味がありますが、イベント駆動型のSwing GUIではありません。それらを取り除くと、凍結は不凍液になります。おそらく、ここではifブロックを代わりに使用したいと思うかもしれません。

だから、もう一度、おそらくブロックが良い仕事かどう:

private void calculateButtonActionPerformed(java.awt.event.ActionEvent evt) { 
    String backTrouble; 
    String heartTrouble; 
    int riderHeight = Integer.parseInt(inputHeight.getText()); 
    backTrouble = inputBack.getText(); 
    heartTrouble = inputHeart.getText(); 

    // get rid of the while loop, 
    // while ((riderHeight >= 122) && (riderHeight <= 188)){ 
    if ((riderHeight >= 122) && (riderHeight <= 188)){ 
     if ((backTrouble.equals("N")) && (heartTrouble.equals("N"))){ 
      responseField.setText("It is OK for you to ride this roller coaster. Have fun!"); 
     } 
     else if ((backTrouble.equals("Y")) && (heartTrouble.equals("N"))){ 
      responseField.setText("Sorry, it is not safe for you to ride this roller coaster."); 
     } 
     else if ((backTrouble.equals("N")) && (heartTrouble.equals("Y"))){ 
      responseField.setText("Sorry, it is not safe for you to ride this roller coaster."); 
     } 
     else{ 
      responseField.setText("Sorry, it is not safe for you to ride this roller coaster."); 
     } 

     // again, no while loops here 
     // while ((riderHeight < 122) || (riderHeight > 188)){ 
     if ((riderHeight < 122) || (riderHeight > 188)){ 
      responseField.setText("Sorry, it is not safe for you to ride this roller coaster."); 
     } 
    } 
} 

しかし、私は100%確実ではないです。

+0

プログラムを実行するために何らかの形のループを使用することは可能ですか? – spencerbro12

+0

@ spencerbro12:これはイベント駆動型プログラムです。ここにループは必要ありません。 'while'のために' if'を入れ替えるとどうなりますか? –

+0

@ spencerbro12:アニメーションを行う場合は「ゲームループ」を使用しますが、これは多くの場合、スイングタイマーを使用するか、バックグラウンドスレッドで直接実行されます。 –

1

私は問題が間違った場所に近いかっこを持っていると思います。

else{ 

    responseField.setText("Sorry, it is not safe for you to ride this roller coaster."); 
} 

while ((riderHeight < 122) || (riderHeight > 188)){ 

この前には、かっこを閉じてください。

また、riderHeightは決して変更しないので、ループ内に永遠に留まります。

この2つのwhileループをif..thenステートメントにすることもできますが、whileループで目的がないように思われる場合があります。あなたは

while(stillOnBike) { 
} 

を持っていた場合

次に、あなたは最終的には人間としての出口が、最終的に自転車を降りるなりますロジックを持っている可能性がありますが、基本的にwhile(true)を持っています。

関連する問題