我正在处理这个我需要画房子的代码。房子有一个门(矩形),用鼠标点击随机改变颜色。门外的其他所有东西都根本不会改变颜色。
如何在鼠标点击时更改门的颜色?
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();
}
}
答案 0 :(得分:3)
好的,还有一些问题需要解决;但是,嘿,StackOverflow还有什么用?
paint(Graphics g)
时,您都会创建并分配new MouseEventListener
。实际上,这是您在初始化时只想做的事情,除非您能预见到将来需要接收更新的多个MouseEventListener
;但即使这样,你也不想在渲染过程中反复做这件事;你宁可在其他地方异步地做这件事。无论您在任何类型的渲染操作中使用什么逻辑,它都应该只与渲染相关,或者执行需要在每个渲染过程中同步的任务。当您在此课程上注册MouseEventListener
时,我确定您希望它在您的应用程序的生命周期内接收事件;不会被不断覆盖!您正在使用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;
当您创建MouseListener
时,(我建议您将课程最终 implement
the MouseListener
interface
),您可以更新mDoorColor
和mHouseColor
的值class
在那里。然后,您可以为随机变量分配random color。
尝试更好的命名约定。将您的课程称为最终与保留关键字final
过于相似。如果有其他人接管,那么打电话给MouseHousePainter
并不是一个非常有用的名字。有什么不同的东西,比如MouseDrivenHouseDecorator
? paint
最后,就像MadProgrammer提到的那样,JFrame是一个非常强大的Java图形类;您不想覆盖其when
方法。这是他建议的设计方法的example。 (毕竟不是很生气,呵呵。)
答案 1 :(得分:1)
我创建的程序可以在鼠标点击时更改门的颜色。
我添加了JPanel来绘制房子并使用Random.nextFloat
在paintComponent
方法中创建随机颜色。喜欢这个
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
。