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