[JAVA]Object met muis verslepen

Pagina: 1
Acties:

  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02-2025

TheNameless

Jazzballet is vet!

Topicstarter
Ik heb een kleine klasse gemaakt die ik graag zou willen verslepen met de muis. Ik heb dit geprobeerd op de volgende manier, maar het werkt niet :'(
code:
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package lentetuin;

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

public class Stand implements MouseMotionListener
{
  int breedt;
  int diep;
  int x,y;
  String naam;
  String opmerking;
  boolean links_open;
  boolean rechts_open;

  Canvas canvas;
  Graphics g;

  public Stand(String naam, int breedt, int diep, String opmerking)
  {
    this.naam = naam;
    this.breedt = breedt;
    this.diep = diep;
    this.opmerking = opmerking;
    x=100;y=100;
  }
  public Stand(){}
  public void mouseDragged( MouseEvent e )
  {
    x = e.getX();
    y = e.getY();
    System.out.println("yup");
    draw();
  }
  public void mouseMoved( MouseEvent e ){}
public void tekenIn(Canvas c)
  {
    canvas = c;
    g = canvas.getGraphics();
  }
  public void draw()
  {
    g.drawRect(x,y,(breedt*20),(diep*20));
    g.drawString(naam,(x+breedt/2*20),(y+diep/2*20));
    System.out.println(opmerking);
    if(opmerking.equals("Links open"))
    {
      g.setColor(Color.red);
      g.drawLine(x,y,x,y+(diep*20));
    }
    if(opmerking.equals("Rechts open"))
    {
      g.setColor(Color.red);
      g.drawLine(x+(breedt*20),y,x+(breedt*20),y+(diep*20));
    }
    if(opmerking.equals("2 open zijden"))
    {
      g.setColor(Color.red);
      g.drawLine(x,y,x,y+(diep*20));
      g.drawLine(x+(breedt*20),y,x+(breedt*20),y+(diep*20));
    }
  }

Ducati: making mechanics out of riders since 1946


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Hmzzz... ik vind dit maar een zeer vreemd object. Het lijkt me een stuk handiger om van een Component ofzo te gaan extenden en daar de bijbehorende paint methodes gaat overriden.

En heb je verder dit object wel geregistereerd als luisteraar?

En ik zou een class ook nooit zo snel een hulp interface laten implementeren maar hiervoor zou ik een interne class gebruiken.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
MayaFreak: Ik heb een kleine klasse gemaakt die ik graag zou willen verslepen met de muis.
Je denkwijze is compleet verkeerd: je versleept in ieder geval nooit een klasse. Hooguit versleep je een instantie van een klasse als dit een GUI component is.

Ik zou eens op zoek gaan naar wat documentatie over bewegende objecten en animaties in AWT, want je code is verre van netjes en duidelijk. Sowieso versleep je dus altijd een GUI component.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02-2025

TheNameless

Jazzballet is vet!

Topicstarter
Ik zal het ff wat beter uitleggen. Dit moet gaan werken om een indeling te maken van een grote tent. In die tent staan verschillende "hokjes" waar bedrijven zich kunnen promoten.
Deze klasse is zo'n hokje. Er moeten er ongeveer honderd individueel kunnen worden versleept. Verder wordt zo'n hokje getekend op een cavas.

Ducati: making mechanics out of riders since 1946


  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

MayaFreak schreef op 15 september 2002 @ 12:34:
Deze klasse is zo'n hokje. Er moeten er ongeveer honderd individueel kunnen worden versleept. Verder wordt zo'n hokje getekend op een cavas.
Een canvas? Je bedoelt een surface neem ik aan?

Als je jezelf een grote hoeveelheid werk wilt besparen moet je eens gaan kijken naar de awt components, zoals ook mijn voorgangers al meldden.

Je krijgt dan:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Stand extends Component implements MouseMotionListener {

  public Stand ( ... ) 
  {
    ...;
    parent.addMouseMotionListener(this);
    ...;
  }

  ...

  public void mouseDragged( MouseEvent e )
  {
    x = e.getX();
    y = e.getY();
    System.out.println("yup");
    draw();
  }

  ...
}



edit:

Ik heb nog even voor je gegoogled:
http://java.sun.com/docs/.../mousemotionlistener.html

[ Voor 0% gewijzigd door kvdveer op 15-09-2002 13:33 . Reden: gegoogled ]

Localhost, sweet localhost


  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02-2025

TheNameless

Jazzballet is vet!

Topicstarter
kvdveer schreef op 15 September 2002 @ 13:30:
[...]


Een canvas? Je bedoelt een surface neem ik aan?

Als je jezelf een grote hoeveelheid werk wilt besparen moet je eens gaan kijken naar de awt components, zoals ook mijn voorgangers al meldden.

Je krijgt dan:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Stand extends Component implements MouseMotionListener {

  public Stand ( ... ) 
  {
    ...;
    parent.addMouseMotionListener(this);
    ...;
  }

  ...

  public void mouseDragged( MouseEvent e )
  {
    x = e.getX();
    y = e.getY();
    System.out.println("yup");
    draw();
  }

  ...
}



edit:

Ik heb nog even voor je gegoogled:
http://java.sun.com/docs/.../mousemotionlistener.html
Oke bedankt, maar dan werkt hij nog niet. :)

Ducati: making mechanics out of riders since 1946


  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02-2025

TheNameless

Jazzballet is vet!

Topicstarter
Niemand een id?

