![](/img/trans.png)
[英]JTable doesn`t update on repaint() via PropertyChangeListener
[英]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.