Как использовать целые MouseMotion в другом методе - PullRequest
1 голос
/ 05 февраля 2020

Так что, в основном, я играю с графикой и собираю забавные вещи, которые я хочу знать, прежде чем делать игру. Я хочу знать разные способы, как я могу использовать разные циклы, чтобы делать забавные вещи, но я не могу понять, как я можно использовать INT, который я делаю в методе mouseMoved, а затем использовать его в графическом методе. Код может показать лучший пример того, что я пытаюсь объяснить.

package com.martin;

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.Random;
import javax.swing.*;

public class Grids extends JFrame implements MouseMotionListener {

    JPanel p = new JPanel();

    public int width = 1200;
    public int height = 800;

    public Grids() {
        addMouseMotionListener(this);
        windowLoader();
    }

    public static void main(String[] args){
        new Grids();
    }
    public void windowLoader() {
        setPreferredSize(new Dimension(width, height));
        setMaximumSize(new Dimension(width, height));
        setMinimumSize(new Dimension(width, height));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setLocationRelativeTo(null);
//        setBackground(Color.BLACK);

        p.setSize(width, height);
        p.setOpaque(false);
//        p.setBackground(Color.BLACK);
        add(p);

        pack();
        setVisible(true);
    }

    public void mouseMoved(MouseEvent e) {
        double mouseX = e.getX();
        double mouseY = e.getY();

    }
    public void mouseDragged(MouseEvent e) {
    }

    public void paint(Graphics g) {
        Random rand = new Random();

        int cols, rows;
        int size = 8;
        Color color;

        for (rows = 0; rows < width; rows++) {
            for (cols = 0; cols < height; cols++) {
                color = new Color(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256));

//                g.setColor(color);
//                g.fillRect(rows * size, cols * size, size, size);

//                g.drawRect(rows * size, cols * size, size, size);

//                g.drawLine(rows * size, cols * size, size, size);

//                g.drawRoundRect(rows * size, cols * size, size, size, 10, 10);

//                g.fillRoundRect(rows * size, cols * size, size, size, 10, 10);
            }
        }
//        int x = 0;
//        int y = 0;
//        int spacing = rand.nextInt(20) + 1;
//
//        while (spacing > -1) {
//            spacing = spacing + rand.nextInt(20);
//        }
//
//        while (x < width) {
//            g.drawLine(x, 0, x, height);
//            x = x + spacing;
//        }
//        while (y < height) {
//            g.drawLine(0, y, width, y);
//            y = y + spacing;
//        }

//        Point mouseL = MouseInfo.getPointerInfo().getLocation();

//        double mouseX = mouseL.getX();
//        double mouseY = mouseL.getY();
        int x = 0, y = 0;

//Can't access the int from the mouseMoved I get red underline for error (variable cannot be found)

        while (x < width) {
            if (mouseX < 1) {
                x = x + 10;
            } else {
                x = x + (int)mouseX;
            }
            while (y < height) {
                if (mouseY < 1) {
                    y = y + 10;
                } else {
                    y = y + (int)mouseY;
                }
                g.fillRoundRect(x, y, 10, 10, 10, 10);
            }
        }

        repaint();
    }
}

Это весь код, и я попытался использовать MouseInfo, чтобы получить местоположение указателя, но он получает местоположение компонента JFrame. и я хочу получить указатель мыши на самом JFrame, а не на компоненте.

1 Ответ

1 голос
/ 14 февраля 2020

Я полагаю, что следующее mre демонстрирует желаемую функциональность. Используйте drawTrail для включения или выключения рисования следа:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Grids extends JPanel implements MouseMotionListener {

    public final static int WIDTH = 1200, HEIGHT = 800, POINT_SIZE = 10;
    private double mouseX, mouseY;
    private List<Point> points ; //stores all trail points
    private boolean drawTrail = true; //change to false to draw only one point at the mouse location

    public Grids() {
        addMouseMotionListener(this);
        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        setBackground(Color.WHITE);
        if(drawTrail) {
            points = new ArrayList<>(); //add mouse point to collection
        }
    }

    @Override
    public void mouseMoved(MouseEvent e) {

        //set a min distance between points 
        if( Math.abs(mouseX - e.getX()) >= POINT_SIZE || Math.abs(mouseY - e.getY()) >= POINT_SIZE ) {
            if(drawTrail) {
                points.add(new Point(e.getX(),e.getY()));
            }
            mouseX = e.getX();
            mouseY = e.getY();
            repaint();
        }
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Random rand = new Random();

        if(drawTrail){
            //draw all collected points
            for (Point p : points){
                Color color = new Color(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256));
                g.setColor(color);
                g.fillOval(p.x, p.y, POINT_SIZE, POINT_SIZE);
            }
        }else{
            //if you only want the point at the
            Color color = new Color(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256));
            g.setColor(color);
            g.fillOval((int)mouseX, (int)mouseY, POINT_SIZE, POINT_SIZE);
        }
    }

    @Override
    public void mouseDragged(MouseEvent e) {/*todo*/}

    public static void main(String[] args0) {
        JFrame frame = new JFrame();
        frame.add(new Grids());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setLocationByPlatform(true);
        frame.pack();
        frame.setVisible(true);
    }
}
...