gpt4 book ai didi

java - 当 JPanel.repaint() 不调用 PaintComponent 时如何修复//我发现没有任何工作

转载 作者:行者123 更新时间:2023-12-01 10:43:59 27 4
gpt4 key购买 nike

我将创建一个 JPanel Howto,它按顺序渲染 6 个图像,然后添加后退按钮以返回到标题。

我正在尝试检查它是否调用类howto 中的paintComponent 方法。但事实并非如此,所以 i 的值仍然是 0 并且最终陷入循环

这是我的 Howto 类(class)

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;

import javax.swing.JButton;
import javax.swing.JPanel;

import Audio.HitSound;
import Graphic.DrawingUtility;

public class Howto extends JPanel implements Runnable{
private JButton back;
private static int i;
public Howto(){
this.setPreferredSize(new Dimension(800, 600));
this.setLayout(null);
repaint();
HitSound h = new HitSound();
i=0;
this.setVisible(true);
}

public void run() {
// TODO Auto-generated method stub
try {
while(i<6)
{
GameManager.frame.repaint();
Thread.sleep(10);
System.out.println("i: " + i);
}
} catch (Exception e) {
// TODO: handle exception
Thread.interrupted();
}
}
public void paintComponent(Graphics g){
if(GameManager.thread.isAlive()){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(DrawingUtility.getHowto(i), 0, 0, 800, 600,null);
i++;
}
}
}

这就是我的 GameManager 类中的内容

public static void startThread() {
thread = new Thread(howto);
thread.start();
}

public static void runHowto() {
howto = new Howto();
howto.setVisible(true);
frame.switchScene(howto);
howto.repaint();
startThread();
while (thread.isAlive()) {
//frame.repaint();
}
if (!thread.isAlive()) {
JButton back = new JButton();
back.setBorderPainted(false);
back.setContentAreaFilled(false);
back.setFocusPainted(false);
back.setOpaque(false);
back.setBounds(640, 446, 132, 132);
back.addMouseListener(new MouseListener() {

@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
HitSound h = new HitSound();
h.play(3);
}

@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
GameManager.goToTitle();
}
});
}

但是当我调用 runHowto(); 时它仍然在循环并且 i == 0 并且不增加 i所以我认为paintComponent和repaint方法可能有问题

所以请帮我解决这个问题,提前致谢:)

最佳答案

while (thread.isAlive()) 循环会阻塞 AWT 事件调度线程 (EDT)。

您需要从 runHowto 返回到事件调度循环。让您的 Howto 任务使用 java.awt.EventQueue.invokeLater 发回 EDT,以构造您的后退按钮,并可能将其添加到面板中。

关于java - 当 JPanel.repaint() 不调用 PaintComponent 时如何修复//我发现没有任何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34301273/

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