2014-12-08 80 views
1

我遇到一个问题,当我的编码,当我打电话重绘的任何地方,它不更新的图像,但该程序仍继续运行:的Java重绘不更新

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) {} 
} 

我测试过很多次,并且问题在于重绘,该程序起作用,但图像在不应该时保持不变。它打印出来: a(当我点击按钮时) 并且不会再次打印出“a”,即使我点击了按钮,它不应该将该部分设置为1

+0

缺少{}周围的人的身体你的if语句在paintComponent – 2014-12-08 02:05:07

+0

谢谢,修复这第一个 – MLShax 2014-12-08 03:43:34

回答

0

在Java中,if语句仅影响语句头后的一个语句。所以你需要把整个身体放在{}中。

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

是的,这是一个错误,我修好了,谢谢! – MLShax 2014-12-09 02:02:56

2

图像加载吗?这看起来很可疑: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你做任何定制之前绘画...

@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) { 
    } 
} 
+0

谢谢!当我把addMouseListener放入默认的构造函数时,它就起作用了。 – MLShax 2014-12-09 02:02:31