[Java] sleep selectie en losse selectie Applet

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09
Ik heb een Jpanel waarop een boom getekend word. Nu wil ik echter kunnen slepen met de muis en dan bijvoorbeeld 6 figuren selecteren en dan rechtermuisknop en een handeling doen. Nu kan ik wel rechtermuisknop doen op 1 figuur en dan krijg ik een dropdown menu maar wil dit met meerdere kunnen.

Ook wil ik dat het mogelijk is bijvoorbeeld 2 losse figuren te selecteren. En daar een actie tussen doen.

Het moet werken met java 1.3 omdat het applet ge-embed zit in een applicatie die alleen maar 1.3.1 (max) gebruikt.

Het moet dus duidelijk zijn welke figuren geselecteerd zijn.

Ik weet eerlijk gezegd niet hoe je zoiets zou moeten noemen dus vandaar dat ik niet veel gevonden heb.

De juiste termen zouden mijn op zich al goed op weg helpen dan kan ik daar op verder zoeken.

[ Voor 5% gewijzigd door Bl4ckviper op 21-07-2009 16:41 ]

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Je hebt een applet? Heb je ook de source-code van de applet? Lees eens Het algemeen beleid #quickstart door en hopelijk zie je dat er toch nog wat ontbreekt in je startpost. Onthou: PRG is een subforum bedoeld voor zelf programmeren :)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09
Er is geen code nodig ;) Het komt neer op het volgende:

Wat er getekend wordt zijn iconen (en segmenten van iconen) (wat verschillende dingen kunnen zijn zoals een rondje (icoon) met een streep (segment) bijvoorbeeld) Deze iconen extenden van JPanel zodat ze te tekenen zijn.

Zo wordt er dus een stapel van die iconen op een JPanel getekend. (Het plaatje) Dit Jpanel draait in een andere applicatie (Oracle forms, volgens mij in een Applet/ Speciale area).

Hier tussen worden lijnen getrokken zodat er een boom ontstaat.

Alles zit een in Graphics2D plaatje.

Nu wil ik dus Jpanels op het scherm kunnen selecteren (1 of meerdere) door middel van slepen (met een kader) of ctrl + selecteren.

Ik vermoed dat ik iets met de MouseMotionListener moet doen alleen weet ik dus de juiste termen niet voor de functionaliteit die ik beschrijf zodat ik wat background info kan vinden.

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

  • bredend
  • Registratie: September 2001
  • Laatst online: 18-09 21:45
Dan moet je kijken welke JPanels vallen binnen het vak van de mouse X en Y bij de mouseDown en mouse X Y bij mouseUp.

Misschien heb je hier iets aan: http://stackoverflow.com/questions/799675?sort=newest

[ Voor 27% gewijzigd door bredend op 21-07-2009 21:45 ]


Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09
Ik heb even een simpel ding gemaakt en poging gedaan.

Kom er niet uit. Hij tekent de rectangle niet als er al andere figuren staan.

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
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
public class MyPanel extends JPanel {

    Rectangle2D.Double selectionRect;
    Point mouseDown, mouseHere;
    Image offscreen = null;
    Dimension offscreensize = null;
    Graphics offgraphics = null;

    public MyPanel() {
      
        MouseThings mouseThings = new MouseThings();
        this.addMouseListener(mouseThings);
        this.addMouseMotionListener(mouseThings);
    }

    @Override
    public synchronized void paint(Graphics g) {
        maakPlaatje();
        g.drawImage(offscreen, 0, 0, null);
    }

    public void maakPlaatje(){
        Dimension d = new Dimension(500, 400);
        offscreen = createImage(d.width, d.height);
            offscreensize = d;
            if (offgraphics != null) {
                offgraphics.dispose();
            }
        offgraphics = offscreen.getGraphics();

        Graphics2D g2d = (Graphics2D) offgraphics;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, // Anti-alias!
                RenderingHints.VALUE_ANTIALIAS_ON);

        g2d.setColor(Color.red);
        g2d.drawRect(10, 20, 100, 15);
        g2d.setColor(Color.pink);
        g2d.fillRect(240, 160, 40, 110);

        g2d.setColor(Color.blue);
        g2d.drawOval(50, 225, 100, 50);
        g2d.setColor(Color.orange);
        g2d.fillOval(225, 37, 50, 25);

        g2d.setColor(Color.yellow);
        g2d.drawArc(10, 110, 80, 80, 90, 180);
        g2d.setColor(Color.cyan);
        g2d.fillArc(140, 40, 120, 120, 90, 45);

