# Maus Rahmen zeichnen



## WieselAc (31. Jan 2007)

Hallo,

ich bin gerade auf der suche nach einer Möglichkeit mit der Maus einen Rahmen über diverse Komponenten zu zeichnen. Das bedeutet ich habe ein JPanel auf dem einige Componenten eingefügt sind. Jetzt möchste ich auf einer Stelle einen rechte Klick machen, die Maus gedrückt halten und auf eine Andere Position ziehen.Dabei soll die Maus einen Rahmen zeichnen. Ich hoffe das ist eigigermassen verständlich. Mit  einem MouseListener etc hab ich mir schon ein Gerüst gebaut den Start Punkt, den jeweils aktuellen während der Bewgung und den Endpunkt zu holen. Jetzt weiß ich aber nicht genau wie ich quasi über die Komponenten auf dem Panel malen kann. Hat da einer eine Idee? Ich bin schon auf das Stichwort Glasspanel gestoßen aber bin mir nicht ganz sicher ob und wie ich das hier anwenden kann. Bei Bedarf bau ich auch gerne ein kleines lauffähiges Beispiel zusammen.

viele Grüße


----------



## Azrahel (31. Jan 2007)

Vllt gibts sowas ja schon als Componente, das weiss ich jetzt nicht auswendig, aber versuch mal mit dem GraphicsObject oder Graphics2d ein rechteck zu zeichnen. Ich weiss jetzt nicht genau ob man das nur als Rahmen zeichnen kann, ansonsten kannste versuchen das ganze mit drawLine zu machen. 

Ob du allerdings einfach so reinzeichnen kannst weiss ich nicht, aber ich denke das du auf dem Panel wo schon deine Componenten liegen auch zeichnen kannst. 

irgendwo hab ich hier im Forum aber glaube ich mal gesehen das man auf die GlassPane auch ein Panel packen kann, das kann ja dann opaque(true/false) (weiss jetzt nicht genau was gesetzt sein muss damit es durchsichtig ist), und auf dem Panel müssteste dann normal zeichnen können. Das wär zumindest der Ansatz der mir als erstes durch den kopf geht. oder du benutzt das Panel selbst mit ner gesetzten Border als Rahmen, und nutzt beim Rahmen ziehen einfach setBounds().


----------



## WieselAc (31. Jan 2007)

Beim Bau des Beispiels hab ich doch tatsälich eine teilweise funktionierende Lösung gebaut 




```
package puzzel;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Rahmen extends JPanel implements MouseListener,
        MouseMotionListener {

    private static final long serialVersionUID = 1L;
    private Point start, current;
    private boolean move;

    public Rahmen() {
        move = false;
        setLayout(new GridLayout(3, 4));
        addMouseListener(this);
        addMouseMotionListener(this);
        for (int i = 0; i < 3 * 4; i++) {
            addColorPanel(i);
        }
    }

    private void addColorPanel(int i) {
        JPanel p = new JPanel();
        p.setPreferredSize(new Dimension(30, 30));
        p.setBackground(new Color(i * i, 255 - i * 10, i * 10));
        add(p);
    }

    public void mouseClicked(MouseEvent event) {
    }

    public void mousePressed(MouseEvent event) {
        if (event.isMetaDown()) {
            start = event.getPoint();
        }
    }

    public void mouseReleased(MouseEvent event) {
        if (event.isMetaDown()) {
            move = false;
            repaint();
        }
    }

    public void mouseEntered(MouseEvent event) {
    }

    public void mouseExited(MouseEvent event) {
    }

    public void mouseDragged(MouseEvent event) {
        if (event.isMetaDown()) {
            move = true;
            current = event.getPoint();
            repaint();
        }
    }

    public void paint(Graphics g) {
        super.paint(g);
        g.setColor(Color.BLACK);
        if (move) {
            int x = start.x < current.x ? start.x : current.x;
            int y = start.y < current.y ? start.y : current.y;

            g.drawRect(x, y, Math.abs(current.x - start.x), Math.abs(current.y
                    - start.y));
        }
    }

    public void mouseMoved(MouseEvent event) {
    }

    private static void createAndShowGUI() {

        JFrame frame = new JFrame("Rahmen");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Rahmen rahmenPanel = new Rahmen();
        frame.getContentPane().add(rahmenPanel);

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

}
```


----------



## Azrahel (31. Jan 2007)

Warum schreib ich dir eigentlich wenn du selbst drauf kommst?  :wink:


----------



## WieselAc (31. Jan 2007)

Hmmmmmmm OK, dann werd ich NIEEEEE wieder was sagen   

Konnnt ja nicht ahnen , das es so funktioniert.

Aber daraus schließe ich: Die Hälfte der Fragen hier würden sich sofort erledigen, wenn man die Leute zwingen würde ein Beispiel zu bauen.

PS: Hab den Code jetzt so korregiert das es geht. Falls jedoch jemand noch eine Bessere Idee hat ruhig posten, deshalb erstmal kein Haken.


----------



## Azrahel (31. Jan 2007)

WieselAc hat gesagt.:
			
		

> Hmmmmmmm OK, dann werd ich NIEEEEE wieder was sagen



Soooo war das jetzt auch nicht gemeint   




			
				WieselAc hat gesagt.:
			
		

> Aber daraus schließe ich: Die Hälfte der Fragen hier würden sich sofort erledigen, wenn man die Leute zwingen würde ein Beispiel zu bauen.


Das ist wohl so, und ich glaube deswegen hat Andre Uhres das auch in seine Signatur geschrieben


----------



## Leroy42 (31. Jan 2007)

Azrahel hat gesagt.:
			
		

> WieselAc hat gesagt.:
> 
> 
> 
> ...



Wobei ich sogar glaube, daß ihr mit der _Hälfte der Fragen_ weit untertreibt.  :wink:


----------



## Azrahel (31. Jan 2007)

Da könntest du echt recht haben. grad bei der Fehlersuche kommen die Jungs echt gleich bei jedem Pienz gerannt, statt selber mal das Hirn anzustrengen.

[edit]das ging jetzt nicht gegen dich WieselAc[/edit]


----------



## WieselAc (31. Jan 2007)

jaja schon klar was du meinst _*heul schlurz wein*_


Aber zurück zum Thema, fällt jemanden "auf die Schnelle" ein, wie ich mir da jetzt array ne Liste oder sonst was mit allen "selektierten" (also eingerahmten) Komponenten bestimmen lassen kann, nachdem die Maus losgelassen wurde.


Werd natürlich selber auch weiter dran arbeiten, aber erst heute Abend, muss jetzt mal kurz weg.


----------



## Azrahel (31. Jan 2007)

Ja, nur ist meine Idee glaub ich etwas umständlich.

lass dir ne Liste aller Elemente auf deinem Panel geben (get glaub ich mit getComponents()), frag von denen die Position ab (das was man mit setBounds setzen würd muss man ja auch irgendwie rausbekommen können) und vergleich das mit deinem rahmen. Dabei kannst du z.b. auch festlegen ob es reicht das ein object angeschnitten wird um es zu markieren oder so   

Hee, die Idee gefällt mir sogar, ich glaub die merk ich mir mal grad


----------



## Gast (31. Jan 2007)

Super Idee hab schonmal auf die schnelle was damit rumprobiert, genau das ist es. ich hol  mir die rectanagle aller Componenten und gucke dann welche das von der Maus gezeichnete Rechteck schneiden.


----------

