2014-12-08 4 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 –

+0

Спасибо, исправление этого первого – MLShax

ответ

0

В Java оператор if влияет только на одно утверждение после заголовка оператора. Поэтому вам нужно поместить все тело в {}.

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

Да, это была ошибка, я исправил ее так спасибо! – MLShax

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

Смежные вопросы