如何使用鼠标滚轮增加圆周内圆的大小?
How to increase the size of a circle within a circumference using the mouse wheel?
为什么这段代码不能正常工作?,你能帮我更正一下吗,我是 Java 的新手,我几乎整天都在做一些 Java 练习,我即将放弃这个练习,它几乎准备好了,但仍然需要一些修正,基本上,程序的 objective 是当用户将指针放在每个圆周内以及当用户移动时鼠标滚轮,颜色的内部圆圈根据 main class 中指定的参数改变大小,并且永远不会超过圆周的大小,练习有点复杂,因为,此外,圆周如果 window 的大小改变,颜色的内部圆圈的大小和形状应该改变。只有第二个Class可以修改,因为主要的class已经给出了
如果你能帮助我,我将不胜感激,顺便说一下,如果我犯了一些语法错误,我很抱歉,英语不是我的母语
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();
}
}
这是我用的第二个class
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();
}
}
});
}
}
在 Ballon#setupEvents
中,您创建并向组件添加了一个 鼠标滚轮 侦听器,对吧?在一个组件中,你可以有多个监听器(在你的例子中,鼠标滚轮),当鼠标滚轮移动时,这些监听器将被触发。您在 JComponent#paint()
方法中调用此方法 (Ballon#setupEvents
)。因此,每次调用paint()
方法时,都会给组件添加一个new鼠标滚轮监听器。结果是您的组件有多个侦听器。这就是为什么你会出现这种奇怪的行为。
解决方法:组件只添加一个鼠标滚轮监听器。另外,不要@Override
paint()
方法。 @Override
JComponent#paintComponent(Graphics g)
方法。
关于比黑色更大的圆:
我搜索了一下,我可以说你把它复杂化了。据我从这两行可以理解:
int r1=(int) ((double) value/100 * 24*w/29);
int r2=(int) ((double) value/100 * 40*h/71);
您的变量 value
表示为百分比。 "over-complicated" 部分来了。您只需在每个 鼠标滚轮 事件上将此百分比调整 speed*mousewheelrotation
。就这么简单。
P.S:我希望我能更多地解释你做错了什么,但我很难找到你的逻辑,我认为没有必要把事情复杂化。
Balloon.class:
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();
}
});
}
}
为什么这段代码不能正常工作?,你能帮我更正一下吗,我是 Java 的新手,我几乎整天都在做一些 Java 练习,我即将放弃这个练习,它几乎准备好了,但仍然需要一些修正,基本上,程序的 objective 是当用户将指针放在每个圆周内以及当用户移动时鼠标滚轮,颜色的内部圆圈根据 main class 中指定的参数改变大小,并且永远不会超过圆周的大小,练习有点复杂,因为,此外,圆周如果 window 的大小改变,颜色的内部圆圈的大小和形状应该改变。只有第二个Class可以修改,因为主要的class已经给出了
如果你能帮助我,我将不胜感激,顺便说一下,如果我犯了一些语法错误,我很抱歉,英语不是我的母语
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();
}
}
这是我用的第二个class
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();
}
}
});
}
}
在 Ballon#setupEvents
中,您创建并向组件添加了一个 鼠标滚轮 侦听器,对吧?在一个组件中,你可以有多个监听器(在你的例子中,鼠标滚轮),当鼠标滚轮移动时,这些监听器将被触发。您在 JComponent#paint()
方法中调用此方法 (Ballon#setupEvents
)。因此,每次调用paint()
方法时,都会给组件添加一个new鼠标滚轮监听器。结果是您的组件有多个侦听器。这就是为什么你会出现这种奇怪的行为。
解决方法:组件只添加一个鼠标滚轮监听器。另外,不要@Override
paint()
方法。 @Override
JComponent#paintComponent(Graphics g)
方法。
关于比黑色更大的圆:
我搜索了一下,我可以说你把它复杂化了。据我从这两行可以理解:
int r1=(int) ((double) value/100 * 24*w/29);
int r2=(int) ((double) value/100 * 40*h/71);
您的变量 value
表示为百分比。 "over-complicated" 部分来了。您只需在每个 鼠标滚轮 事件上将此百分比调整 speed*mousewheelrotation
。就这么简单。
P.S:我希望我能更多地解释你做错了什么,但我很难找到你的逻辑,我认为没有必要把事情复杂化。
Balloon.class:
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();
}
});
}
}