簡體   English   中英

當JPanel.repaint()不調用paintComponent時如何解決//我什么都沒找到

[英]How to fix when JPanel.repaint() doesn't call paintComponent //nothing I found that work

我將創建一個JPanel Howto,它將按順序渲染6張圖像,然后添加“后退”按鈕以返回標題。

我正在嘗試檢查它是否在類howto中調用paintComponent方法。 而且不是這樣,我的值仍然為0並最終陷入循環

這是我的方法課

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,以構造您的“后退”按鈕並將其添加到面板中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM