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

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鼠标滚轮监听器。结果是您的组件有多个侦听器。这就是为什么你会出现这种奇怪的行为。

解决方法:组件只添加一个鼠标滚轮监听器。另外,不要@Overridepaint()方法。 @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();

            }
        }); 
    }
}