Ducati: making mechanics out of riders since 1946


  • momania
  • Registratie: Mei 2000
  • Laatst online: 22:44

momania

iPhone 30! Bam!

heb je al eens aan de drag&drop package gedacht?
google search

Neem je whisky mee, is het te weinig... *zucht*


  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02-2025

TheNameless

Jazzballet is vet!

Topicstarter
k ik zal der is naar kijken. Ik wist niet dat er zoiets was :)

Ducati: making mechanics out of riders since 1946


  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02-2025

TheNameless

Jazzballet is vet!

Topicstarter
Ik zal het nog wat beter uitleggen. Dit is mijn aangepaste klasse.
In de package zit voor de rest nog een frame klasse en een canvas klasse.
Op die frame klasse zit een list met daarop de verschillende "stand klasse" en een instantie van de Canvas.
Als er op zo'n naam geklikt wordt, maakt het frame een nieuw Stand object aan. Roept vervolgens tekenIn(Canvas c) aan om te zeggen dat het Stand object op zijn Canvas moet getekend worden.
Daarna wordt draw() aangeroepen.

Nu heb ik het volgende probleem:

Het Stand object wordt wel getekend (zelfs meerdere als je er meerdere aanklikt) maar ze kunnen niet versleept worden. Hoe komt dit en wat kan ik eraan doen?


code:
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package lentetuin;

import java.awt.Graphics;
import java.awt.event.*;
import java.awt.*;
import java.awt.dnd.*;

public class Stand extends Component
{
  int breedt;
  int diep;
  int x,y;
  String naam;
  String opmerking;
  boolean links_open;
  boolean rechts_open;

  Canvas canvas;
  Graphics g;

  public Stand(String naam, int breedt, int diep, String opmerking)
  {
    this.naam = naam;
    this.breedt = breedt;
    this.diep = diep;
    this.opmerking = opmerking;
    x=100;y=100;
    addMouseMotionListener(new MouseMotionListener()
    {
      public void mouseDragged(MouseEvent e)
      {
        x=e.getX();
        y=e.getY();
        draw();
      }
      public void mouseMoved(MouseEvent e){}
    });
  }
  public Stand()
  {
  }
  public void tekenIn(Canvas c)
  {
    canvas = c;
    g = canvas.getGraphics();
  }
  public void draw()
  {
    g.drawRect(x,y,(breedt*20),(diep*20));
    g.drawString(naam,(x+breedt/2*20),(y+diep/2*20));
    System.out.println(opmerking);
    if(opmerking.equals("Links open"))
    {
      g.setColor(Color.red);
      g.drawLine(x,y,x,y+(diep*20));
    }
    if(opmerking.equals("Rechts open"))
    {
      g.setColor(Color.red);
      g.drawLine(x+(breedt*20),y,x+(breedt*20),y+(diep*20));
    }
    if(opmerking.equals("2 open zijden"))
    {
      g.setColor(Color.red);
      g.drawLine(x,y,x,y+(diep*20));
      g.drawLine(x+(breedt*20),y,x+(breedt*20),y+(diep*20));
    }
  }
  public boolean getOpmerking()
  {
    if(opmerking.equals("links_open"))
    {
      links_open = true;
      return links_open;
    }
    if(opmerking.equals("Rechts_open"))
    {
      rechts_open = true;
      return rechts_open;
    }
    else
    {
      return false;
    }
  }
  public void clear()
  {
    g.clearRect(x,y,(breedt*20),(diep*20));
  }
}

Ducati: making mechanics out of riders since 1946


Verwijderd

Ik neem aan dat stand objecten op de canvas geselecteerd moeten kunnen worden en als ze geselecteerd zijn, dan moeten ze verplaatst kunnen worden.

Dit kun je als volgt oplossen :

1: Voor moven: registreer een MouseMotionListener op de canvas met de volgende code:
code:
1
2
3
4
5
6
7
8
canvas.addMouseMotionListener(new java.awt.event.MouseMotionAdapter()
{

      public void mouseMoved(MouseEvent e)
      {
        canvas_mouseMoved(e);
      }
});


In de canvas_mouseMoved(MouseEvent e) methode haal je de x en y coordinaten van de muis pointer en teken je het standobject dat gemoved moet worden op die coordinaten. Dit kan echter wel scherm flikkeringen opleveren.
Beter zou zijn om het via drag & drop te doen. Of om bij te houden wanneer de muisknop ingedrukt wordt, daarna versleept (kun je eventueel een andere muis icoon zetten) en wanneer de muisknop losgelaten wordt moet je op de nieuwe coordinaten het stand object tekenen.

2: Voor selecteren : In de classe waar de canvas voorkomt moet je een MouseListener registreren, dit doe je met de volgende code
code:
1
2
3
4
5
6
7
8
canvas.addMouseListener(new java.awt.event.MouseAdapter()
{

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


In de canvas_mousePressed(MouseEvent e) methode haal je uit de MouseEvent de x en y coordinaat en doorloop je de lijst om te kijken welke standobject in de x en y coordinaat valt. Je houdt een lijst of een object bij om te onthouden welk(e) stand(s) geselecteerd zijn.

  • TheNameless
  • Registratie: September 2001
  • Laatst online: 07-02-2025

TheNameless

Jazzballet is vet!

Topicstarter
Oke zal er naar kijken.
ff een ideetje om het anders te doen:

ik maak van de canvas een panel en de Stand klasse laat ik een Component extenden.
Dan zou je het toch makkelijker kunnen doen?

Ducati: making mechanics out of riders since 1946

Pagina: 1