Java 如何使用鼠标滚轮增加圆周内圆的大小?

Java 如何使用鼠标滚轮增加圆周内圆的大小?,java,swing,actionlistener,mouselistener,mousewheel,Java,Swing,Actionlistener,Mouselistener,Mousewheel,为什么这个代码不能正常工作?你能帮我纠正一下吗,我是Java新手,我几乎整天都在做一些Java练习,我准备放弃这个练习,它几乎准备好了,但基本上还需要一些纠正,该程序的目标是,当用户将指针放在每个圆周内,并且当用户移动鼠标滚轮时,颜色的内圆的大小会根据主类中指定的参数而变化,并且永远不能超过圆周的大小,因此练习会稍微复杂一些,因为,此外,如果窗口的大小改变,颜色的周长和内圆的大小和形状也应该改变。只能修改第二个类,因为已经给出了主类 如果你能帮助我,我将不胜感激。顺便说一句,如果我犯了一些语法错

为什么这个代码不能正常工作?你能帮我纠正一下吗,我是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完成了。谢谢你的帮助,你知道吗如果有一个更简单的方法来改变一个物体的大小,比如那些圆,如果窗口的大小改变了,我问它,因为现在我必须找到一个更简单的方法