-1

Java アプレットで家を描く宿題に取り組んでいます。家には、ドアと 2 つの窓を表す大きな主要な長方形の中に 3 つの長方形があります。クリックしたときに窓の色を変える必要があります。家を描き、ドアと窓も描いたところまで来ましたが、マウスをクリックしても色を変えることができません。 . これがなぜそうなのかを判断するのに苦労しています。

要約すると、家が描かれています。ドアと窓の長方形が描画され、黒で塗りつぶされます。窓やドアの四角形をクリックしても何も起こらず、エラーも色の変化もありません。

コードは次のとおりです。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.Graphics;

public class DrawHouse extends JApplet implements MouseListener
{
    private int mX; //variable to hold x position of the mouse cursor when clicked
    private int mY; //variable to hold y position of the mouse cursor when clicked
    private int rect1x;
    private int rect1y;
    private int rect1w;
    private int rect1h;
    private int rect2x;
    private int rect2y;
    private int rect2w;
    private int rect2h;
    private int rect3x;
    private int rect3y;
    private int rect3w;
    private int rect3h;
    boolean rect1Clicked;
    boolean rect2Clicked;
    boolean rect3Clicked;

    public void init()
    {
        super.init();
    }

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

        Polygon pg = new Polygon();

        pg.addPoint(280, 200);
        pg.addPoint(470, 100);
        pg.addPoint(670, 200);

        g.drawPolygon(pg);

        g.setColor(Color.BLACK);
        g.drawRect(300, 200, 350, 300);
        g.fillRect(350, 300, 50, 100);
        g.fillRect(550, 300, 50, 100);
        g.fillRect(440, 300, 75, 200);

        addMouseListener(this);

        if(rect1Clicked || rect2Clicked || rect3Clicked)
        {
            g.setColor(Color.GRAY);
            g.clearRect(rect1x, rect1y, rect1w, rect1h);
            g.fillRect(rect1x, rect1y, rect1w, rect1h);
            g.setColor(Color.GRAY);
            g.clearRect(rect2x, rect2y, rect2w, rect2h);
            g.fillRect(rect2x, rect2y, rect2w, rect2h);
            g.setColor(Color.GRAY);
            g.clearRect(rect3x, rect3y, rect3w, rect3h);
            g.fillRect(rect3x, rect3y, rect3w, rect3h);
        }
    }

    @Override
    public void mouseClicked(MouseEvent e) 
    {
        rect1x = 350;
        rect1y = 300;
        rect1w = 350;
        rect1h = 300;
        rect2x = 550;
        rect2y = 300;
        rect2w = 50;
        rect2h = 100;
        rect3x = 440;
        rect3y = 300;
        rect3w = 75;
        rect3h = 200;
        mX = e.getX();
        mY = e.getY();

        if(mX > rect1x && mX < rect1x + rect1w && mY > rect1y && mY < rect1y + rect1h)
        {
            rect1Clicked = true;
        }
        else
        { 
            rect1Clicked = false;
        }
        if(mX > rect2x && mX < rect2x + rect2w && mY > rect2y && mY < rect2y+rect2h)
        {
            rect2Clicked = true;
        }
        else
        {
            rect2Clicked = false;
        }
        if(mX > rect3x && mX < rect3x + rect3w && mY > rect3y && mY < rect3y + rect3h)
        {
            rect3Clicked = true;
        }
        else
        {
            rect3Clicked = false;
        }
    }

}

ご提案いただきありがとうございます。

4

1 に答える 1

0

あなたは本当に自分自身の人生を非常に困難にしています。Java Graphics API には、この問題の解決に特に適したクラスが多数あります。

一般的な経験則として。paintトップレベルのコンテナのメソッドを決してオーバーライドしないでください。JPanelまたはなどの適切なコンポーネントを使用しますJComponent

可能であれば、paintComponent代わりにメソッドをオーバーライドしてください。

HoverCraft が指摘しているように、paintメソッド内から UI を変更しないでください。これには、リスナーの追加が含まれます。メソッドは何度も呼び出されます。paintつまり、呼び出されるたびに、別のリスナーを登録することになります...

2D グラフィックストレイルとカスタム ペインティングの実行トレイルを読むことから始めます。

以下の例では を使用していますがJFrame、基本原則が適用されます。

public static void main(String[] args) {

    EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {

            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException ex) {
            } catch (InstantiationException ex) {
            } catch (IllegalAccessException ex) {
            } catch (UnsupportedLookAndFeelException ex) {
            }

            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new BorderLayout());
            frame.setSize(200, 200);
            frame.add(new HousePane());
            frame.setVisible(true);
            frame.setLocationRelativeTo(null);

        }
    });

}

public static class HousePane extends JPanel {

    private List<Rectangle2D> parts = new ArrayList<Rectangle2D>(25);
    private List<Rectangle2D> selected = new ArrayList<Rectangle2D>(25);

    public HousePane() {

        parts.add(new Rectangle2D.Float(10, 10, 50, 50));
        parts.add(new Rectangle2D.Float(60, 10, 50, 50));
        parts.add(new Rectangle2D.Float(10, 60, 50, 50));
        parts.add(new Rectangle2D.Float(60, 60, 50, 50));

        addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent e) {
                selected.clear();
                for (Rectangle2D rect : parts) {
                    if (rect.contains(e.getPoint())) {
                        selected.add(rect);
                    }
                }

                // You could require the user to click the shape again
                // to deselect by doing something like...
                //for (Rectangle2D rect : parts) {
                //    if (rect.contains(e.getPoint())) {
                //        if (selected.contains(rect)) {
                //            selected.remove(rect);
                //        } else {
                //            selected.add(rect);
                //        }
                //    }
                //}
                repaint();
            }

        });

    }

    @Override
    protected void paintComponent(Graphics g) {

        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.BLUE);
        for (Rectangle2D rect : selected) {

            g2d.fill(rect);

        }
        g2d.setColor(Color.BLACK);
        for (Rectangle2D rect : parts) {

            g2d.draw(rect);

        }

    }

}
于 2012-09-29T20:02:12.843 に答える