GridPane per Maus Zelle bekommen, wie?

javaRekrut

Mitglied
Liebe Mitglieder,

Ich habe eine GridPane 8x8 (in ScenenBuilder, aber das sollte keine Rolle spielen) erstellt. Ich möchte per Mausklick auf eines dieser Felder (Zelle) den Zellenindex(Reihe,Spalte) auf der Konsole angezeigt bekommen. Meine bisherigen Recherchen im Netz sind leider nicht geglückt.

Die bisher sinnvollste Methode in meinen Augen aus dem Netz ist diese:

@FXML
private void mouseEntered(MouseEvent e) {
Node source = (Node)e.getSource() ;
Integer colIndex = GridPane.getColumnIndex(source);
Integer rowIndex = GridPane.getRowIndex(source);
System.out.printf("Mouse entered cell [%d, %d]%n", colIndex.intValue(), rowIndex.intValue());
}

Beim Testen erhalte ich jedoch einen NullPointerException. Auch beim Test des Objekts an sich "System.out.println(colIndex);" erhalte ich 'null'.

Ich hoffe ich habe genügend Informationen zu meinem Hindernis geschildert, ansonsten liefer ich nach.

Danke im voraus :)
 

dzim

Top Contributor
Es gibt wirklich keine echte API dafür, da das GridPane ein Layout ist und keine echte Tabelle.
Erinnere mich morgen mal und ich baue ein kleines Beispiel, wir man es dennoch irgendwie zustande bringt...
 

dzim

Top Contributor
Hoi zäme

Hier mal meine Idee, wie man so etwas machen kann. Nicht schön, aber gibt am Ende dir Element und Spalte/Zeile aus.
Java:
package eu.dzim.tests.fx;

import java.util.Locale;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class MainGridSelect extends Application {
   
    private final Class<?>[] availableNodes = new Class<?>[] { Label.class, Button.class, CheckBox.class, HBox.class };
    private final Random random = new Random(System.currentTimeMillis());
    private final Pattern pattern = Pattern.compile("item_(\\d+)_(\\d+)");
   
    @Override
    public void start(Stage stage) throws Exception {
       
        stage.setTitle("Grid Select");
       
        GridPane root = buildContent();
        Scene scene = new Scene(root, 1200, 800);
        initialize(stage, scene, root);
       
        stage.setScene(scene);
        stage.show();
    }
   
    private GridPane buildContent() {
        GridPane pane = new GridPane();
       
        pane.setHgap(5.0);
        pane.setVgap(5.0);
       
        final int max = 4;
        for (int i = 0; i < max; i++) {
            for (int j = 0; j < max; j++) {
                Node n = getRandomNode(pane, max, i, j);
                GridPane.setConstraints(n, i, j);
                pane.getChildren().add(n);
            }
        }
       
        return pane;
    }
   
    private Node getRandomNode(GridPane pane, int max, int i, int j) {
       
        int r = random.nextInt(max);
        Class<?> clazz = availableNodes[r];
       
        Node n;
        if (Label.class.isAssignableFrom(clazz)) {
            n = new Label(String.format(Locale.ROOT, "%d, %d", i, j));
        } else if (Button.class.isAssignableFrom(clazz)) {
            n = new Button(String.format(Locale.ROOT, "%d, %d", i, j));
        } else if (CheckBox.class.isAssignableFrom(clazz)) {
            n = new CheckBox(String.format(Locale.ROOT, "%d, %d", i, j));
        } else if (HBox.class.isAssignableFrom(clazz)) {
            n = new HBox();
            ((HBox) n).setSpacing(5.0);
            Label l = new Label("" + i);
            l.setOnMouseClicked(e -> pane.fireEvent(e.copyFor(n, pane)));
            Button b = new Button("" + j);
            b.setOnMouseClicked(e -> pane.fireEvent(e.copyFor(n, pane)));
            ((HBox) n).getChildren().addAll(l, b);
        } else {
            return null;
        }
        n.setId("item_" + i + "_" + j);
        n.setOnMouseClicked(e -> pane.fireEvent(e.copyFor(n, pane)));
        return n;
    }
   
    private void initialize(Stage stage, Scene scene, GridPane pane) {
        pane.setOnMouseClicked(e -> {
            pane.getChildren().stream()
                    .filter(n -> n.getLayoutX() <= e.getX() && e.getX() <= (n.getLayoutX() + n.getLayoutBounds().getWidth())
                            && n.getLayoutY() <= e.getY() && e.getY() <= (n.getLayoutY() + n.getLayoutBounds().getHeight()))
                    .forEach(n -> handleClick(e, n));
        });
    }
   
    private void handleClick(MouseEvent e, Node targetNode) {
        System.err.println(targetNode);
        String id = targetNode.getId();
        if (id != null) {
            Matcher m = pattern.matcher(id);
            if (m.matches()) {
                String colString = m.group(1);
                String rowString = m.group(2);
                System.err.printf("Grid element: Column=%s, Row=%s", colString, rowString);
            }
        }
    }
   
    public static void main(String[] args) {
        launch(args);
    }
}

