Java 如何在调整Jframe的大小时停止自动重新绘制()

Java 如何在调整Jframe的大小时停止自动重新绘制(),java,swing,jpanel,awt,Java,Swing,Jpanel,Awt,我还在学习Java,如果有人能帮我,我会很高兴的 抱歉英语不好,我是西班牙人! 我正在做一个平铺游戏,游戏使用经典的“游戏循环”,将引擎速度限制在60帧/秒 循环休眠,然后调用repaint(); 这个很好用!但是 问题是当JFrame被调整大小或最大化时,会调用repaint事件! 例如,当JFrame最大化/调整大小时,游戏渲染速度为10000fps,但当它们不最大化/调整大小时,游戏渲染速度为我设置的速度,因此有一种方法可以禁用自动重新绘制,并使其仅在从我的代码中调用“component.

我还在学习Java,如果有人能帮我,我会很高兴的

抱歉英语不好,我是西班牙人! 我正在做一个平铺游戏,游戏使用经典的“游戏循环”,将引擎速度限制在60帧/秒 循环休眠,然后调用repaint(); 这个很好用!但是

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

这里的问题不是“游戏循环”,问题是当重新调整大小/最大化以更高的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大小时停止自动重新绘制()”

简而言之,你不能控制它。回答得越长,您需要确保在
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重新绘制时(在您的控制下,不是),矩形都会调整大小,而您不希望它调整大小。因此,如果希望矩形仅在您告诉它时才重新绘制,则需要确保仅从外部
paintComponent
方法操作状态(即x,y,size),并仅使用该状态进行绘制。差不多

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);
}
“如何在调整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重新绘制时(在您的控制下,不是),矩形都会调整大小,而您不希望它调整大小。因此,如果希望矩形仅在您告诉它时才重新绘制,则需要确保仅从外部
paintComponent
方法操作状态(即x,y,size),并仅使用该状态进行绘制。差不多

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);
}
所以当JFrame没有最大化时

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

或(调整大小)

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

Toolkit.getDefaultToolkit().setDynamicLayout(false); 
现在,在完成大小调整后,将验证组件

这个.挫折背景(新颜色(210247255))

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

所以当JFrame没有最大化时

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

或(调整大小)

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

Toolkit.getDefaultToolkit().setDynamicLayout(false); 
现在,在完成大小调整后,将验证组件

这个.挫折背景(新颜色(210247255))


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

请添加一些代码。很难仅通过描述来帮助您。因此,您希望能够在不调用repaint()的情况下调整窗口大小?是的,这正是我想要的,我希望游戏以60帧/秒的速度运行,但当我调整repaint()时例如,让游戏以1000 fps的速度运行,在这种情况下,我必须说你可能使用了错误的语言。Java在后端做了很多你无法控制(法律上)改变的事情。我会做更多的研究,以便给你一个明确的答案,但我的猜测是,没有办法做到你所问的……普赛克,我可能错了,检查这个问题,看看它是否有帮助——特别是,检查第二个答案。我觉得这可能就是您需要的。请添加一些代码,仅凭描述很难帮助您。因此,您希望能够在不调用repaint()的情况下调整窗口大小?是的,这正是我想要的,我希望游戏以60 fps的速度运行,但当我调整repaint()的大小时,会调用使游戏以1000 fps的速度运行,例如,在这种情况下,我必须说你可能用错了语言。Java在后端做了很多你无法控制(法律上)改变的事情。我会做更多的研究,以便给你一个明确的答案,但我的猜测是,没有办法做到你所问的……普赛克,我可能错了,检查这个问题,看看它是否有帮助——特别是,检查第二个答案。我觉得这可能就是你需要的。谢谢,问题是当用户调整Jframe的大小时,Jframe会改变它们的大小,但是游戏几乎是一样的(没有改变),但是谢谢你的帮助,我会尝试将游戏渲染到BuferreImage并绘制图像,所以游戏只会在我需要c时更新:但仍然感谢gameYe,但是我没有改变绘制方法的状态,问题是重新绘制是在我的控制之外调用的,java应该有一种方法来禁用自动绘制:(@LesterMurillo我假设
Camera.UpdateCameraAxis();
或此
for(int xx=Math.max(
更改了一些绘制状态。如果没有不完整的代码,就无法判断。可能是我弄错了camera.UpdateCameraAxis()更改了camera x和y,但当玩家不移动时,没有任何更改,但自动重新绘制仍然完成,for循环是绘制瓷砖(就像minecraft 2d/terraria游戏).我正在考虑在我的游戏中禁用resize并使其在fi工作