gpt4 book ai didi

java - JApplet repaint() 不起作用

转载 作者:行者123 更新时间:2023-12-02 06:37:30 25 4
gpt4 key购买 nike

问题:Main.repaint() 对我不起作用。 repaint() 不会调用 Main 中的绘制方法。我尝试在重新绘制之前调用 validate 但没有成功。主要绘画最初或调整大小时完美,但当我在代码中调用 repaint() 时,什么也没有发生。

这是该程序到目前为止的样子 link

所以我试图用java为游戏创建一个关卡选择屏幕。我的游戏是 JApplet。我的结构如下:

  1. 我的 Main 类扩展了 JApplet 并包含一个对象LevelScreen类

    LevelScreen 有一个 Main 调用的绘制方法。

我试图避免使用 Swing,因为布局管理器给我的设计带来了麻烦。所以我尝试制作一个更简单、更适合我的需要的结构。

Main.java中的paint()

public class Main extends JApplet {

public static final int WIDTH = 700, HEIGHT = 500;
private static Main instance;

private LevelScreen levelScreen = new LevelScreen();
private View view = View.LEVELSCREEN;

public static Main getInstance() {
if (instance == null)
instance = new Main();
return instance;
}

@Override
public void init() {
setSize(WIDTH, HEIGHT);
addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
Point p = e.getPoint();
if (view == View.LEVELSCREEN) {
levelScreen.mouseMoved(p);
}
}
});
}

@Override
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);

if (view == View.LEVELSCREEN)
levelScreen.paint(g2);
}

public enum View {
GAME, LEVELSCREEN;
}
}

在我的按钮代码中,我尝试重新绘制 Main,因为我想在鼠标离开按钮时制作淡出动画。我的问题是我无法使用 repaint() 调用 main 中的paint(Graphics g)

这里我调用repaint():

public void mouseExited() {
//start new thread to make fade out animation when mouse leave
mouseOver = false;
TimerTask task = new TimerTask() {

@Override
public void run() {
while (!mouseOver && opacity > 0.6) {
opacity -= 0.02;
//set level to 999 so i can see if the game repaints()
level = 999;
Main.getInstance().repaint(); //this doesnt work!!
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
new Thread(task).start();
}

最佳答案

这是您实现单例设计模式的方式的问题。您执行此操作的方式不适用于小程序,其中实例是由小程序容器为您创建的。您可以通过更改 getInstance 来修复它,如下所示:

public Main getInstance() {
return instance;
}

并将此行添加到 init 方法中:

instance = this;
<小时/>

顺便说一句,您不应该重写 Swing 组件中的 paint,而 JApplet 就是这样。您应该重写paintComponent,并在第一行调用super.paintComponent(g)。这应该可以解决问题。

关于java - JApplet repaint() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19483662/

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