Java 如何使用鼠标滚轮增加圆周内圆的大小?
为什么这个代码不能正常工作?你能帮我纠正一下吗,我是Java新手,我几乎整天都在做一些Java练习,我准备放弃这个练习,它几乎准备好了,但基本上还需要一些纠正,该程序的目标是,当用户将指针放在每个圆周内,并且当用户移动鼠标滚轮时,颜色的内圆的大小会根据主类中指定的参数而变化,并且永远不能超过圆周的大小,因此练习会稍微复杂一些,因为,此外,如果窗口的大小改变,颜色的周长和内圆的大小和形状也应该改变。只能修改第二个类,因为已经给出了主类 如果你能帮助我,我将不胜感激。顺便说一句,如果我犯了一些语法错误,我很抱歉,英语不是我的母语Java 如何使用鼠标滚轮增加圆周内圆的大小?,java,swing,actionlistener,mouselistener,mousewheel,Java,Swing,Actionlistener,Mouselistener,Mousewheel,为什么这个代码不能正常工作?你能帮我纠正一下吗,我是Java新手,我几乎整天都在做一些Java练习,我准备放弃这个练习,它几乎准备好了,但基本上还需要一些纠正,该程序的目标是,当用户将指针放在每个圆周内,并且当用户移动鼠标滚轮时,颜色的内圆的大小会根据主类中指定的参数而变化,并且永远不能超过圆周的大小,因此练习会稍微复杂一些,因为,此外,如果窗口的大小改变,颜色的周长和内圆的大小和形状也应该改变。只能修改第二个类,因为已经给出了主类 如果你能帮助我,我将不胜感激。顺便说一句,如果我犯了一些语法错
package Hw03_Balloon;
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.JFrame;
public class BalloonTest extends JFrame {
private Balloon ct_red, ct_green, ct_blue;
public BalloonTest() {
setTitle("Balloon Test");
setSize(450, 250);
setupWidgets();
setupEvents();
setVisible(true);
}
private void setupEvents() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
private void setupWidgets() {
ct_red =new Balloon(100, 0, 100, Color.RED, 1);
ct_green =new Balloon(20, 0, 100, Color.BLUE, 5);
ct_blue =new Balloon(20, 0, 100, Color.ORANGE, 10);
setLayout(new GridLayout(1,3));
add(ct_red);
add(ct_green);
add(ct_blue);
}
public static void main(String[] args) {
new BalloonTest();
}
}
这是我用的第二节课
package Hw03_Balloon;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import javax.swing.JComponent;
public class Balloon extends JComponent{
private int value;
private int min;
private int max;
private Color col;
private int speed;
public int r1;
public Balloon(int value, int min, int max, Color col, int speed) {
this.value=value;
this.min=min;
this.max=max;
this.col=col;
this.speed=speed;
}
public void paint(Graphics g) {
int w =getWidth();
int h =getHeight();
int x=w/2;
int y=h/2;
int r1=(int) ((double)value/100*24*w/29);
int r2=(int) ((double) value/100*40*h/71);
System.out.println(r1);
x = x-(r1/2);
y = y-(r2/2);
g.setColor(col);
g.fillOval(x, y, r1, r2);
g.setColor(Color.BLACK);
x=w/2;
y=h/2;
r1=24*w/29;
r2=40*h/71;
x = x-(r1/2);
y = y-(r2/2);
g.drawOval(x, y, r1, r2);
this.r1=r1;
setupEvents();
}
private void setupEvents() {
addMouseWheelListener(new MouseWheelListener() {
public void mouseWheelMoved(MouseWheelEvent ev) {
if(value+ev.getWheelRotation()>=0 && value+ev.getWheelRotation()<=r1) {
value -= speed*ev.getWheelRotation();
if (value<=0) value=0+1;
if (value>=r1) value=r1-1;
repaint();
}
}
});
}
}
包装Hw03\u气球;
导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.event.mouseweelEvent;
导入java.awt.event.MouseWheelListener;
导入javax.swing.JComponent;
公共类气球扩展JComponent{
私有int值;
私用int min;
私人int max;
私人色彩;
私人整数速度;
公共int r1;
公共引出序号(int值、int最小值、int最大值、颜色列、int速度){
这个。值=值;
这个.min=min;
这个。max=max;
this.col=col;
这个。速度=速度;
}
公共空间涂料(图g){
int w=getWidth();
inth=getHeight();
int x=w/2;
int y=h/2;
int r1=(int)((双)值/100*24*w/29);
int r2=(int)((双)值/100*40*h/71);
系统输出打印项次(r1);
x=x-(r1/2);
y=y-(r2/2);
g、 setColor(col);
g、 椭圆形(x,y,r1,r2);
g、 设置颜色(颜色为黑色);
x=w/2;
y=h/2;
r1=24*w/29;
r2=40*h/71;
x=x-(r1/2);
y=y-(r2/2);
g、 牵引椭圆(x,y,r1,r2);
这是r1=r1;
setupEvents();
}
私有void setupEvents(){
addMouseWheelListener(新的MouseWheelListener(){
公共无效mouseWheelMoved(MouseWheelEvent ev){
如果在Ballon#setupEvents
中(value+ev.getWheelRotation()>=0&&value+ev.getWheelRotation(),您可以创建一个鼠标滚轮侦听器并将其添加到组件中,对吗?在一个组件中,您可以在移动鼠标滚轮时触发多个侦听器(在您的情况下,鼠标滚轮)。您可以调用此方法(Ballon#setupEvents
)在JComponent#paint()
方法内部。因此,每次调用paint()
方法时,都会向组件添加一个新的鼠标滚轮侦听器。结果是组件有多个侦听器。这就是为什么会出现这种奇怪的行为
解决方案:只向组件添加一个鼠标滚轮侦听器。另外,不要使用@Override
paint()
方法。@Override
JComponent\paintComponent(图形g)
方法
关于边界比黑色边界大的圆:
public class Balloon extends JComponent{
private int value;
private int min;
private int max;
private Color col;
private int speed;
public int r1;
public Balloon(int value, int min, int max, Color col, int speed) {
this.value=value;
this.min=min;
this.max=max;
this.col=col;
this.speed=speed;
setupEvents(); //Call only 1 time in constructor
this.r1=24*(getWidth()/2)/29; //Declare it one time
}
@Override
public void paintComponent(Graphics g) {
int w =getWidth();
int h =getHeight();
int x=w/2;
int y=h/2;
int r1=(int) ((double)value/100*24*w/29);
int r2=(int) ((double) value/100*40*h/71);
System.out.println(r1);
x = x-(r1/2);
y = y-(r2/2);
g.setColor(col);
g.fillOval(x, y, r1, r2);
g.setColor(Color.BLACK);
x=w/2;
y=h/2;
r1=24*w/29;
r2=40*h/71;
x = x-(r1/2);
y = y-(r2/2);
g.drawOval(x, y, r1, r2);
}
private void setupEvents() {
addMouseWheelListener(new MouseWheelListener() {
public void mouseWheelMoved(MouseWheelEvent ev) {
value -= speed*ev.getWheelRotation();
if (value<=0)
value=speed; //Minimum
if (value>=100)
value=100; //Maximum
repaint();
}
});
}
}
我搜索了一下,我可以说你把它复杂化了。从这两行我可以理解:
int r1=(int)((双)值/100*24*w/29)
int r2=(int)((双)值/100*40*h/71)
您的变量值
表示为百分比。这里是“过于复杂”的部分。您只需在每个鼠标滚轮事件上通过速度*鼠标滚轮旋转
调整此百分比。就这么简单
附言:我希望我能更多地解释你做错了什么,但我很难找到你的逻辑,我认为没有必要把事情复杂化
气球。类别:
public class Balloon extends JComponent{
private int value;
private int min;
private int max;
private Color col;
private int speed;
public int r1;
public Balloon(int value, int min, int max, Color col, int speed) {
this.value=value;
this.min=min;
this.max=max;
this.col=col;
this.speed=speed;
setupEvents(); //Call only 1 time in constructor
this.r1=24*(getWidth()/2)/29; //Declare it one time
}
@Override
public void paintComponent(Graphics g) {
int w =getWidth();
int h =getHeight();
int x=w/2;
int y=h/2;
int r1=(int) ((double)value/100*24*w/29);
int r2=(int) ((double) value/100*40*h/71);
System.out.println(r1);
x = x-(r1/2);
y = y-(r2/2);
g.setColor(col);
g.fillOval(x, y, r1, r2);
g.setColor(Color.BLACK);
x=w/2;
y=h/2;
r1=24*w/29;
r2=40*h/71;
x = x-(r1/2);
y = y-(r2/2);
g.drawOval(x, y, r1, r2);
}
private void setupEvents() {
addMouseWheelListener(new MouseWheelListener() {
public void mouseWheelMoved(MouseWheelEvent ev) {
value -= speed*ev.getWheelRotation();
if (value<=0)
value=speed; //Minimum
if (value>=100)
value=100; //Maximum
repaint();
}
});
}
}
公共类气球扩展JComponent{
私有int值;
私用int min;
私人int max;
私人色彩;
私人整数速度;
公共int r1;
公共引出序号(int值、int最小值、int最大值、颜色列、int速度){
这个。值=值;
这个.min=min;
这个。max=max;
this.col=col;
这个。速度=速度;
setupEvents();//在构造函数中只调用1次
this.r1=24*(getWidth()/2)/29;//声明一次
}
@凌驾
公共组件(图形g){
int w=getWidth();
inth=getHeight();
int x=w/2;
int y=h/2;
int r1=(int)((双)值/100*24*w/29);
int r2=(int)((双)值/100*40*h/71);
系统输出打印项次(r1);
x=x-(r1/2);
y=y-(r2/2);
g、 setColor(col);
g、 椭圆形(x,y,r1,r2);
g、 设置颜色(颜色为黑色);
x=w/2;
y=h/2;
r1=24*w/29;
r2=40*h/71;
x=x-(r1/2);
y=y-(r2/2);
g、 牵引椭圆(x,y,r1,r2);
}
私有void setupEvents(){
addMouseWheelListener(新的MouseWheelListener(){
公共无效mouseWheelMoved(MouseWheelEvent ev){
值-=速度*ev.getWheelRotation();
如果(值=100)
值=100;//最大值
重新油漆();
}
});
}
}
非常感谢,我没有意识到这是我的错误,一个问题解决了,现在,你知道为什么颜色的内圆超过圆周的大小吗?@LuisAlejandro抱歉,我太关注听众了,我忘了你也有这个问题。现在就编辑帖子。@LuisAlejandro完成了。谢谢你的帮助,你知道吗如果有一个更简单的方法来改变一个物体的大小,比如那些圆,如果窗口的大小改变了,我问它,因为现在我必须找到一个更简单的方法