        g2d.setColor(Color.magenta);
        g2d.fillArc(150, 150, 100, 100, 90, 90);
        g2d.setColor(Color.black);
        g2d.fillArc(160, 160, 80, 80, 90, 90);

        g2d.setColor(Color.green);
        g2d.drawString("Groovy!", 50, 150);
    }

    void drawRect(){
        Graphics2D g2d = (Graphics2D) offgraphics;
        AlphaComposite ta = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.1f);
        g2d.setComposite(ta);
        g2d.setColor(Color.BLUE);
        g2d.fill(selectionRect);
        g2d.setComposite(AlphaComposite.SrcOver);
        g2d.setColor(Color.BLACK);
        g2d.draw(selectionRect);
    }

    private class MouseThings extends MouseAdapter {

        @Override
        public void mousePressed(MouseEvent e) {
            mouseDown = e.getPoint();
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            selectionRect = null;
            // queue a repaint of the panel
            repaint();
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            // check for left mouse button
            if ((e.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) == 0) {
                return;
            }

            // store the current location
            mouseHere = e.getPoint();

            // calculate the size of the selection rectangle
            double downX = mouseDown.getX();
            double downY = mouseDown.getY();
            double hereX = mouseHere.getX();
            double hereY = mouseHere.getY();

            double l = Math.min(downX, hereX);
            double t = Math.min(downY, hereY);
            double w = Math.abs(downX - hereX);
            double h = Math.abs(downY - hereY);

            selectionRect = new Rectangle2D.Double(l, t, w, h);
            drawRect();
            // queue a repaint of the panel
            repaint();
        }
    }
}

public class MainForm extends JFrame {

    public MainForm(){
        MyPanel panel = new MyPanel();
        JScrollPane pictureScrollPane = new JScrollPane(panel);
        pictureScrollPane.setPreferredSize(new Dimension(750, 600));
        add( pictureScrollPane, BorderLayout.CENTER);
        Dimension d = new Dimension(500, 400);
        setSize(d);
        setTitle("testwindow");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

  
    public static void main(String[] args) {
        new MainForm();
    }
}


Krijg ook geen exceptions of wat dan ook..

Indien ik geen paint methode heb maar enkel:

Java:
1
2
3
4
5
6
7
8
9
10
protected void paintComponent(Graphics g)
    {
        AlphaComposite ta = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.1f);
        g2d.setComposite(ta);
        g2d.setColor(Color.BLUE);
        g2d.fill(selectionRect);
        g2d.setComposite(AlphaComposite.SrcOver);
        g2d.setColor(Color.BLACK);
        g2d.draw(selectionRect);
    }


Dan krijg ik netjes een sleepbare rechthoek maar ik krijg het dus niet werkend met initieel een x aantal figuren en dan slepen..

Wie heeft er wat aanwijzingen?

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09
kick :D

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

Verwijderd

Je rectangle wordt niet getekend omdat je hem alleen maar op de Image offscreen tekend. De graphics worden vervolgens nooit op de graphics van de JPanel getekend.

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
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
public class OtherPanel extends JPanel {
    private static final long serialVersionUID = 1L;
    private Point mouseDown, mouseHere;
    
    public OtherPanel() {
        MouseThings mouseThings = new MouseThings(); 
        this.addMouseListener(mouseThings); 
        this.addMouseMotionListener(mouseThings); 
    }
    
    @Override
    public void paintComponent(Graphics g) { 
    
        Dimension d = new Dimension(500, 400); 
        Image offscreen = createImage(d.width, d.height); 

        Graphics offgraphics = offscreen.getGraphics(); 
        
        Graphics2D g2d = (Graphics2D) offgraphics; 
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, // Anti-alias! 
                RenderingHints.VALUE_ANTIALIAS_ON); 

        g2d.setColor(Color.red); 
        g2d.drawRect(10, 20, 100, 15); 
        g2d.setColor(Color.pink); 
        g2d.fillRect(240, 160, 40, 110); 
        
        if (mouseDown != null) {            
            int width = mouseHere.x - mouseDown.x;
            int height = mouseHere.y - mouseDown.y;
            
            g2d.drawRect(mouseDown.x, mouseDown.y, width, height);
            System.out.println("mouseDragged");
        }
        
        g.drawImage(offscreen, 0, 0, null);
        
    }
    
    private class MouseThings extends MouseAdapter { 

        @Override 
        public void mousePressed(MouseEvent e) {
            mouseDown = e.getPoint();
            System.out.println("mousePressed");
        } 

        @Override 
        public void mouseReleased(MouseEvent e) { 
            mouseDown = null;
            System.out.println("mouseReleased");
            repaint();
        } 

        @Override 
        public void mouseDragged(MouseEvent e) {
            mouseHere = e.getPoint();
            repaint();
        } 
    } 
}

Hierboven een lapje code gebaseerd op jou code maar enkele aanpassingen.
Op regel 28 controleer ik of je rectangle getekend moet worden.
Op regel 36 plaats ik de daadwerkelijke tekening op de JPanel.

Geef ook aan of je instance variabelen private public of protected zijn, dit is netter en beschermd jezelf tegen fouten of hacks.

Ik ben me er van bewust dat de rectangle nu alleen van linksboven naar rechtsonder getekend kan worden maar daar kan zelf wel wat creatiefs op verzinnen =)

Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09
aha dat was niet zo handig idd..

Weet iemand hoe ik nu de figuren die daar in vallen zichtbaar selecteerbaar kan maken?

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

Verwijderd

Je zou een exacte tekening nog een keer kunnen tekenen maar dan met een andere kleur en transparant? De geselecteerde kleuren veranderen dan ook een beetje van kleur. en ziet het er geselecteerd uit.

Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09
Ik wil echt zo een kader eromheen..

zoals dit:

Afbeeldingslocatie: http://www.plaatjesupload.nl/bekijk/2009/07/24/1248440576-20.jpg

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

Verwijderd

Als je de locatie, breedte en hoogte van een object die geselecteerd is weet, dan weet je waar de rechthoeken getekend moeten worden.
Er is geen klasse die dit voor je doet in de java SDK.

Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09
Ik kan natuurlijk een rechthoek tekenen op de plaats waar het object staat die transparant is qua vulling..

Maar hoe krijg ik dan die puntjes eromheen?

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

  • Jegorex
  • Registratie: April 2004
  • Laatst online: 03-09 23:24
Als je de breedte en hoogte van het object weet dan teken je op de hoeken en in het midden van elke zijde een vierkant.
Dan heb je dus die vierkanten om je object heen.

Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09
Het is inmiddels gelukt netjes een rechthoek te kunnen tekenen als select tool.

Nu vraag ik mij echter af hoe ik kan weten waar de figuren staan. (zodat ik die daarna kan highliten ofzo)

zat te denken aan Graphics.getClip(); Deze blijft echter altijd null..

Ook nog .getComponents() (component array) geprobeerd maar ook hier staat niets in.

Code is nu als volg:

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
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package testjpanelapplication;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Rectangle2D;
import javax.swing.JPanel;

class MyPanel extends JPanel {

    private Rectangle2D.Double selectionRect;
    private Point mouseDown, mouseHere;
    private Image offscreen = null;
    private Graphics offgraphics = null;

    public MyPanel() {
        MouseThings mouseThings = new MouseThings();
        this.addMouseListener(mouseThings);
        this.addMouseMotionListener(mouseThings);
    }

    @Override
    public synchronized void paint(Graphics g) {
        maakPlaatje();
        g.drawImage(offscreen, 0, 0, null);
    }

    private void maakPlaatje() {
        Dimension d = new Dimension(750, 600);
        offscreen = createImage(d.width, d.height);
        if (offgraphics != null) {
            offgraphics.dispose();
        }
        offgraphics = offscreen.getGraphics();

        Graphics2D g2d = (Graphics2D) offgraphics;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, // Anti-alias!
                RenderingHints.VALUE_ANTIALIAS_ON);

        g2d.setColor(Color.red);
        g2d.drawRect(10, 20, 100, 15);
        g2d.setColor(Color.pink);
        g2d.fillRect(240, 160, 40, 110);

        g2d.setColor(Color.blue);
        g2d.drawOval(50, 225, 100, 50);
        g2d.setColor(Color.orange);
        g2d.fillOval(225, 37, 50, 25);

        g2d.setColor(Color.yellow);
        g2d.drawArc(10, 110, 80, 80, 90, 180);
        g2d.setColor(Color.cyan);
        g2d.fillArc(140, 40, 120, 120, 90, 45);

        g2d.setColor(Color.magenta);
        g2d.fillArc(150, 150, 100, 100, 90, 90);
        g2d.setColor(Color.black);
        g2d.fillArc(160, 160, 80, 80, 90, 90);

        g2d.setColor(Color.green);
        g2d.drawString("Groovy!", 50, 150);

