我在调整Jframe大小时如何停止自动重绘()

我还在学习Java,如果有人能帮助我,我会很开心!

抱歉英语不好,我是西class牙语! 我正在制作一个平铺游戏,游戏使用经典的“游戏循环”,将引擎限制为60fps循环睡眠,然后调用repaint(); 这很好用! 但..

问题是在调整JFrame大小或最大化时调用重绘事件! 例如,当JFrame最大化/resize时,游戏以10000fps渲染,但是当它们没有时,游戏以我设置的速度渲染,因此有一种方法可以禁用自动重绘并使其仅在“component.repaint()时工作” “从我的代码中调用?

这里的问题不是“游戏循环”,问题是当重新resize/最大化时,重绘被称为自动渲染更多fps的游戏!

public class Handling { static private int fps=0; static private int fpsfinal=0; static int frames = 60; static int frames_skip = 1000 / frames; static long ticknext = GetTickCount(); static long ticksleep = 0; public static void Run() { for(;;){ Main.getDevice().repaint(); fps++; ticknext += frames_skip; ticksleep = ticknext - GetTickCount(); if(ticksleep >= 0) { try { Thread.sleep(ticksleep); } catch (InterruptedException e) { e.printStackTrace(); } } } } public static long GetTickCount(){ return System.currentTimeMillis(); } public static int GetFPS(){ fpsfinal=fps; fps=0; return fpsfinal-2; } import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.image.ImageObserver; import javax.swing.*; public class Game extends JPanel{ private static final long serialVersionUID = 1L; static boolean dir=true; @Override public void paintComponent(Graphics g){ super.paintComponent(g); int layout=Main.layout; Graphics2D g2d = (Graphics2D) g; g.setFont(Resources.GetFont(0)); Camera.UpdateCameraAxis(); Camera.DoCamera(); Cursor.MouseLoop(); if (layout==0){ this.setBackground(new Color(210,247,255)); for(int xx=Math.max( etc.... 

所以当JFrame没有最大化时

我不知道为什么这会导致问题,因为只应生成一个重绘请求。

或(resize)

我可以看到这是一个问题,因为重新调整帧的每个像素都会调用重绘。 在这种情况下,您可以使用:

 Toolkit.getDefaultToolkit().setDynamicLayout(false); 

现在,在resize完成后,组件将得到validation。

this.setBackground(new Color(210,247,255));

不要使用上面的代码,因为更改背景会导致调用repaint(),这将再次调用paintComponent()方法。 绘画方法仅用于绘画。

“当我调整Jframe的大小时,如何停止自动重绘()

简短的回答,你控制它。 更长的答案,您需要确保在paintComponent方法中没有做任何改变状态(您正在使用绘制)的事情。 例如:

 @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Random random = new Random(); int x = random.nextInt(100); int y = random.nextInt(100); int size = random.nextInt(100); g.drawRect(x, y, size, size); } 

这里发生的是每次GUI重新绘制,这不受你的控制,矩形将resize,而不是你想要它。 因此,如果您希望矩形仅在告诉它时重新绘制,则需要确保仅从paintComponent方法外部操纵状态(即x,y,大小),并使用该状态进行绘制。 就像是

 Random random = new Random(); int x, y, size; ... void reset() { x = random.nextInt(100); y = random.nextInt(100); size = random.nextInt(100); } ... Timer timer = new Timer(25, new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { reset(); repaint(); } }).start(); ... @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawRect(x, y, size, size); }