JComponent aus JPanel anhand Mausposition ermitteln

Diskutiere JComponent aus JPanel anhand Mausposition ermitteln im AWT, Swing, JavaFX & SWT Bereich.
L

LatinFavourite

Moin zusammen,
ich habe in einer Anwendung ein JPanel vorliegen, welches wiederum einige JComponents beinhaltet.
Ich beabsichtige nun mithilfe eines MouseMotionListener einige davon anzuwählen. Ich stehe dabei momentan auf dem Schlauch und bei
meinen bisherigen Versuchen über die Mauskooridinaten werden alle Komponenten angewählt.


Java:
public void mouseDragged(MouseEvent e) {
        for(int i = 0; i < model.getAllComponents().size(); ++i) {
            if(model.getComponentAt(i).contains(e.getPoint())){
                // Hier werden alle Komponenten gefunden.
            }
        }
    }

Liebe Grüße und vielen Dank für jeden Tipp im Voraus.

LatinFavourite
 
L

LatinFavourite

Vielen Dank schon einmal. Ich habe den ersten Schritt hiermit gemacht.
Java:
if(component.getMousePosition() != null){
    //...
}
 
mihe7

mihe7

Kannst Du mal ein wenig mehr Code einstellen? Mir ist noch nicht ganz klar, was genau Du machen willst.
 
L

LatinFavourite

Das kann ich gerne machen, sobald ich es zumindest etwas zum Laufen gebracht habe.
Grundsätzlich möchte ich mit der Maus über die Komponenten im Panel fahren und von den ausgewählten Elementen den Inhalt, in diesem Fall ein Bild, weiterverwenden. Quasi die typische, rechteckige Auswahl mit der Maus.
 
mihe7

mihe7

Quasi die typische, rechteckige Auswahl mit der Maus.
Aha, das ist ja gleich was ganz anderes. D. h. Du hast einen Punkt p1, wenn Du die Maustaste drückst und im Drag hast Du einen Punkt p2, so dass p1,p2 ein Rechteck definieren und jetzt willst Du ermitteln, welche Komponenten sich in diesem Rechteck befinden? -> alle Komponenten, deren Bounds im Rechteck p1,p2 enthalten sind.
 
L

LatinFavourite

Ja genau, so meine ich es. Und die Struktur, die die Komponenten auf dem Panel hatten, also wie viele Zeilen und Spalten ausgewählt worden sind, soll beibehalten werden.
 
mihe7

mihe7

Also etwas wie
Java:
import java.awt.*;
import java.awt.geom.Line2D;
import java.awt.event.*;
import javax.swing.*;

import java.util.*;
import java.util.stream.*;

public class Test extends JPanel {

    private Rectangle selection;

    private MouseAdapter selectionListener = new MouseAdapter() {
        private Point start;
        @Override
        public void mousePressed(MouseEvent e) {
            start = e.getPoint();
        }

        @Override
        public void mouseDragged(MouseEvent e) {

            Point end = e.getPoint();
            selection = new Line2D.Double(start, end).getBounds();
            repaint();
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            Point end = e.getPoint();
            selection = new Line2D.Double(start, end).getBounds();

            Container container = (Container) e.getSource();
            Set<Component> selected = Stream.of(container.getComponents())
                .filter(c -> selection.contains(c.getBounds()))
                .collect(Collectors.toSet());
            System.out.println(selected);

            selection = null;
            repaint();
        }
    };

    public Test() {
        setLayout(null);
        addMouseListener(selectionListener);
        addMouseMotionListener(selectionListener);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (selection != null) {
            g.setColor(new Color(127,127,127,127));
            g.fillRect(selection.x, selection.y,
                       selection.width, selection.height);
        }
    }

    public void run() {
        for (int i = 0; i < 4; i++) {
            int x = 10 + (i % 2) * 80;
            int y = 10 + (i / 2) * 80;
            int size = 50;
            JPanel p = new JPanel();
            p.setBackground(Color.green);
            add(p);
            p.setBounds(x, y, size, size);
        }

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(this);
        frame.setSize(800, 600);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
 
L

LatinFavourite

Klasse, das sieht sehr interessant aus, werde ich mich nachher einmal mit beschäftigen. Melde mich dann zurück.

LG
Latin
 
L

LatinFavourite

Wollte mich zurückmelden und mich bei dir, mihe7, bedanken. Funktioniert super und kann nun darauf aufbauen. Die Sache Stream.of war mir neu und werde mich da einmal einlesen.

Danke und allen schöne Ostertage.
 
mihe7

mihe7

Freut mich. Dann hast Du über Ostern ja was zu tun :)

Der Stream ist nicht zwingend erforderlich, sorgt halt für kürzeren Code. Das funktioniert genauso mit einer Schleife, in der das contains abgeprüft wird und die Komponente in diesem Fall zu einer Liste hinzugefügt wird.
 
Thema: 

JComponent aus JPanel anhand Mausposition ermitteln

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben