2016-03-15 4 views
1

Voici la classe qui dessine le rectangle. Il est supposé utiliser les attributs statiques x, y pour les composants de l'emplacement du rectangle à dessiner, qui sont les composants x et y à partir d'un clic de souris. Les x, y viennent de la classe Gui3 de event.getX() et event.getY(). Le programme et toutes ses méthodes fonctionnent bien, le seul problème survient lorsque la forme est dessinée.Pourquoi le rectangle ne dessine-t-il pas où je clique?

classe pour dessiner la forme

import java.awt.*; 
import javax.swing.*; 

public class DrawShapes extends JPanel { 
    public static int x,y; 
    public void paintComponent(Graphics g){ 
     g.setColor(Color.BLUE); 
     g.fillRect(x,y,80,80); 
    } 
    public class GuiDemo extends Gui3{ 
     public GuiDemo(){ 
      x=x1; 
      y=y1; 
     } 
     } 

} 

classe principale qui fait tout le reste

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class Gui3 extends JFrame { 
    private JPanel mousepanel; 
    private JLabel statusbar; 
    public static int x1=0, y1=0; 
    public Gui3(){ 
     super("The title"); 

     mousepanel = new JPanel(); 
     mousepanel.setBackground(Color.WHITE); 
     add(mousepanel, BorderLayout.CENTER); 

     statusbar = new JLabel("Default"); 
     add(statusbar, BorderLayout.SOUTH); 

     HandlerClass handler = new HandlerClass(); 
     mousepanel.addMouseListener(handler); 
     mousepanel.addMouseMotionListener(handler); 
    } 
    private class HandlerClass implements MouseListener, MouseMotionListener 
     { 
     @Override 
     public void mouseClicked(MouseEvent event) { 
      statusbar.setText(String.format("Clicked at %d, %d", event.getX(),event.getY())); 

C'est là les composantes x et y sont reçus de

x1=event.getX(); 
y1=event.getY(); 

Les composants se passé à la classe DrawShapes. Le rectangle ne tire que dans le coin. Il est censé être dessiner chaque fois que je clique

enter image description here

   DrawShapes shapes = new DrawShapes(); 
       add(shapes); 
      } 
      @Override 
      public void mousePressed(MouseEvent event){ 
       statusbar.setText("You pressed down the mouse"); 
      } 

      @Override 
      public void mouseReleased(MouseEvent event){ 
       statusbar.setText("You released the button"); 
      } 
      @Override 
      public void mouseEntered(MouseEvent event){ 
       statusbar.setText("You entered the area"); 
       mousepanel.setBackground(Color.RED); 
      } 
      @Override 
      public void mouseExited(MouseEvent event){ 
       statusbar.setText("The mouse has left the window"); 
       mousepanel.setBackground(Color.WHITE); 
      } 
      //These are mouse motion events 
      @Override 
      public void mouseDragged(MouseEvent event){ 
       statusbar.setText("You are dragging the mouse"); 
      } 
      @Override 
      public void mouseMoved(MouseEvent event){ 
       statusbar.setText("You are moving the mouse"); 
      } 
     } 
    } 
+0

Veuillez faire en sorte que vos retraits soient lisibles et corrigez votre mise en forme. – djechlin

+1

Je pense que vous manquez une 'repeindre quelque part –

+1

*" Il est censé utiliser les interst x statiques, y "* - Eh bien, il y a un problème pour commencer – MadProgrammer

Répondre

4

La raison pour laquelle vous voyez le rectangle en haut à gauche est dû au fait x et y dans DrawShapes sont attribués qu'une seule fois, lorsque GuiDemo est construit; à ce moment là, x1 et y1 sont tous deux initialisés à 0. Alors que x1 et y1 sont réaffectés lors du clic, cette modification n'est jamais propagée à la classe DrawShapes.

J'ai deux ou trois recommandations:

  • Débarrassez des variables statiques entièrement. Il est plus facile de simplement passer des objets d'un objet à l'autre. DrawShapes devrait avoir un x et un y, mis je les rendre privé (qui a besoin d'autre eux?) Et non statique (au cas où vous avez besoin de plus d'un DrawShapes)
  • Ajouter une méthode -DrawShapes, de sorte que vous avez un moyen de communiquer cette position à l'objet qui dessinera le rectangle:

    public void setPosition(int newX, int newY) { 
        this.x = newX; 
        this.y = newY; 
        repaint(); 
    } 
    

    le repeindre est important ici (Java swing gère beaucoup de dessin travail pour vous, mais vous devez le faire savoir quand un redessiner est nécessaire si vous faites de la peinture personnalisée.)

  • Utilisez ce en cas de clic

    shapes.setPosition(event.getX(), event.getY()); 
    

caveat: Code ci-dessus est non testé, mais je crois que cela va vous mettre sur le chemin droit.

+0

A fonctionné parfaitement! Merci :) Pourriez-vous expliquer comment et quand utiliser la méthode repaint s'il vous plaît? –