        if (mouseDown != null) {
            g2d.setColor(Color.black);
            g2d.draw(selectionRect);
        }

    }

    private class MouseThings extends MouseAdapter {

        @Override
        public void mousePressed(MouseEvent e) {
            mouseDown = e.getPoint();
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            selectionRect = null;
            mouseDown = null;
            // queue a repaint of the panel
            repaint();
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            // check for left mouse button
            if ((e.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) == 0) {
                return;
            }

            // store the current location
            mouseHere = e.getPoint();

            // calculate the size of the selection rectangle
            double downX = mouseDown.getX();
            double downY = mouseDown.getY();
            double hereX = mouseHere.getX();
            double hereY = mouseHere.getY();

            double x = Math.min(downX, hereX);
            double y = Math.min(downY, hereY);
            double w = Math.abs(downX - hereX);
            double h = Math.abs(downY - hereY);

            selectionRect = new Rectangle2D.Double(x, y, w, h);
            // queue a repaint of the panel
            repaint();
        }
    }
}

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09
schopje ;)

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 19-09 08:51

Janoz

Moderator Devschuur®

!litemod

Jij weet toch waar je je dingen getekend hebt? Dan kun je ook wel uitrekenen of ze binnen je rechthoek vallen. Bedenk dat je gewoon vormpjes aan het tekenen bent, geen componenten. Dat tekenen zorgt er alleen voor dat er een paar pixels op een canvas een andere kleur krijgen.Het is echt niet zo dat de computer nu allemaal referenties naar de ooit getekende figuren bij gaat houden. Met een beetje logisch nadenken had je ook wel kunnen verzinnen dat de component methode niks nuttigs terug zou geven. Wat voor objecten had je immers verwacht terug te krijgen? Dat zul je zelf moeten doen.

Hoe je überhaupt bij de clip methodes uitkomt is mij helemaal een raadsel. 1 blik in de javadoc had je kunnen vertellen dat dat heel ergens anders voor is.

[ Voor 31% gewijzigd door Janoz op 28-07-2009 09:34 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09
Janoz schreef op dinsdag 28 juli 2009 @ 09:30:
Jij weet toch waar je je dingen getekend hebt? Dan kun je ook wel uitrekenen of ze binnen je rechthoek vallen. Bedenk dat je gewoon vormpjes aan het tekenen bent, geen componenten. Dat tekenen zorgt er alleen voor dat er een paar pixels op een canvas een andere kleur krijgen.Het is echt niet zo dat de computer nu allemaal referenties naar de ooit getekende figuren bij gaat houden. Met een beetje logisch nadenken had je ook wel kunnen verzinnen dat de component methode niks nuttigs terug zou geven. Wat voor objecten had je immers verwacht terug te krijgen? Dat zul je zelf moeten doen.

Hoe je überhaupt bij de clip methodes uitkomt is mij helemaal een raadsel. 1 blik in de javadoc had je kunnen vertellen dat dat heel ergens anders voor is.
Dat clip gedoe kwam ik tegen adhv een blogpost. En ik was in der veronderstelling dat je dus stukken kon knippen via bijvoorbeeld setten van setClip(int, int, int, int) (zelfde grote als rectangle) en dan die dus getten. Maar blijkbaar heb ik het verkeerd begrepen.. kan gebeuren toch ;)

En ik dacht eigenlijk wel dat het Graphics object wel op de hoogte zou zijn van de verschillende shapes die erop getekend werden. Althans dat hoopte ik... Ik ben niet echt thuis in tekenen met java. Heb dat eigenlijk nooit hoeven doen voor mijn werk. Had het trouwens ook wat graag zo gehouden maar goed ;)

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

Verwijderd

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
...
        g2d.setColor(Color.red); 
        g2d.drawRect(10, 20, 100, 15); 
        g2d.setColor(Color.pink); 
        g2d.fillRect(240, 160, 40, 110); 

        g2d.setColor(Color.blue); 
        g2d.drawOval(50, 225, 100, 50); 
        g2d.setColor(Color.orange); 
        g2d.fillOval(225, 37, 50, 25); 

        g2d.setColor(Color.yellow); 
        g2d.drawArc(10, 110, 80, 80, 90, 180); 
        g2d.setColor(Color.cyan); 
        g2d.fillArc(140, 40, 120, 120, 90, 45); 

        g2d.setColor(Color.magenta); 
        g2d.fillArc(150, 150, 100, 100, 90, 90); 
        g2d.setColor(Color.black); 
        g2d.fillArc(160, 160, 80, 80, 90, 90); 

        g2d.setColor(Color.green); 
        g2d.drawString("Groovy!", 50, 150);

