我正在开发一个小项目,我需要在屏幕上绘制少量几个形状。我还需要捕获实用程序功能的鼠标事件。现在,我有一个捕获点击的程序,并从该位置发出一点点涟漪。但是,无论何时移动鼠标,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