JPanel - 鼠标移动时图形会停止吗?

时间:2016-02-20 20:43:05

标签: java jpanel rendering mouse paintcomponent

我正在开发一个小项目,我需要在屏幕上绘制少量几个形状。我还需要捕获实用程序功能的鼠标事件。现在,我有一个捕获点击的程序,并从该位置发出一点点涟漪。但是,无论何时移动鼠标,paintComponent(Graphics g)方法都会完全停止。我认为这是一个缓冲问题,所以我实现了一个,它在正常渲染时只是放慢了速度。另一个奇怪的事情是:当按住鼠标时,paintComponent方法不再关心鼠标的移动。它恢复正常。 编辑:我还应该提到鼠标事件是由实现MouseListener的类触发的。他们正确地打电话。为了获得鼠标位置,我用这个:     public Point getMouse() { Point mousePos = MouseInfo.getPointerInfo().getLocation(); SwingUtilities.convertPointFromScreen(mousePos, screen); return mousePos; }

package com.noneofyebidmness;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.util.ArrayList;

import javax.swing.JPanel;

import com.noneofyebidmness.Organism;

@SuppressWarnings("serial")
public class Screen extends JPanel {
private int diameter = 10;
private ArrayList<Point> ripplePositions;
private ArrayList<Point> rippleDiameters;

public Screen() {
    ripplePositions = new ArrayList<Point>();
    rippleDiameters = new ArrayList<Point>();
}

@Override
public Dimension getPreferredSize() {
    return new Dimension(Reference.SCREEN_WIDTH_DEFAULT, Reference.SCREEN_HEIGHT_DEFAULT);
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    System.out.println("Painting");
    Graphics2D g2d = (Graphics2D) g.create();
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        for(Organism o : Wrapper.getInstance().getOrganisms()) {
            o.draw(g2d);
        }

        Point mouse = Wrapper.getInstance().getMouse();
        Utility.background(Utility.color(0, 150, 250), g2d, this);          
        g2d.setColor(Utility.color(255));
        g2d.fillOval((int)mouse.getX() - diameter / 2, (int)mouse.getY() - diameter / 2, diameter, diameter);

        g2d.setColor(Color.BLACK);
        g2d.drawString(Wrapper.FPS_PERIODIC + "", 10, 20);

        for(int i = 0; i < ripplePositions.size(); i++) {
            int w = rippleDiameters.get(i).x;
            g2d.setColor(Utility.color(255, Math.min(220-w, 255)));
            g2d.setStroke(new BasicStroke(10));
            g2d.drawOval(ripplePositions.get(i).x - w / 2, ripplePositions.get(i).y - w / 2, rippleDiameters.get(i).x, rippleDiameters.get(i).x);

            if(w < 255) {
                rippleDiameters.get(i).x += rippleDiameters.get(i).y;
                if(rippleDiameters.get(i).y > 0)
                    rippleDiameters.get(i).y -= 0.01;
            }

            if(220-w == 0) { 
                ripplePositions.remove(i);
                rippleDiameters.remove(i);
            }
        }
    g2d.dispose();
}

public void addRipple() {
    ripplePositions.add(Wrapper.getInstance().getMouse());
    rippleDiameters.add(new Point(diameter, 20));
}
}

TL; DR: 当鼠标移到我的JPanel上时,它会停止调用paintComponent()。 如果按住并移动鼠标,则操作正常。

感谢任何帮助,     Carl Litchman

0 个答案:

没有答案