[Java] Punten sleepbaar maken op JPanel

Pagina: 1
Acties:

  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 04-05 13:54
Voor een school project zijn we bezig een plotter voor coördinaten te maken. Dat gaat allemaal goed mits je geen rare dingen als slepen e.d. hoeft te doen (je hoeft enkel en alleen punten op één JPanel te tekenen, binnen de paintComponent methode van dat JPanel dus).

Er is echter ook een onderdeel waar je punten moet verslepen. Aangezien deze punten dus ook coördinaten zijn hebben we een nieuw object (punt) gemaakt die erft van JPanel. Dit object bevat domweg dezelfde variabelen als een JPanel behalve dat er ook een Waypoint ('het coördinaat') object aan hangt. Ook is natuurlijk de paintComponent methode geïmplementeerd die een punt (cirkel) weergeeft op de container (het plotter JPanel).

Nou hadden we dus bedacht om de punten door de 'punt' objecten te laten tekenen en de lijnen tussen de punten door de paintComponent methode van plotter (het moeder tekenobject zeg maar).

Kortweg ziet het er dan zo uit:

plotter.java:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class plotter extends JPanel {
  private Vector punten;
  public plotter() {
    this.setSize(200, 200);
    this.setLocation(0, 0);
    punten = new Vector(10, 10);
  }

  protected void paintComponent(Graphics g) {
    // drawt de lijnen (polyline) tussen de punten...
  }

  public void addPunt(punt p) {
    punten.add(p);
    this.add(p);
  }
}



punt.java:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class punt extends JPanel {
  private Waypoint waypoint;

  public punt(Waypoint waypoint) {
    this.waypoint = waypoint;
    this.setSize(7, 7);
    this.setLocation(waypoint.x, waypoint.y);
    this.addMouseMotionListener(new mouseMotionListener(this));
  }

  protected void paintComponent(Graphics g) {
    g.fillOval(0, 0, 7, 7);
  }

  public class mouseMotionListener extends MouseMotionAdapter {
    private punt p;
    public mouseMotionListener(punt p) {
      this.p = p;
    }
    public void mouseDragged(MouseEvent e) {
      p.setLocation(e.getPoint());
      p.waypoint.x = e.getX();
      p.waypoint.y = e.getY();
    }
  }

}


Het probleem ligt hem in het verplaatsen van punten. Het punt wordt wel verplaatst, echter op een rare manier. Er verschijnt linksboven in het plotter vak ook een punt wat ongeveer op dezelfde manier meebeweegt, en de beweging van het punt klopt helemaal niet (een verplaatsing van bijvoorbeeld x + 100 gebeurt maar voor de helft/kwart. Ligt dit nou aan het feit dat ik voor ieder punt een aparte MouseMotionListener heb? Of komt het doordat ik de setLocation van het 'punt' object binnen 'punt' aanroep, moet dit echt van 'buitenaf' gebeuren?

Het speelt nu al bijna een dag op en ik kom er maar niet uit. Help :).

[ Voor 9% gewijzigd door zeroxcool op 27-05-2005 22:11 . Reden: kleine toevoeging ]

zeroxcool.net - curity.eu


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Ik gebruik voor een progje van mij ook zo'n constructie alleen heb ik daar de functie getLocation ook ge-override zodat ie altijd de interne coordinaten gebruikt. Bij een mouseDragged doe ik het volgende:
Java:
1
2
3
4
5
6
public void mouseDragged(MouseEvent e) {
      this.x = this.x + (float)e.getX() - 3;
      this.y = this.y + (float)e.getY() - 3;

      this.setLocation((int)this.x,(int)this.y);
}

En dit werkt goed.
edit
Ik gebruik trouwens AWT ipv Swing, ik weet niet of het uitmaakt maar ik denk ik zet het er even bij.

[ Voor 13% gewijzigd door MTWZZ op 28-05-2005 10:28 . Reden: Toevoeging ]

Nu met Land Rover Series 3 en Defender 90


  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 04-05 13:54
Beetje late reactie... De oplossing die je me gaf had ik in principe ook. Ik ging echter niet uit van me 'eigen' x en y waarden, maar van de mouse X en Y waarden, dat was dus de fout. Daar zit je dan verdomme weer twee uur op te staren bij wijze van spreke.

Hartelijk dank in ieder geval!

zeroxcool.net - curity.eu