2016-03-05 7 views
1

Eh bien mon anglais n'est pas très bon mais je vais essayer d'expliquer.Java repaint méthode ne fonctionne pas, pourquoi?

J'ai été faire deux classes, First Class et Second Class (Deuxième a été nommé "Grafika").

Je veux que mon rectangle se déplace à la position où j'ai été cliqué, mais évidemment il ne bouge pas et je ne comprends pas pourquoi, s'il vous plaît aider.

import java.awt.*; 
    import java.awt.event.MouseEvent; 
    import java.awt.event.MouseListener; 
    import javax.swing.*; 
    public class Grafika extends JPanel implements MouseListener{ 
     static int x=0,y=0; 
     @Override 
    public void paintComponent(Graphics g){ 
     g.setColor(Color.BLACK); 
     g.fillRect(x, y, 20, 30); 
    } 

    public void mouseClicked(MouseEvent arg0) { 
     // TODO Auto-generated method stub`` 
     x=arg0.getX(); 
     y=arg0.getY(); 
     this.repaint(x, y, 20, 30); 
    } 

je vais vous montrer un code complet, il était petit .Ce deuxième était class.And mon (je pense) seul problème est la méthode repeindre(). Pourquoi je ne sais pas: D.

import java.awt.*; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.*; 
public class Grafika extends JPanel implements MouseListener{ 
    static int x=0,y=0; 
    @Override 
public void paintComponent(Graphics g){ 
    g.setColor(Color.BLACK); 
    g.fillRect(x, y, 20, 30); 
} 

public void mouseClicked(MouseEvent arg0) { 
    // TODO Auto-generated method stub 
    x=arg0.getX(); 
    y=arg0.getY(); 
    this.repaint(x, y, 20, 30); 
} 

public void mouseEntered(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 

public void mouseExited(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 

public void mousePressed(MouseEvent arg0) { 
    // TODO Auto-generated method stub 
} 

public void mouseReleased(MouseEvent arg0) { 
    // TODO Auto-generated method stub 

} 

}

Maintenant, je vais vous montrer la première classe d'où j'appelais deuxième classe.

import java.awt.*; 
import javax.swing.*; 
public class Glavna extends Grafika { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
    Grafika g=new Grafika(); 
    JFrame wi=new JFrame("Grafika"); 
    wi.setBounds(50, 50, 500, 600); 
    wi.add(g); 
    wi.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    wi.setVisible(true); 


    } 

} 
+0

Concernant: '" Et mon (je pense) seul problème est la méthode repaint() Pourquoi je ne sais pas "' - n o, comme nous l'avons tous dit, vous n'ajoutez aucun MouseListener à quoi que ce soit. –

+0

Vous avez raison, merci. –

Répondre

4

Vous avez plusieurs problèmes dans ce code:

  • Vous créez une sorte de MouseListener (vous manque encore plusieurs des méthodes de l'interface), mais je ne vois nulle part que vous l'avez ajouté à votre interface graphique. Vous devez avoir quelque part addMouseListener(this); dans votre code pour que l'auditeur fonctionne. Repeindre par lui-même ne déplace pas le rectangle. Changer le X et Y fait, mais encore une fois, non sans ajouter le MouseListener d'abord.
  • Vous souhaitez probablement appeler repaint(); sans paramètres pour peindre l'ensemble du composant. Sinon, l'ancien rectangle pourrait ne pas être effacé.
  • Votre méthode paintComponent doit appeler le super.paintComponent(g); comme premier appel de méthode de votre méthode de remplacement. Sans cela vous n'effacerez pas l'ancien rectangle, et vous casserez la chaîne de peinture qui pourrait avoir des effets secondaires de peinture dans les composants enfants.

Par exemple:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.*; 

public class Grafika extends JPanel { 
    private static final int RECT_W = 20; 
    private static final int RECT_H = 30; 
    private static final int PREF_W = 600; 
    private static final int PREF_H = PREF_W; 
    private static final Color MY_COLOR = Color.RED;  
    private int myX = 0; 
    private int myY = 0; 

    public Grafika() { 
     MyMouse myMouse = new MyMouse(); 
     addMouseListener(myMouse); // add MouseListener 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); // **MUST** call this 
     g.setColor(MY_COLOR); 
     g.fillRect(myX, myY, RECT_W, RECT_H); 
    } 

    private class MyMouse extends MouseAdapter { 
     public void mousePressed(MouseEvent e) { 
      myX = e.getX(); 
      myY = e.getY(); 
      repaint(); // repaint the whole JPanel 
     } 
    } 

    @Override // to make the GUI larger 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private static void createAndShowGui() { 
     Grafika mainPanel = new Grafika(); 

     JFrame frame = new JFrame("Grafika"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { 
      createAndShowGui(); 
     }); 
    } 

} 

Si vous souhaitez obtenir colombophile et commencer à glisser le carré autour de:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class Grafika extends JPanel { 
    private static final int RECT_W = 20; 
    private static final int RECT_H = RECT_W; 
    private static final int PREF_W = 600; 
    private static final int PREF_H = PREF_W; 
    private static final Color MY_COLOR = Color.RED; 
    private int myX = 0; 
    private int myY = 0; 

    public Grafika() { 
     MyMouse myMouse = new MyMouse(); 
     addMouseListener(myMouse); 
     addMouseMotionListener(myMouse); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(MY_COLOR); 
     g.fillRect(myX, myY, RECT_W, RECT_H); 
    } 

    private class MyMouse extends MouseAdapter { 

     public void mousePressed(MouseEvent e) { 
      moveRect(e); 
     } 

     @Override 
     public void mouseDragged(MouseEvent e) { 
      moveRect(e); 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
      moveRect(e); 
     } 

     private void moveRect(MouseEvent e) { 
      myX = e.getX() - RECT_W/2; 
      myY = e.getY() - RECT_H/2; 
      repaint(); 
     } 

    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private static void createAndShowGui() { 
     Grafika mainPanel = new Grafika(); 

     JFrame frame = new JFrame("Grafika"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { 
      createAndShowGui(); 
     }); 
    } 

} 
1

vous devez ajouter écouteur de souris au composant porobably

import java.awt.*; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.*; 
public class Grafika extends JPanel implements MouseListener{ 
    static int x=0,y=0; 

public Grafika(){ 
    super(); 
    addMouseListener(this); // add to constructor 
} 

@Override 
public void paintComponent(Graphics g){ 
    g.setColor(Color.BLACK); 
    g.fillRect(x, y, 20, 30); 
} 

public void mouseClicked(MouseEvent arg0) { 
    // TODO Auto-generated method stub`` 
    x=arg0.getX(); 
    y=arg0.getY(); 
    this.repaint(x, y, 20, 30); 
} 
+0

Je sais que je dois implémenter toute l'interface mouseListener et je l'ai fait,. –

+0

@EnisLicina: si votre code est plus complet, veuillez le montrer. Ne laissez pas de bits importants. –

+0

J'écris le constructeur pour vous, essayez avec –