Java JFrame简单应用程序

Java JFrame简单应用程序,java,swing,timer,jpanel,paintcomponent,Java,Swing,Timer,Jpanel,Paintcomponent,我正在努力创造一个游戏的乐趣,基本上是一个简单的代表进化 基本上,当我点击移动的球时,它会改变颜色。目标是不断改变,直到它与背景颜色匹配,这意味着球成功隐藏。最后,我会添加更多的球,但我正试图找出如何改变鼠标点击它的颜色。到目前为止,我已经创建了移动球动画 单击球时如何更改球的颜色 代码: 公共类进化颜色 { 公共静态void main(字符串参数[]) { JFrame=新JFrame(“弹跳球”); frame.setDefaultCloseOperation(JFrame.EXIT_ON_

我正在努力创造一个游戏的乐趣,基本上是一个简单的代表进化

基本上,当我点击移动的球时,它会改变颜色。目标是不断改变,直到它与背景颜色匹配,这意味着球成功隐藏。最后,我会添加更多的球,但我正试图找出如何改变鼠标点击它的颜色。到目前为止,我已经创建了移动球动画

单击球时如何更改球的颜色

代码:

公共类进化颜色
{
公共静态void main(字符串参数[])
{
JFrame=新JFrame(“弹跳球”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
BallPanel bp=新的BallPanel();
帧。添加(bp);
frame.setSize(18001100);//设置帧大小
frame.setVisible(true);//显示帧
bp.立根背景(颜色:黄色);
}//末端总管
}
类BallPanel扩展JPanel实现ActionListener
{       
专用int延迟=10;
保护定时器;
私有int x=0;//x位置
私有整数y=0;//y位置
私有整数半径=15;//球半径
私有int dx=2;//增量(x坐标)
private int dy=2;//增量(y坐标)
公共事务委员会()
{
定时器=新定时器(延迟,此);
timer.start();//启动计时器
}
已执行的公共无效操作(操作事件e)
//将在计时器启动时运行
{
重新油漆();
}
公共无效鼠标单击(鼠标事件arg0)
{
System.out.println(“点击了一下!”);
}
//绘制矩形和圆弧
公共组件(图形g)
{
super.paintComponent(g);//调用超类的paintComponent
g、 setColor(Color.red);
//检查边界
如果(xgetWidth()-radius)dx=-Math.abs(dx);
如果(ygetHeight()-radius)dy=-Math.abs(dy);
//调整球位
x+=dx;
y+=dy;
g、 圆角(x-半径,y-半径,半径*2,半径*2);
}    
}
看一看

不要在
paintComponent
中决定视图的状态,可以出于多种原因进行绘制,许多原因您无法控制。相反,在
计时器的
方法中执行
操作
来做出这些决定

你也可以考虑稍微改变一下设计。与将球作为
JPanel
s不同,您可以创建一个球的虚拟概念,其中包含它所需的所有属性和逻辑,并使用
JPanel
来绘制它们。然后,您可以将它们存储在某种类型的
列表中
,每次注册鼠标单击时,您可以迭代
列表
,并检查是否单击了任何球

以查看为例

查看

不要在
paintComponent
中决定视图的状态,可以出于多种原因进行绘制,许多原因您无法控制。相反,在
计时器的
方法中执行
操作
来做出这些决定

你也可以考虑稍微改变一下设计。与将球作为
JPanel
s不同,您可以创建一个球的虚拟概念,其中包含它所需的所有属性和逻辑,并使用
JPanel
来绘制它们。然后,您可以将它们存储在某种类型的
列表中
,每次注册鼠标单击时,您可以迭代
列表
,并检查是否单击了任何球


请看一个示例

而不是硬编码颜色(
g.setColor(color.red);
),为什么不创建一个属性:

g.setColor(currentColor);

然后,当您单击圆形区域时,更改
currentColor

而不是硬编码颜色(
g.setColor(color.red);
),为什么不创建一个属性:

g.setColor(currentColor);

然后,当您单击圆形区域时,更改
currentColor

谢谢!我添加了鼠标侦听器并更改了颜色。这样,当它重新绘制画布时,它会改变颜色。谢谢!我添加了鼠标侦听器并更改了颜色。这样,当它重新绘制画布时,它会更改颜色。