1

だから私はアプレットから始めたばかりで、アプレットがロードされたときに開いたドアと2つの開いた窓のある家を作っています。これらの窓やドアをクリックすると、閉じます。私の質問は、これらの窓のドアを再び開くために何をする必要があるかということです。ブール変数をなんとかしてFalseに設定し、再描画する必要があると思います。どこでこれをしますか。コードを書く必要はありません。何をすべきか知りたいだけです。

よろしくお願いします、

リック

   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)
     {
     }
  }

}

4

2 に答える 2

3

質問を誤解しているかもしれませんが、なぜイベントハンドラーで常に値をtrueに設定しているのですか?

トグル動作が必要な場合は、次のように記述value = !valueしてから再ペイントします。最初に値をfalseに設定したので、次のクリックでtrueに設定され、次にfalseに設定されます。

例えば:

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

フレームワークがビューを更新するよりも速くクリックすることで、一種の「競合状態」を引き起こす可能性があることに注意してください。ただし、これは通常、初期の問題では問題になりません。

ところで:読みやすさの観点から、変数の意味を伝える方法で変数に名前を付けることを検討してください。たとえば、ネーミングドアはブール値を連想させますか?あまり。しかし、doorOpenはそうです、そしてそれは変数とその遷移の意味を解釈するのを助けます。

于 2012-04-25T00:26:23.290 に答える
0
if (WindowRight)
{
    rightWin = false;
    repaint(); 
}
else {
    rightWin = true;
    repaint(); 
}

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

于 2016-08-05T16:46:51.543 に答える