簡體   English   中英

Java重繪不會更新

[英]Java repaint doesn't update

我在編碼時遇到問題,當我在任何地方調用repaint時,它不會更新圖像,但程序仍保持運行:

import java.applet.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.ImageObserver;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class mainMenu extends JPanel implements MouseListener{
    Graphics g;
    Image playButton = Toolkit.getDefaultToolkit().getImage("game sprites/play_button.png");
    private int part = 0;

    public static void main(String[] a) {
        mainMenu mm = new mainMenu();

        mm.makeJFrame();
    }
    public void makeJFrame(){
        JFrame f = new JFrame();
        f.setSize(1000, 600);
        f.add(new mainMenu());
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
        f.addMouseListener(this);
        f.setTitle("MAIN MENU");
    }

   public void paintComponent(Graphics g) {
       if(part == 0)
           System.out.println("0");
           g.drawImage( playButton, 330, 200, 294, 102, this);
       if(part == 1)
       {
           System.out.println("1");
           g.setColor(Color.RED);
           g.fillRect(0, 0, 40, 40);
       }
   }

    public void mouseClicked(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    public void mousePressed(MouseEvent e) {
        int x = e.getX();
        int y = e.getY();

        if(part == 0)
        {
            if(x > 330 && x < 624 && y > 232 && y < 334)
            {
                System.out.println("a");
                part = 1;
                repaint();
            }
        }
    }
    public void mouseReleased(MouseEvent e) {}
}

我測試了很多次,問題出在重繪上,程序可以正常工作,但是在不需要的時候圖像保持不變。 它會打印出:0 0 0 a(當我單擊按鈕時),即使我單擊按鈕也不會再次打印出“ a”,這是不應該的,因為part設置為1。

圖像加載了嗎? 這看起來很可疑: Image playButton = Toolkit.getDefaultToolkit().getImage("game sprites/play_button.png"); 圖像存儲在哪里?

這看起來可疑...

if (part == 0)
    System.out.println("0");
    g.drawImage(playButton, 330, 200, 294, 102, this);

而且可能是...

if (part == 0) {
    System.out.println("0");
    g.drawImage(playButton, 330, 200, 294, 102, this);
}

您已經中斷了繪畫鏈,必須super.paintComponent任何自定義繪畫之前調用super.paintComponent

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

最后,您有兩個mainMenu實例...

第一個是屏幕上顯示的那個...

f.add(new MainMenu());

第二個是響應鼠標事件並更新part狀態的控件

f.addMouseListener(this);

與第一個無關。

您應該避免在組件(如JPanel )內創建窗口,而應創建MainMenu實例並將其添加到JFrame實例,例如...

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class MainMenu extends JPanel implements MouseListener {

    Image playButton = Toolkit.getDefaultToolkit().getImage("...");
    private int part = 0;

    public static void main(String[] a) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new MainMenu());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public MainMenu() {
        addMouseListener(this);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(800, 600);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        System.out.println(part);
        if (part == 0) {
            System.out.println("0");
            g.drawImage(playButton, 0, 0, this);
        } else if (part == 1) {
            System.out.println("1");
            g.setColor(Color.RED);
            g.fillRect(0, 0, 40, 40);
        }
    }

    public void mouseClicked(MouseEvent e) {
    }

    public void mouseEntered(MouseEvent e) {
    }

    public void mouseExited(MouseEvent e) {
    }

    public void mousePressed(MouseEvent e) {
        int x = e.getX();
        int y = e.getY();

        if (part == 0) {
            System.out.println("a");
            part = 1;
            repaint();
        }
    }

    public void mouseReleased(MouseEvent e) {
    }
}

在Java中,if語句僅影響語句開頭之后的一個語句。 因此,您需要將整個正文放在{}中。

 if(part == 0){
       System.out.println("0");
       g.drawImage( playButton, 330, 200, 294, 102, this);
 }

暫無
暫無

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

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