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

时间:2014-10-05 02:16:53

标签: java swing jpanel awt

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

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

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

这里的问题不是"游戏循环",问题是当重新调整大小/最大化时,重绘会被称为自动渲染游戏更多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....

2 个答案:

答案 0 :(得分:4)

  

所以当JFrame没有最大化时

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

  

或(调整大小)

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

Toolkit.getDefaultToolkit().setDynamicLayout(false); 

现在,在调整大小完成后,组件将得到验证。

  

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

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

答案 1 :(得分:3)

  

"当我调整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重新绘制,在你的控制下时,矩形将调整大小,而不需要它。因此,如果您希望矩形仅在告诉它时重新绘制,您需要确保仅从外部操纵状态(即x,y,大小) paintComponent方法,使用该状态绘制。像

这样的东西
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);
}