2017-05-27 3 views
0

Je m'entraîne à tirer une balle dans le tableau et à montrer les coordonnées de la balle lorsque la balle est tirée.Dessinez une balle dans un tableau et déplacez la balle en utilisant mouseDragged

C'est la première fois de pratiquer un exercice de dessin (?)

Ceci est mon code.

import java.awt.*; 
import java.awt.event.*; 

public class MovingBall extends Frame { 
Panel ballPanel = new Panel(); 
Label ballLabel = new Label(); 
Panel coordinatePanel = new Panel(); 
Label coordinateLabel = new Label(); 
int x0=0,y0 =0, x=20,y=30; 
int nowX, nowY; 
Label nowXcoordinateLabel = new Label("Now X :"+nowX); 
Label nowYcoordinateLabel = new Label("Now Y :"+nowY); 
MovingBall(){ 
    setLayout(new GridLayout(1,1)); 
    ballPanel.add(ballLabel); coordinatePanel.add(coordinateLabel); 

    add(ballPanel); 
    add(coordinatePanel); 
    ballPanel.setBackground(Color.white); 

    coordinatePanel.setBackground(Color.LIGHT_GRAY); 
    nowXcoordinateLabel.setBackground(Color.WHITE); 
    nowYcoordinateLabel.setBackground(Color.WHITE); 
    coordinatePanel.add(nowXcoordinateLabel); 
    coordinatePanel.add(nowYcoordinateLabel); 
    setVisible(true); 
    setSize(400,400); 

    MouseMotionListener ml = new MouseMotionAdapter(){ 
    public void mouseDragged(MouseEvent e){ 
     Point p = new Point(); 
     nowX = (int) p.getX(); 
     nowY = (int) p.getY(); 
    } 
}; 
    addWindowListener(new WindowAdapter() { 
    public void windowClosing(WindowEvent we) { 
     dispose(); 
    } 
    } 
    ); 
    } 
    public void paintComponent(Graphics2D gg){ 
    // super.paintComponents(gg); 
    ballPanel.paintComponents(gg); 
    gg.setColor(Color.BLUE); 
    gg.fillOval(x0, y0, 10, 10); 

} 



public static void main(String[]arg){ 
    MovingBall mb = new MovingBall(); 
} 
} 

J'ai deux problèmes

  1. je fillOval et paintComponent pour dessiner et afficher une balle, mais je ne vois pas à l'écran. Pourquoi?
  2. Une idée de comment déplacer la balle si je veux déplacer cela en utilisant mouseDragged? Ai-je besoin de fil?
+0

vous a tagué cela comme une question Swing donc vous devriez utiliser des composants Swing, pas de composants AWT. Les composants Swing commencent par un «J» (JButton, JPanel ...); Lisez la section du tutoriel Swing sur [Custom Painting]() pour les bases de la peinture. Le code de travail montre comment changer l'emplacement d'un carré sur un événement de souris. Modifiez le code que vous manipulez mouseDragged. – camickr

+1

AWT 'Frame' n'a pas de méthode' paintComponent', ajouter '@ Override' à la méthode, cela créera une erreur de compilation. Ceci aussi, pas comment vous devriez faire la peinture faite sur commande, le «ballPanel» devrait faire le painitng, pas le cadre. Les gens ont cessé d'utiliser AWT il y a plus de 10 ans, vous obtiendriez une meilleure réponse en utilisant Swing ou Java FX – MadProgrammer

+0

Je sais que mouseDragged est faux, mais je l'ai fait juste pour vérifier si mon Label fonctionne ou pas. – ProgramLover

Répondre

0

Pour obtenir la position de la souris au lieu de:

nowX = (int) p.getX(); 

écrire ceci:

nowX = (int) e.getX(); 

Vous devez également redessiner l'ovale à chaque fois que l'utilisateur déclenche un événement de glisser la souris

+0

Oui, je sais que je viens de faire cela pour vérifier si mon Label fonctionne, mais j'ai essayé votre suggestion (0, 0, -10, -10) mais cela ne fonctionne pas – ProgramLover

+0

'(0,0, -10, -10)' - 'Graphics' ne supporte pas la largeur/hauteur négative, positionnant l'objet à' 0x0' lors de l'utilisation du 'Frame' comme le canevas placerait l'objet sous les bordures du cadre, mais dans l'ensemble, ce n'est pas le problème initial – MadProgrammer

