2012-04-25 7 views
1

私はちょうどアプレットを使い始めています。アプレットが読み込まれると、開いているドアと開いているウィンドウが2つあります。これらのウィンドウまたはドアをクリックすると、閉じます。私の質問は、私はこれらの窓のドアを再び開くために何をする必要があるのですか?ブール変数をFalseに設定して再描画する必要があることがわかりました。私はこれをどこでやりますか?私はあなたのコードを書く必要はありません、私はちょうど私が何をすべきかを知りたいです。Java House Applet

おかげで事前に、

リック

import java.awt.*; 
    import java.awt.event.*; 
    import java.applet.*; 

/** 
Rick Armstrong 
Chapter 14 - House Applet 
*/ 

    public class HouseApplet extends Applet {  
    boolean leftWin, rightWin, door; 

    public void init()  
    {  
    leftWin = false; 
    rightWin = false; 
    door = false;  

    setBackground(Color.white);  
    addMouseListener(new MyMouseListener());  
    } 

    public void paint(Graphics g) 
    { 
    super.paint(g); 

    // Draw the house. 
    g.setColor(Color.black); 
    g.drawRect(100, 100, 200, 100); 

    // Draw the roof 
    g.drawLine(80, 100, 320, 100); 
    g.drawLine(80, 100, 200, 40); 
    g.drawLine(200, 40, 320, 100); 

    // Draw the left window open. 
    g.fillRect(120, 130, 40, 40); 

    // Draw the right window open. 
    g.fillRect(240, 130, 40, 40); 

    // Draw the door open. 
    g.fillRect(180, 130, 40, 70);   

    if (leftWin) { 
     // Draw the left window closed. 
     g.setColor(Color.white); 
     g.fillRect(120, 130, 40, 40); 
     g.setColor(Color.black); 
     g.drawRect(120, 130, 40, 40); 
     g.drawLine(140, 130, 140, 170); 
     g.drawLine(120, 150, 160, 150); 

    } 

    if (rightWin) { 
     // Draw the right window closed. 
     g.setColor(Color.white); 
     g.fillRect(240, 130, 40, 40); 
     g.setColor(Color.black); 
     g.drawRect(240, 130, 40, 40); 
     g.drawLine(260, 130, 260, 170); 
     g.drawLine(240, 150, 280, 150); 

    } 

    if (door) { 
     // Draw the door closed. 
     g.setColor(Color.white); 
     g.fillRect(180, 130, 40, 70); 
     g.setColor(Color.black); 
     g.drawRect(180, 130, 40, 70); 
     g.fillOval(210, 165, 07, 07); 

    }  
    } 

    private class MyMouseListener implements MouseListener 
    { 
    public void mousePressed(MouseEvent e) 
    { 
    } 

    public void mouseClicked(MouseEvent e) 
    { 
     int currentx = e.getX(); 
     int currenty = e.getY(); 

     boolean WindowLeft = (currentx >= 120 && currentx < 160 && currenty >= 130 && currenty <= 170); 
     if (WindowLeft) 
     { 
      leftWin = true; 
      repaint();    
     } 

     boolean WindowRight = (currentx >= 240 && currentx < 280 && currenty >= 130 && currenty <= 170); 
     if (WindowRight) 
     { 
      rightWin = true; 
      repaint(); 
     } 

     boolean Door = (currentx >= 180 && currentx < 220 && currenty >= 40 && currenty <= 200); 
     if (Door) 
     {    
      door = true; 
      repaint();  
     } 

     else; 
    } 

    public void mouseReleased(MouseEvent e) 
    { 
    } 

    public void mouseEntered(MouseEvent e) 
    { 
    } 

    public void mouseExited(MouseEvent e) 
    { 
    } 
    } 

}

答えて

3

は、たぶん私は質問を誤解していますが、なぜあなたは常にイベントハンドラでtrueに値を設定していますか?

トグル動作をしたい場合は、単にvalue = !valueと記述してから再描画します。あなたが最初にfalseにあなたの値を設定しているので は、次のクリックは、trueになどなど、虚偽の隣にそれを設定します

例えば

:それがあなたのために可能であることを

if (WindowLeft) 
     { 
      leftWin = !leftWin; 
      repaint();    
     } 

注意フレームワークがビューを更新するチャンスよりも速くクリックすることによって「競合状態」を引き起こすことがありますが、これは初期の問題では通常問題ではありません。

ところで、わかりやすさの観点から、その意味を伝えるように変数の名前を付けることを検討してください。たとえば、命名ドアがブーリアンを呼び起こしていますか?あんまり。しかし、doorOpenは、変数の意味とその遷移を解釈するのに役立ちます。

+0

私がそれを書いた時、それは良い音だった。私はUriを試してみましょう。責任感ありがとうございます。 – HKImpact

+0

私は別のウリをやり遂げることができたことがいくつかあります。私はそのハハを否定していません。しかし、あなたが私に言った後、value =!value;それはすべて私にとって意味をなさない。あなたがそれを投稿した後、私はむしろ愚かに感じました。私はそれがそれのような簡単なものだと分かっていました。どうもありがとうございました! – HKImpact

0
if (WindowRight) 
{ 
    rightWin = false; 
    repaint(); 
} 
else { 
    rightWin = true; 
    repaint(); 
} 

上記を試してください。ウィンドウの内側をクリックすると閉じます。それ以外の場合は閉じます。