HKImpact HKImpact - 4 months ago 25
Java Question

Java House Applet

So I'm just starting with Applets and I am making a house with an open door and 2 open windows when the applet loads. When you click these windows or door then they will shut. My question though is what do I need to do to re-open these windows doors. I figure I need to set the Boolean variables to False somehow and repaint. Where would I do this. I don't need you guys to write the code for me, I just want to know what I should do.

Thanks ahead of time,

Rick

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


}

Uri Uri
Answer

Maybe I'm misunderstanding the question, but why are you always setting the values to true in the event handler?

If you want a toggling behavior, you could simply write: value = !value and then repaint. Since you initially set your value to false, the next click would set it to true, the next to false, etc. etc.

For example:

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

Note that it is possible for you to cause sort of a "race condition" by clicking faster than the framework has a chance to update the view, but this is usually not a problem for initial problem.

BTW: In terms of readability, consider naming your variables in a way that conveys their meaning. For example, is the naming door evocative of a boolean? not really. but doorOpen is, and it helps interpret the meaning of the variable and its transitions.