Как увеличить размер круга внутри окружности с помощью колесика мыши? - PullRequest
0 голосов
/ 24 февраля 2019

Почему этот код не работает так, как он должен работать? Не могли бы вы помочь мне исправить это, я новичок в 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();

                }
            }
        }); 
    }
}

1 Ответ

0 голосов
/ 24 февраля 2019

В Ballon#setupEvents вы создаете и добавляете колесико мыши к компоненту, верно?В компоненте вы можете использовать несколько слушателей (в вашем случае, колесико мыши ), которые будут запущены при перемещении колесико мыши .Вы вызываете этот метод (Ballon#setupEvents) внутри JComponent#paint() метода.Поэтому при каждом вызове метода paint() к компоненту добавляется новый колесико мыши слушатель.В результате у вашего компонента несколько слушателей.Вот почему вы получаете такое странное поведение.

Решение: Добавьте к компоненту только одного слушателя колеса мыши.Кроме того, не @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 выражена в процентах.И тут возникает «слишком сложная» часть.Вам просто нужно отрегулировать этот процент на speed*mousewheelrotation на каждом колесе мыши .Все просто.

PS: Хотел бы я больше объяснить, что вы сделали неправильно, но мне было трудно найти вашу логику, и я не думаю, что необходимо усложнять ситуацию.

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();

            }
        }); 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...