2016-09-29 11 views
1

私は異なる状態でオブジェクトを描画するプログラムを書いています。最初は灰色の長方形、2番目は画像、3番目は明るい四角形で、テキストが入っています。私は3つのクラスとしてコードを書いた。私はコンポーネントクラスに問題があります。それは何らかの理由でループし続けます。私は1を入力すると、それは正常に動作します。私が2を入力すると、画像を表示する前に自分の入力を4回尋ねます。私が3を入力すると、それはより明るい四角形を示す前に二度聞いてきますが、テキストはありません。私のコードはループしているようですが、なぜ私はわかりません

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.Toolkit; 
import java.util.Scanner; 

import javax.swing.JComponent; 

public class ImageComponent extends JComponent { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    public int status; 

    public int getInput(){ 
    Scanner userinput = new Scanner(System.in); 
    System.out.println("Select the state <1-rectangle, 2-image, 3-rectangle with text>"); 
    int state=userinput.nextInt(); 
    //userinput.close(); 
    return state; 
    } 

    public void paintComponent(Graphics g){ 
     Graphics2D g2 =(Graphics2D) g; 

     if (getInput() ==1){ 
      ImageMaker rectangle = new ImageMaker(0,0,500,400); 
      g2.setColor(Color.GRAY); 
      rectangle.draw(g2); 

     } 
     else if (getInput() ==2){ 
      Image img1 = Toolkit.getDefaultToolkit().getImage("balloon.gif"); 
      ImageMaker image = new ImageMaker(img1, 0, 0, this); 
      image.draw(g2); 
     } 
     else{ 
      ImageMaker rectangle = new ImageMaker(0,0,500,400); 
      g2.setColor(Color.LIGHT_GRAY); 
      rectangle.draw(g2); 
      g2.drawString("Your Text Here", 500/2, 400/2); 
     } 
    } 

} 
+0

ようになっているはず? –

答えて

3

あなたが投稿していませんでしたので、私は、確かにあなたの問題の正確な原因を言うことができない有効なminimal example program(私が何を意味するかを見るためにリンクをチェックしてください)、私は、私は」いくつかの疑惑を持っていますLLあなたにリレー:

  • あなたはSystem.inに初期化スキャナ、SwingのGUIで、コンソールからの入力を取得するためのツール、一緒によく混ぜないとはいけないん二つのことを混合していますをよく混合してください。スキャナ入力メソッドは、プログラムフローをブロックします。これは、Swing GUIを完全にフリーズすることができます。
  • paintComponentでもっとやっているように見えます。このメソッドはペイントとペイントのみに使用され、ファイルの入出力(イメージの読み込みなど)、プログラムロジックの使用、GUIコンポーネントの作成には使用しないでください。
2

1を入力すると正常に動作します。私が2を入力すると、画像を表示する前に自分の入力を4回尋ねます。私が3を入力すると、それはより明るい四角形を示す前に二度聞いてきますが、テキストはありません。

paintComponentにスキャナを使用するように指示する方法getInput()を配置しています。ペイントに関連する作業以外の方法を他のものに入れないようにしてください。paintComponentペイントマネージャーはpaintComponentにいつ呼び出すべきかを決めるでしょうし、絶対的なコントロールはありません。 (たとえば、フレームのサイズを変更する/マウスオーバーするときに呼び出され、プロンプトが意図した以上に呼び出されることがあります)。

ユーザーにプロンプ​​トを表示してコンポーネントをペイントするロジックを分けることをお勧めします。さらに、スキャナとカスタムペイントを組み合わせて使用​​しないでください。

あなたは、ダイアログを使用して検討してください。How to make Dialogs

0

まず:@ホバークラフトフル・オブ・ウナギは、すでに述べたように:paintComponentはないユーザーとの対話のために、あなたのコンポーネントを描くためのものです。

このメソッドは、フレームが別のウィンドウによって隠されて再び表示された後など、いつでもUIを再描画する必要があると思うときにスイングから呼び出されます。


第二の点は、

if (getInput() ==1){ 

ユーザ入力を要求することです。ユーザーが入力した場合2条件が満たされていない、と

else if (getInput() ==2){ 

であなたは、ユーザーの入力のための第二の時間を求めています。あなたはインタラクティブなユーザ入力に依存して決定チェーンを持っている場合は

それはどのようにこれらのメソッドを呼び出している

int input = getInput(); 
if (input == 1) { 
    //... 
} else if (input == 2) { 
    //... 
} else { 
    //... 
} 

または

switch (getInput()) { 
case 1: 
    //... 
    break; 
case 2: 
    //... 
    break; 
default: 
    //... 
    break; 
} 
関連する問題