JComponent aus JPanel anhand Mausposition ermitteln

LatinFavourite

Bekanntes Mitglied
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
 
Vielen Dank schon einmal. Ich habe den ersten Schritt hiermit gemacht.
Java:
if(component.getMousePosition() != null){
    //...
}
 
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.
 
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.
 
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.
 
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());
    }
}
 
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.
 
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.
 

Zurück
Oben