[英]Java Canvas has low fps if mouse is stationary
If I'm not somehow updating the screen, several calls to canvas.repaint()
seem to be just skipped altogether. 如果我不知道如何更新屏幕,似乎完全跳过了对canvas.repaint()
多次调用。 While moving the mouse, everything works great. 移动鼠标时,一切正常。
My code is as follows: 我的代码如下:
package yeet.gfxTut;
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;
import javax.swing.JFrame;
public class Toot extends Canvas {
private static final long serialVersionUID = 1L;
public static int xPos, yPos, yV, xV;
public static void main(String[] args) throws InterruptedException {
Random rand = new Random();
JFrame frame = new JFrame("My Drawing");
Canvas canvas = new Toot();
canvas.setSize(400, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.add(canvas);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
canvas.addMouseListener(new Toot().new TootMListener());
xPos = rand.nextInt(400);
yPos = rand.nextInt(400);
xV = rand.nextInt(5) + 1;
yV = rand.nextInt(5) + 1;
while (true) {
Thread.sleep(1000 / 60);
canvas.repaint();
}
}
public void paint(Graphics g) {
Random rand = new Random();
if (xPos < 0) {
xV += rand.nextInt(2) - 1;
xV = 0 - xV;
}
if (yPos < 0) {
yV += rand.nextInt(2) - 1;
yV = 0 - yV;
}
if (xPos > 400) {
xV += rand.nextInt(2) - 1;
xV = 0 - xV;
}
if (yPos > 400) {
yV += rand.nextInt(2) - 1;
yV = 0 - yV;
}
xPos += xV;
yPos += yV;
g.fillOval(xPos, yPos, 6, 6);
}
private class TootMListener implements MouseListener {
Random rand = new Random();
@Override
public void mouseClicked(MouseEvent e) {
xV = rand.nextInt(5) + 1;
yV = rand.nextInt(5) + 1;
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
}
I've had this issue on multiple different canvas
projects, any help? 我在多个不同的canvas
项目上遇到了这个问题,有什么帮助吗?
UPDATE: I tried to use the suggested answer, and it resulted in the same issue. 更新:我尝试使用建议的答案,并且导致了相同的问题。 New code is as follows: 新代码如下:
package yeet.gfxTut;
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.Timer;
public class Toot extends Canvas implements ActionListener {
private static final long serialVersionUID = 1L;
public static int xPos, yPos, yV, xV;
Timer timer = new Timer(1000/60, this);
public Toot() {
super();
timer.start();
}
public static void main(String[] args) throws InterruptedException {
// timer.start();
Random rand = new Random();
JFrame frame = new JFrame("My Drawing");
Canvas canvas = new Toot();
canvas.setSize(400, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.add(canvas);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
canvas.addMouseListener(new Toot().new TootMListener());
xPos = rand.nextInt(400);
yPos = rand.nextInt(400);
xV = rand.nextInt(5) + 1;
yV = rand.nextInt(5) + 1;
while (true) {
Thread.sleep(1000 / 60);
canvas.repaint();
}
}
public void paint(Graphics g) {
Random rand = new Random();
if (xPos < 0) {
xV += rand.nextInt(2) - 1;
xV = 0 - xV;
}
if (yPos < 0) {
yV += rand.nextInt(2) - 1;
yV = 0 - yV;
}
if (xPos > 400) {
xV += rand.nextInt(2) - 1;
xV = 0 - xV;
}
if (yPos > 400) {
yV += rand.nextInt(2) - 1;
yV = 0 - yV;
}
xPos += xV;
yPos += yV;
g.fillOval(xPos, yPos, 6, 6);
}
private class TootMListener implements MouseListener {
Random rand = new Random();
@Override
public void mouseClicked(MouseEvent e) {
xV = rand.nextInt(5) + 1;
yV = rand.nextInt(5) + 1;
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
@Override
public void actionPerformed(ActionEvent e) {
// if(e.getSource() == timer){
repaint();
// }
}
}
Referring to the first code, instead of 引用第一个代码,而不是
while (true) {
Thread.sleep(1000 / 60);
canvas.repaint();
}
use the Timer
in the Swing package: 使用Swing包中的Timer
:
new javax.swing.Timer(1000/60,event->canvas.repaint()).start();
I have taken your class and it runs smooth as expected: 我参加了您的课程,并且按预期进行得很顺利:
public class Toot extends Canvas {
private static final long serialVersionUID = 1L;
public static int xPos, yPos, yV, xV;
public static void main(String[] args) throws InterruptedException {
Random rand = new Random();
JFrame frame = new JFrame("My Drawing");
Canvas canvas = new Toot();
canvas.setSize(400, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.add(canvas);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
canvas.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
xV = rand.nextInt(5) + 1;
yV = rand.nextInt(5) + 1;
}
});
xPos = rand.nextInt(400);
yPos = rand.nextInt(400);
xV = rand.nextInt(5) + 1;
yV = rand.nextInt(5) + 1;
new javax.swing.Timer(1000/60,e->canvas.repaint()).start();
}
@Override
public void paint(Graphics g) {
Random rand = new Random();
if (xPos < 0) {
xV += rand.nextInt(2) - 1;
xV = Math.abs(xV);
}
if (yPos < 0) {
yV += rand.nextInt(2) - 1;
yV = Math.abs(yV);
}
if (xPos > 400) {
xV += rand.nextInt(2) - 1;
xV = - Math.abs(xV);
}
if (yPos > 400) {
yV += rand.nextInt(2) - 1;
yV = - Math.abs(yV);
}
xPos +=xV;
yPos +=yV;
g.fillOval(xPos, yPos, 6, 6);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.