Aber Achtung: Der Ansatz ist stark limitiert: Es fängt dann an frimelig zu werden, wenn du statt Labels/Buttons weitere Layouts mit Komponenten darauf verwendest.
Denn generell musst du die Events weiter propagieren, dass macht es unnötig kompliziert.

Grüsse,
Daniel
 

javaRekrut

Mitglied
Danke für eure Hilfe!
Ich habe eine andere Möglichkeit gefunden um mein Projekt zu realisieren. Habe eigene Tabelle 8x8 erstellt welches aus Rectangle mit events besteht.

Funktioniert wunderbar. Danke nochmals :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H GridPane wird nicht angezeigt Java Basics - Anfänger-Themen 0
O TextField in GridPane beschränken Java Basics - Anfänger-Themen 5
E Isometrische Tileauswahl mit der Maus Java Basics - Anfänger-Themen 1
CptK Klassen Event bei gedrückter Maus immer wieder mit Pause ausführen Java Basics - Anfänger-Themen 2
CptK Klassen mouseClicked wird nicht aufgerufen, während man die Maus bewegt Java Basics - Anfänger-Themen 4
D Wie frage ich ab ob die Linke maus Taste gedrückt wurde? Java Basics - Anfänger-Themen 3
M Graphics2D Objekt mir der Maus erstellen Java Basics - Anfänger-Themen 5
T Zur Maus zoomen / Fehler bei Bilddarstellung Java Basics - Anfänger-Themen 3
N Erkennen ob Linkshänder Maus Java Basics - Anfänger-Themen 4
C [Greasmonkey] Maus Coursor position setzen Java Basics - Anfänger-Themen 1
S Maus soll Programm nicht verlassen Java Basics - Anfänger-Themen 1
P mousevents bei Maus und touchscreen reagieren unterschiedlich Java Basics - Anfänger-Themen 1
X Weg der Maus in px Java Basics - Anfänger-Themen 1
L Maus Click Simulation Java Basics - Anfänger-Themen 5
J Windows Maus-Zeigerbeschleunigung aktivieren/deaktivieren - Mit Java möglich? Java Basics - Anfänger-Themen 2
S Maus Position Java Basics - Anfänger-Themen 6
S java ruckelnde maus Java Basics - Anfänger-Themen 8
E Y-Position der Maus nehmen Java Basics - Anfänger-Themen 5
K Bild mit Maus innerhalb eines Rahmens bewegen Java Basics - Anfänger-Themen 5
T problem mit der maus in BlueJ Java Basics - Anfänger-Themen 14
Nicer Maus Events Java Basics - Anfänger-Themen 2
J SuM.kern.Maus gibt null obwohl initialisiert Java Basics - Anfänger-Themen 3
J den x und y Wert beim klicken der Maus ermitteln Java Basics - Anfänger-Themen 2
R Objekt mit Maus auswählen und verschieben Java Basics - Anfänger-Themen 2
S Koordinaten der Maus wiedergeben Java Basics - Anfänger-Themen 6
B GridLayout - elemente mit Maus abfragen Java Basics - Anfänger-Themen 3
Hamstinator Fenster mit Maus verschieben Java Basics - Anfänger-Themen 2
B Hilfe: Tastatureingaben werden erst nach der Maus angenommen Java Basics - Anfänger-Themen 3
C Scroll per Maus Java Basics - Anfänger-Themen 2
O Maus / Pixel Position bei mir und bei anderen. Java Basics - Anfänger-Themen 8
B träge Maus Java Basics - Anfänger-Themen 2
H2SO3- dreieck, bild --> maus klick event. Wie gehts? Java Basics - Anfänger-Themen 10
F Maus fangen Java Basics - Anfänger-Themen 9
A grafik 2d Objekte mit der Maus bewegen Java Basics - Anfänger-Themen 4
H Objekt mit Maus verschieben Java Basics - Anfänger-Themen 4
A Maus positionserkennung zu langsam Java Basics - Anfänger-Themen 4
G Maus mit java bewegen Java Basics - Anfänger-Themen 6
N Applet ruckelt solange Maus nicht in Bewegung? Java Basics - Anfänger-Themen 3
M Maus position abfragen und setzen? Java Basics - Anfänger-Themen 1
G nicht Quadratischer Maus-Klickbereich Java Basics - Anfänger-Themen 6
M Fokus mit Maus und Tastatur Java Basics - Anfänger-Themen 5
T eine zusätzliche Virtualle Maus Java Basics - Anfänger-Themen 11
E Mit der Maus Zeichenen Java Basics - Anfänger-Themen 5
DEvent Maus deaktivieren und exklusiv nur für das Hauptfenster Java Basics - Anfänger-Themen 5
E Kreis in Frame ,den man mit der Maus versetzen kann? Java Basics - Anfänger-Themen 2
B Button - auf Maus reagieren Java Basics - Anfänger-Themen 16
G Buttons mit der Maus nicht anklickbar Java Basics - Anfänger-Themen 8
B Probleme mit der maus Java Basics - Anfänger-Themen 4
M Maus und Tastatur Java Basics - Anfänger-Themen 5
G Maus+Tastatur aktionen simulieren? Java Basics - Anfänger-Themen 5
D Maus steuern Java Basics - Anfänger-Themen 9
E JTable einzelne Zelle färben Java Basics - Anfänger-Themen 2
A Array Ansprache einer Zelle über Punktnotation? Java Basics - Anfänger-Themen 3
O Kommentar auf JTable Zelle Java Basics - Anfänger-Themen 2
M CellReender Zellenfarbe int abhängigkeit einer anderen Zelle Java Basics - Anfänger-Themen 13
S Prüfen ob Zelle in Excel leer ist funktioniert nicht (Apache POI) Java Basics - Anfänger-Themen 18
K (JTable) Text einer Zelle auf der linken Seite kürzel Java Basics - Anfänger-Themen 2
J Formattierte Zelle nicht mitzählen Java Basics - Anfänger-Themen 1
M Zelle von JTable mit Rahmen versehen Java Basics - Anfänger-Themen 4
S JTable mit Text UND Icon in einer Zelle Java Basics - Anfänger-Themen 5
I Hintergrundfarbe einer Zelle in einer JTable Java Basics - Anfänger-Themen 10
H jZable - Zelle direkt überschreiben Java Basics - Anfänger-Themen 3
G POI: Zelle aus einer Tabelle kopieren und in einr anderen einfügen Java Basics - Anfänger-Themen 5
W Eine Zelle einer Tabelle die Schriftfarbe ändern Java Basics - Anfänger-Themen 5
C Bild in JTable verändern (nach einem Klick auf Zelle) Java Basics - Anfänger-Themen 4
G zelle(n) makieren, button klick, Zelle(n) farbig Java Basics - Anfänger-Themen 4
R einzelne Zelle einer JTable bearbeiten Java Basics - Anfänger-Themen 2
G Wert in einer Zelle ersetzen Java Basics - Anfänger-Themen 4
E Inhalt einer array zelle prüfen? Java Basics - Anfänger-Themen 2
F Aktualisieren einer einzelnen Zelle in JTable Java Basics - Anfänger-Themen 2
S setCellRenderer für EINZELNE Zelle Java Basics - Anfänger-Themen 9
K Zelle in JTable sperren? Java Basics - Anfänger-Themen 2
M JTable Focus bleibt auf Zelle Java Basics - Anfänger-Themen 4
R JTable - Wert einer selektierten Zelle auslesen Java Basics - Anfänger-Themen 1
K Hintergrundfarbe einer Tabellen-Zelle verändern Java Basics - Anfänger-Themen 2
J Jtable - wie einzelne zelle markieren Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben