gpt4 book ai didi

java - paintComponent() 仅在最小化-最大化屏幕时被调用

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:22:56 24 4
gpt4 key购买 nike

我正在尝试开发一款需要绘制网格的游戏。为此,我正在使用 paintComponent(Graphics g) 方法,该方法由 repaint() 方法调用。

问题是重绘方法在无限 While 循环内,除非我最小化和最大化屏幕,否则它永远不会调用 paintComponent() 方法。之后它工作正常并在 while 循环中完美地调用了 paintComponent()

所以简而言之,我需要通过最小化-最大化屏幕来触发它。

谁能帮帮我?

在代码中您可以看到 3 个类,即 Frame.java、MenuHandler.java 和 Screen.java。代码从 Frame 类中的 main 方法开始,并在 Screen 扩展 JPanel 时将 Screen 类添加到自身。但是,只有当用户在菜单上选择“创建 map ”时,控件才会转到 Screen 类。然后 MenuHandler 类将控件传递给 Screen 类,其中在 createMap 方法中调用了 run 方法,我在此 run 方法中调用了 repaint 方法。 如此包装;

public class Screen extends JPanel implements Runnable {
Frame frame;

public Screen(Frame frame) {
this.frame = frame;
}

public void createMap() {

thread.start();
}

public void paintComponent(Graphics g) {
g.setColor(Color.BLUE);

}

@Override
public void run() {

System.out.println("Success******");

long lastFrame = System.currentTimeMillis();

int frames = 0;
running = true;
scene = 0;

// the map grid would be refreshed every 2 ms so that we don't get the
// flickering effect
while (running) {

frames++;

if (System.currentTimeMillis() - 1000 >= lastFrame) {
fps = frames;
frames = 0;
lastFrame = System.currentTimeMillis();
}

// to draw stuff all the time on the screen : goes around 2 millions
// frames per second. Which is of no use.
repaint();

try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.exit(0);
}
}

run方法中的定时器代码:

 public void run() {

System.out.println("Success");

long lastFrame = System.currentTimeMillis();

int frames = 0;
running = true;
scene = 0;

// the map grid would be refreshed every 2 ms so that we don't get the
// flickering effect
while (running) {

frames++;

if (System.currentTimeMillis() - 1000 >= lastFrame) {
fps = frames;
frames = 0;
lastFrame = System.currentTimeMillis();
}
System.out.println("before repaint");
// to draw stuff all the time on the screen : goes around 2 millions
// frames per second. Which is of no use.
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
repaint();
}
};

new Timer(200, taskPerformer).start();
System.out.println("after repaint");

try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.exit(0);
}

最佳答案

我想通了这个问题。这只是我必须添加的一行来触发 paintComponent 方法,而不是通过最小化-最大化窗口来完成。

Frame 是我的顶级容器,我正在向框架添加 Screen 组件(它扩展了 JPanel 并实现了 paintComponent)。所以在添加的时候,早些时候我在做

frame.add(screen);

我将其更改为:

frame.getContentPane().add(screen);
frame.getContentPane().validate();

添加后调用验证方法为我完成了。我不知道这是否有意义,但是是的,那是唯一对我有用的线路。

希望对您有所帮助。

关于java - paintComponent() 仅在最小化-最大化屏幕时被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26521214/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com