+0

@ProgramLover Essayez d'ajouter une couleur avant de remplir avec gg.setColor (Color.orange); –

1

Commençons par

  • Frame n'a pas de méthode paintComponent, donc rien ne va jamais l'appeler.
  • Même si elle a fait, la position 0x0 peignait le cercle sous les frontières du cadre, de sorte que vous ne le voir
  • Vous devriez obtenir le Point du MouseEvent, pas du nouvel objet Point que vous avez créé
  • Il n'est pas la responsabilité du cadre pour gérer la souris traînée ou la peinture, le cadre est responsable de fournir le récipient initial sur lequel tout le reste ajouté à partir que,

vous devez déplacer la fonctionnalité de la peinture et de la souris traîné la gestion de son propre cla ss. Cela vous fournit deux choses, d'abord, une surface sur laquelle vous pouvez peindre, et qui sera contenue dans les limites du cadre et les événements de souris seront automatiquement convertis au contexte des panneaux (0x0 sera le coin supérieur gauche du panneau)

Cela soulève la question sur la façon de mettre à jour les étiquettes. Eh bien, vous pouvez prendre une feuille de l'API AWT et utiliser un modèle d'observation simple pour générer des événements lorsque les coordonnées sont modifiées, par exemple

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.FlowLayout; 
import java.awt.Frame; 
import java.awt.Graphics; 
import java.awt.Label; 
import java.awt.Panel; 
import java.awt.Point; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 
import java.awt.event.MouseMotionListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.util.ArrayList; 
import java.util.EventObject; 
import java.util.List; 

public class MovingBall extends Frame { 

    BallPane ballPanel = new BallPane(); 
    Label ballLabel = new Label(); 
    int x0 = 0, y0 = 0, x = 20, y = 30; 
    int nowX, nowY; 
    Label nowXcoordinateLabel = new Label("Now X :" + nowX); 
    Label nowYcoordinateLabel = new Label("Now Y :" + nowY); 

    MovingBall() { 
     setLayout(new BorderLayout()); 
     ballPanel.add(ballLabel); 

     add(ballPanel); 
     ballPanel.setBackground(Color.white); 

     nowXcoordinateLabel.setBackground(Color.WHITE); 
     nowYcoordinateLabel.setBackground(Color.WHITE); 
     setVisible(true); 
     setSize(400, 400); 
     addWindowListener(new WindowAdapter() { 
      @Override 
      public void windowClosed(WindowEvent e) { 
       dispose(); 
      } 
     }); 

     Panel coordinates = new Panel(new FlowLayout()); 
     coordinates.add(nowXcoordinateLabel); 
     coordinates.add(nowYcoordinateLabel); 
     coordinates.setBackground(Color.LIGHT_GRAY); 
     add(coordinates, BorderLayout.SOUTH); 

     ballPanel.addCoordinateListene(new CoordinateListener() { 
      @Override 
      public void coordinatesChanged(CoordinateEvent evt) { 
       nowXcoordinateLabel.setText("Now X: " + evt.getCoordinate().getX()); 
       nowYcoordinateLabel.setText("Now X: " + evt.getCoordinate().getY()); 
       revalidate(); 
       repaint(); 
      } 
     }); 

    } 

    public static void main(String[] arg) { 
     MovingBall mb = new MovingBall(); 
    } 

    public class CoordinateEvent extends EventObject { 
     private final Point p; 

     public CoordinateEvent(Object source, Point p) { 
      super(source); 
      this.p = p; 
     } 

     public Point getCoordinate() { 
      return p; 
     } 
    } 

    public interface CoordinateListener { 
     public void coordinatesChanged(CoordinateEvent evt); 
    } 

    public class BallPane extends Panel { 

     int x0 = 0, y0 = 0, x = 20, y = 30; 
     private List<CoordinateListener> coordinateListeners; 

     public BallPane() { 
      MouseMotionListener ml = new MouseMotionAdapter() { 
       public void mouseDragged(MouseEvent e) { 
        x0 = (int) e.getX(); 
        y0 = (int) e.getY(); 
        fireCoordinateChange(new Point(e.getPoint())); 
        repaint(); 
       } 
      }; 
      addMouseMotionListener(ml); 
      coordinateListeners = new ArrayList<>(5); 
     } 

