用鼠标点击随机改变矩形的颜色

时间:2017-05-17 03:43:25

标签: java swing graphics mouselistener

我正在处理这个我需要画房子的代码。房子有一个门(矩形),用鼠标点击随机改变颜色。门外的其他所有东西都根本不会改变颜色。

如何在鼠标点击时更改门的颜色?

package finalExam;  

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


public class Final  extends JFrame{         

    public Final(){

        setTitle("An Interactive House");
        setSize(500, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setVisible(true);
    }


    public void paint(Graphics g){


        int [] xCoords = { 40, 250, 460 };
        int [] yCoords = { 200, 50, 200 };

        super.paint(g);         

        g.drawRect(80, 200, 330, 260);

        g.drawPolygon(xCoords , yCoords , 3);

        g.setColor(Color.black);
        g.fillRect(190, 330, 100, 130);
        addMouseListener(new MouseEventListener());

        g.setColor(Color.white);
        g.fillOval(280, 400, 5, 5);


    }

    private class MouseEventListener implements MouseListener{

        public void mouseClicked(MouseEvent arg0){

            repaint();

        }
        public void mouseEntered(MouseEvent arg0){

        }
        public void mouseExited(MouseEvent arg0){

        }           
        public void mousePressed(MouseEvent arg0){

        }
        public void mouseReleased(MouseEvent arg0){

        }
    }

        public static void main(String[] args){
            new Final();
        }

    }

2 个答案:

答案 0 :(得分:3)

好的,还有一些问题需要解决;但是,嘿,StackOverflow还有什么用?

  1. 每次调用paint(Graphics g)时,您都会创建并分配new MouseEventListener。实际上,这是您在初始化时只想做的事情,除非您能预见到将来需要接收更新的多个MouseEventListener;但即使这样,你也不想在渲染过程中反复做这件事;你宁可在其他地方异步地做这件事。无论您在任何类型的渲染操作中使用什么逻辑,它都应该只与渲染相关,或者执行需要在每个渲染过程中同步的任务。当您在此课程上注册MouseEventListener时,我确定您希望它在您的应用程序的生命周期内接收事件;不会被不断覆盖!
  2. 您正在使用setColor(Color.BLACK)setColor(Color.WHITE);这些是常数!如果你想改变颜色,他们需要变成变量。尝试将它们作为成员变量放在你的班级中,即

    public final class Final extends JFrame{   
        /* Member Variables. */
        Color mDoorColor  = Color.BLACK;
        Color mHouseColor = Color.WHITE;
    

    然后在渲染中使用这些颜色;即setColor(this.mDoorColor);。当他们成为成员变量时,你可以开始阅读和写作;这意味着您可以为您的图形例程保留某些颜色,但也可以随时更改它们!即this.mHouseColor = Color.CYAN;

  3. 当您创建MouseListener时,(我建议您将课程最终 implement the MouseListener interface),您可以更新mDoorColormHouseColor的值class在那里。然后,您可以为随机变量分配random color

  4. 尝试更好的命名约定。将您的课程称为最终与保留关键字final过于相似。如果有其他人接管,那么打电话给MouseHousePainter并不是一个非常有用的名字。有什么不同的东西,比如MouseDrivenHouseDecoratorpaint

  5. 最后,就像MadProgrammer提到的那样,JFrame是一个非常强大的Java图形类;您不想覆盖其when方法。这是他建议的设计方法的example(毕竟不是很生气,呵呵。)

答案 1 :(得分:1)

我创建的程序可以在鼠标点击时更改门的颜色。

我添加了JPanel来绘制房子并使用Random.nextFloatpaintComponent方法中创建随机颜色。喜欢这个

package com.stackoverflow.main;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Final extends JFrame {
    Random rnd = new Random();
    JPanel panel;

    public Final() {

        setTitle("An Interactive House");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        super.setSize(500, 500);

        addMouseListener(new MouseEventListener());

        panel = new JPanel() {
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);

                paintHouse(g);
            }
        };
        getContentPane().add(panel);

        setVisible(true);
    }

    public void paintHouse(Graphics g) {

        int[] xCoords = { 40, 250, 460 };
        int[] yCoords = { 200, 50, 200 };

        // super.paint(g);

        g.drawRect(80, 200, 330, 260);

        g.drawPolygon(xCoords, yCoords, 3);

        g.setColor(new Color(rnd.nextFloat(), rnd.nextFloat(), rnd.nextFloat()));
        g.fillRect(190, 330, 100, 130);

        g.setColor(Color.white);
        g.fillOval(280, 400, 5, 5);

    }

    private class MouseEventListener extends MouseAdapter {

        public void mouseClicked(MouseEvent arg0) {

            panel.repaint();

        }
    }

    public static void main(String[] args) {
        new Final();
    }

}

我将MouseListener更改为MouseAdapter,因为您只需要mouseClicked