Je vraagt je af hoe je weet waar alles staat: Hierboven staan alle coördinaten die je wilt weten. In de applet haal je de coördinaten waarschijnlijk ook ergens vandaan, op die manier kan je dus berekenen wat er geselecteerd moet worden. Met diezelfde coördinaten kan je dan ook de rectangles voor selectie gaan tekenen.

Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09
Verwijderd schreef op dinsdag 28 juli 2009 @ 10:49:

*knip*

Je vraagt je af hoe je weet waar alles staat: Hierboven staan alle coördinaten die je wilt weten. In de applet haal je de coördinaten waarschijnlijk ook ergens vandaan, op die manier kan je dus berekenen wat er geselecteerd moet worden. Met diezelfde coördinaten kan je dan ook de rectangles voor selectie gaan tekenen.
Ja dat snap ik.. Maar ik hoopte dus dat er makkelijkere manier was.. dat gewoon de shapes geretourneerd konden worden die er allemaal op het canvas stonden en dat ik hierop .getX(); en .getY(); op kon doen om te kijken of ze in het selectie rechthoek vallen.. En dan die shapes repainten met highlight.

Zo vreemd vond ik deze gedachte niet want je hebt je Graphics Object waarop je Shape's tekent (wat ook objecten zijn) als zijnde members..

[ Voor 30% gewijzigd door Bl4ckviper op 28-07-2009 12:06 ]

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09
Inmiddels werkend:

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
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
package testjpanelapplication;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Rectangle2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Arc2D;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JPanel;

class MyPanel extends JPanel {

    private Rectangle2D.Double selectionRect, selectionRectNotToDraw;
    private Point mouseDown, mouseHere;
    private Image offscreen = null;
    private Graphics offgraphics = null;
    private List shapes = new LinkedList();
    private List selectionShapes = new LinkedList();
    private boolean drawingSelection = false;

    public MyPanel() {
        MouseThings mouseThings = new MouseThings();
        this.addMouseListener(mouseThings);
        this.addMouseMotionListener(mouseThings);
    }

    public synchronized void paint(Graphics g) {
        maakPlaatje();
        g.drawImage(offscreen, 0, 0, null);
    }

    private void maakPlaatje() {
        Dimension d = new Dimension(750, 600);
        offscreen = createImage(d.width, d.height);
        if (offgraphics != null) {
            offgraphics.dispose();
        }
        offgraphics = offscreen.getGraphics();

        Graphics2D g2d = (Graphics2D) offgraphics;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, // Anti-alias!
                RenderingHints.VALUE_ANTIALIAS_ON);
        Rectangle2D rect = new Rectangle2D.Double(10, 20, 100, 15);
        shapes.add(rect);
        g2d.setColor(Color.red);
        g2d.draw(rect);
        g2d.setColor(Color.pink);
        rect = new Rectangle2D.Double(240, 160, 40, 110);
        shapes.add(rect);
        g2d.draw(rect);
        g2d.fillRect(240, 160, 40, 110);

        g2d.setColor(Color.blue);
        Ellipse2D ell = new Ellipse2D.Double(50, 225, 100, 50);
        shapes.add(ell);
        g2d.draw(ell);
        g2d.setColor(Color.orange);
        ell = new Ellipse2D.Double(225, 37, 50, 25);
        shapes.add(ell);
        g2d.draw(ell);
        g2d.fillOval(225, 37, 50, 25);

        g2d.setColor(Color.yellow);
        Arc2D arc = new Arc2D.Double(10, 110, 80, 80, 90, 180, 0);
        shapes.add(arc);
        g2d.draw(arc);
        arc = new Arc2D.Double(140, 40, 120, 120, 90, 45, 0);
        shapes.add(arc);
        g2d.draw(arc);
        g2d.setColor(Color.cyan);
        g2d.fillArc(140, 40, 120, 120, 90, 45);

        g2d.setColor(Color.magenta);
        arc = new Arc2D.Double(150, 150, 100, 100, 90, 90, 0);
        shapes.add(arc);
        g2d.draw(arc);
        g2d.fillArc(150, 150, 100, 100, 90, 90);
        g2d.setColor(Color.black);
        arc = new Arc2D.Double(160, 160, 80, 80, 90, 90, 0);
        shapes.add(arc);
        g2d.draw(arc);
        g2d.fillArc(160, 160, 80, 80, 90, 90);