     @Override 
     public void paint(Graphics g) { 
      super.paint(g); 
      g.setColor(Color.BLUE); 
      g.fillOval(x0, y0, 10, 10); 
     } 

     public void addCoordinateListene(CoordinateListener listener) { 
      coordinateListeners.add(listener); 
     } 

     public void removeCoordinateListene(CoordinateListener listener) { 
      coordinateListeners.remove(listener); 
     } 

     protected void fireCoordinateChange(Point p) { 
      CoordinateEvent evt = new CoordinateEvent(this, p); 
      for (CoordinateListener listener : coordinateListeners) { 
       listener.coordinatesChanged(evt); 
      } 
     } 

    } 
} 
1

Faites votre classe étendue Panel et le rendre prêt à tirer avec dépassement méthode paint et ajoutez le MouseMotionListener à la liste de votre panel.Get X et Y coordonnées pour l'utilisation de la méthode paint, enfin ajouter votre panneau de dessin à Frame.

Code simple: MISE À JOUR

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Frame; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridLayout; 
import java.awt.Label; 
import java.awt.Panel; 
import java.awt.RenderingHints; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

public class TestClass extends Panel { 


     /** 
     * 
     */ 
     private static final long serialVersionUID = 1L; 

     Panel ballPanel = new Panel(); 
     Label ballLabel = new Label(); 
     Panel coordinatePanel = new Panel(); 
     Label coordinateLabel = new Label(); 
     int nowX, nowY; 
     Label nowXcoordinateLabel = new Label("Now X :"); 
     Label nowYcoordinateLabel = new Label("Now Y :"); 

     TestClass() { 

      coordinatePanel.add(coordinateLabel); 
      nowXcoordinateLabel.setBackground(Color.WHITE); 
      nowYcoordinateLabel.setBackground(Color.WHITE); 
      nowXcoordinateLabel.setPreferredSize(new Dimension(100, 25)); 
      nowYcoordinateLabel.setPreferredSize(new Dimension(100, 25)); 
      coordinatePanel.setPreferredSize(new Dimension(400, 30)); 
      coordinatePanel.setBackground(Color.LIGHT_GRAY); 
      coordinatePanel.add(nowXcoordinateLabel); 
      coordinatePanel.add(nowYcoordinateLabel); 

      MouseAdapter ml = new MouseAdapter() { 

       @Override 
       public void mouseMoved(MouseEvent e) { 
        nowXcoordinateLabel.setText("Now X :" + e.getX()); 
        nowYcoordinateLabel.setText("Now Y :" + e.getY()); 
        nowX = e.getX(); 
        nowY = e.getY(); 
        repaint(); 
        super.mouseMoved(e); 
       } 

      }; 


      setLayout(new GridLayout(1, 1)); 
      setBackground(Color.WHITE); 
      addMouseMotionListener(ml); 
      setVisible(true); 
      setSize(400, 400); 
     } 


     @Override 
     public void paint(Graphics g) { 
      Graphics2D gg = (Graphics2D) g; 
      gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      gg.setColor(Color.BLUE); 
      gg.fillOval(nowX, nowY, 20, 20); 

     } 

     public static void main(String[] arg) { 
      TestClass mb = new TestClass(); 
      Frame frame = new Frame("Test drawing"); 
      frame.addWindowListener(new WindowAdapter() { 


       @Override 
       public void windowClosing(WindowEvent e) { 
        frame.dispose(); 
        super.windowClosing(e); 
       } 


      }); 
      frame.setLayout(new GridLayout(1, 1)); 
      frame.add(mb); 
      frame.add(mb.coordinatePanel); 
      frame.setSize(800, 600); 
      frame.setVisible(true); 
     } 


} 
+0

Alors que je recommanderais certainement Swing over AWT l'OP a déclaré au moins à deux reprises que «je dois apprendre awt parce que j'aurai java test la semaine prochaine» * - vous briser également la chaîne de peinture , ce qui pourrait générer des artefacts de peinture indésirables – MadProgrammer

+0

@MadProgrammer OK, je vais mettre à jour mon exemple. –