        g2d.setColor(Color.green);
        g2d.drawString("Groovy!", 50, 150);

        if (drawingSelection) {
            for (int i = 0; i < selectionShapes.size(); i++) {
                g2d.setColor(Color.white);
                g2d.draw((Shape) selectionShapes.get(i));
            }
        }

        if (mouseDown != null) {
            g2d.setColor(Color.black);
            g2d.draw(selectionRect);
            for (int i = 0; i < shapes.size(); i++) {
                Shape listShape = (Shape) shapes.get(i);
                Rectangle2D listRect = listShape.getBounds2D();
                Point.Double rectPoint = new Point.Double(listRect.getX(), listRect.getY());
                if (selectionRectNotToDraw.contains(rectPoint)) {
                    if (listShape instanceof Rectangle2D) {
                        Rectangle2D itsARec = (Rectangle2D) listShape;
                        selectionShapes.add(itsARec);
                    } else if (listShape instanceof Ellipse2D) {
                        Ellipse2D itsAEll = (Ellipse2D) listShape;
                        selectionShapes.add(itsAEll);
                    } else if (listShape instanceof Arc2D) {
                        Arc2D itsAArc = (Arc2D) listShape;
                        selectionShapes.add(itsAArc);
                    }
                }
            }
        }

    }

    private class MouseThings implements MouseMotionListener, MouseListener {

        public void mousePressed(MouseEvent e) {
            drawingSelection = false;
            selectionShapes.clear();
            selectionRectNotToDraw = null;
            mouseDown = e.getPoint();
        }

        public void mouseReleased(MouseEvent e) {
            selectionRect = null;
            mouseDown = null;
            // queue a repaint of the panel
            shapes.clear();
            drawingSelection = true;
            repaint();
        }

        public void mouseDragged(MouseEvent e) {
            // check for left mouse button
            if ((e.getModifiers() != 16)) {
                return;
            }

            // store the current location
            mouseHere = e.getPoint();

            // calculate the size of the selection rectangle
            double downX = mouseDown.getX();
            double downY = mouseDown.getY();
            double hereX = mouseHere.getX();
            double hereY = mouseHere.getY();

            double x = Math.min(downX, hereX);
            double y = Math.min(downY, hereY);
            double w = Math.abs(downX - hereX);
            double h = Math.abs(downY - hereY);

            selectionRect = new Rectangle2D.Double(x, y, w, h);
            selectionRectNotToDraw = selectionRect;
            shapes.clear();
            // queue a repaint of the panel
            repaint();
        }

        public void mouseMoved(MouseEvent arg0) {
        }

        public void mouseClicked(MouseEvent arg0) {
        }

        public void mouseEntered(MouseEvent arg0) {
        }

        public void mouseExited(MouseEvent arg0) {
        }
    }
}


Weet iemand toevallig nog wel hoe je de dikte van de lijn van een shape kan instellen? Nu heb ik maar een dun wit lijntje als selectie aanduiding die zou ik graag dikker willen hebben.

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 19-09 08:51

Janoz

Moderator Devschuur®

!litemod

Probeer javadoc eens. Als je dat had gedaan dan had je de Graphics2D.setStroke() kunnen vinden. Dat, samen met BasicStroke zou je een behoorlijk eind in de goede richting kunnen brengen.

edit:

Trouwens
Java:
1
2
3
4
5
6
7
8
9
10
11
12
                if (selectionRectNotToDraw.contains(rectPoint)) { 
                    if (listShape instanceof Rectangle2D) { 
                        Rectangle2D itsARec = (Rectangle2D) listShape; 
                        selectionShapes.add(itsARec); 
                    } else if (listShape instanceof Ellipse2D) { 
                        Ellipse2D itsAEll = (Ellipse2D) listShape; 
                        selectionShapes.add(itsAEll); 
                    } else if (listShape instanceof Arc2D) { 
                        Arc2D itsAArc = (Arc2D) listShape; 
                        selectionShapes.add(itsAArc); 
                    } 
                } 

Kan natuurlijk een heel stuk korter. Wat dacht je van:
Java:
1
2
3
                if (selectionRectNotToDraw.contains(rectPoint)) { 
                    selectionShapes.add(listShape); 
                } 

De cast is niet nodig omdat je gewoon met shapes blijft werken binnen die context.

[ Voor 74% gewijzigd door Janoz op 28-07-2009 13:54 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1