# JavaFx setOnMouseClicked



## Nummer6800 (14. Mai 2015)

Hallo.

Ich stelle mehrere Vierecke her. Lade sie in die pane, etc.
Sie werden also in einem neuen Fenster angezeigt. Funktioniert.

Nur hiermit habei ich ein Problem: Wenn ich draufdruecke, dann sollte es eigentlich  Ein Vierreck aus der
ArrayList entfernen: vierecke.remove(0);
Doch das gewisse Vierreck wird weiterhin angezeigt!


```
Viereck testo;
		testo = new Viereck(VIERECKWEITE, VIERECKHOEHE, WIDTH, HEIGHT);
		
		
		testo.setOnMouseClicked(
                new EventHandler<MouseEvent>() {

                	
                	@Override public void handle(MouseEvent e) {
                
     vierecke.remove(0);
 }
                });
		
		vierecke.add(testo);
```










```
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import javafx.application.*;
import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.layout.*;
import javafx.scene.control.*;
import javafx.event.*;

import javafx.scene.image.Image;
import javafx.scene.image.ImageView;

import javafx.application.*;
import javafx.stage.*;
import javafx.scene.*;
import javafx.event.*;
import javafx.scene.layout.*;
import javafx.scene.shape.*;
import javafx.scene.paint.*;
import javafx.animation.*;
import javafx.util.*;
import java.util.*;
import java.util.ArrayList;
import java.util.List;


import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.application.*;
import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.layout.*;
import javafx.scene.control.*;
import javafx.event.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.application.*;
import javafx.stage.*;
import javafx.scene.*;
import javafx.event.*;
import javafx.scene.layout.*;
import javafx.scene.shape.*;
import javafx.scene.paint.*;
import javafx.animation.*;
import javafx.util.*;

import java.util.*;

import javafx.application.*;
import javafx.stage.*;
import javafx.scene.*;
import javafx.event.*;
import javafx.scene.layout.*;
import javafx.scene.shape.*;
import javafx.scene.paint.*;
import javafx.animation.*;
import javafx.util.*;

import java.util.*;



public class Test extends Application {

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

    final public int WIDTH = 600;
    final public int HEIGHT = 500;
    final public int VIERECKWEITE = 5;
    final public int VIERECKHOEHE = 5;

    public ArrayList<Viereck> vierecke = new ArrayList<Viereck>();


    @Override public void start(final Stage primaryStage)
    {


        Group root = new Group(); // hier group root fuer spaetere pane



// hier erstelle ich nur massenhaft Vierrecke und fuege sie ArrayList vierecke zu

		for (int i = 0; i < 4; i++) // hier die instanzen von Viereck erstellen u alles uebergeben
			vierecke.add(new Viereck(VIERECKWEITE, VIERECKHOEHE, WIDTH, HEIGHT));



// hier erstelle ich ein Vierreck, wenn ich auf es clicke, dann sollte es eigentlich ein anderes entfernen
// habe die Viereck testo nach oben eingefuehrt, hat auch nicht geholfen


		Viereck testo;
		testo = new Viereck(VIERECKWEITE, VIERECKHOEHE, WIDTH, HEIGHT);
		
		
		testo.setOnMouseClicked(
                new EventHandler<MouseEvent>() {

                	
                	@Override public void handle(MouseEvent e) {
                	
                	


     vierecke.remove(0);


                    }
                });
		
		
		vierecke.add(testo);
		
		


		
		
		
		
		
		Viereck test5;
		test5 = new Viereck(VIERECKWEITE, VIERECKHOEHE, WIDTH, HEIGHT);
		
		vierecke.add(test5);
		



// hier der pane hinzufuegen etc .. 


root.getChildren().addAll(vierecke);

		
		
   
        Scene scene = new Scene(root, WIDTH, HEIGHT);
        primaryStage.setTitle("Voller Vierecke");
        primaryStage.setScene(scene);
        primaryStage.show();




    }

}
```


----------



## MrTroble (14. Mai 2015)

du musste dein frame repainten wahrscheinlich auf swing gibt es dazu repaint aber auf Fx primmaryStage.setScene(scene)
noch mal ausführen in der onMous ich binn mir nich sicher n Versuch is es wert (ich weis nich ob das noch zum fx thread gehört)


----------



## MrTroble (14. Mai 2015)

Hatt es funktioniert?


----------



## Nummer6800 (14. Mai 2015)

MrTroble hat gesagt.:


> Hatt es funktioniert?





Meinst Du in so einer gesonderten Methode (buttonclick wurde von MouseClick ausgeloest)?


```
private void buttonClick(int j)
	{
vierecke.remove(j);

primaryStage.setScene(scene);
	}
```

Leider erlaubt er es nicht.
Ich wuesste nicht wo ich sonst das neue primaryStage.setScene(scene); reinschreiben koennte.


Von Swing habe ich ueberhaupt keine Ahung.
Und von KeyFrame steht leider nicht viel in meinem Buch. ICh vermute das ist so eine art repaint in fx.

Daher werde ich das Problem vereinfachen. Ich erstelle ein Array das die Veraenderungen alle aufnimmt.
Und hoffe es gibt einen einfachen weg wie KeyFrame mir den neuen Inhalt anzeigt.

Ich verstehe Keyframe nicht. Da kann ich z.B. Methoden starten lassen.
Diese veraendern werte.

Wird dann die start methode neu aufgerufen?? Und mit den neuen Werten initalisiert?


----------



## MrTroble (14. Mai 2015)

Hast du die Scene als Variable nach oben gemacht also

```
private static Scene scene
```
?
mach es am besten so

```
private static Stage st;
 public static void main(String[] args)
    {
        launch(args);
    }
private static Scene scene;
    final public int WIDTH = 600;
    final public int HEIGHT = 500;
    final public int VIERECKWEITE = 5;
    final public int VIERECKHOEHE = 5;
 
    public ArrayList<Viereck> vierecke = new ArrayList<Viereck>();
 
 
    @Override public void start(final Stage primaryStage)
    {
 
 
         Group root = new Group(); // hier group root fuer spaetere pane
 
 
 
// hier erstelle ich nur massenhaft Vierrecke und fuege sie ArrayList vierecke zu
 
        for (int i = 0; i < 4; i++) // hier die instanzen von Viereck erstellen u alles uebergeben
            vierecke.add(new Viereck(VIERECKWEITE, VIERECKHOEHE, WIDTH, HEIGHT));
 
 
 
// hier erstelle ich ein Vierreck, wenn ich auf es clicke, dann sollte es eigentlich ein anderes entfernen
// habe die Viereck testo nach oben eingefuehrt, hat auch nicht geholfen
 
 
        Viereck testo;
        testo = new Viereck(VIERECKWEITE, VIERECKHOEHE, WIDTH, HEIGHT);
 
 
        testo.setOnMouseClicked(
                new EventHandler<MouseEvent>() {
 
 
                    @Override public void handle(MouseEvent e) {
 
     vierecke.remove(0);
     st.setScene(scene); 
 
                    }
                });
 
 
        vierecke.add(testo);
 
 
 
 
 
 
 
 
 
        Viereck test5;
        test5 = new Viereck(VIERECKWEITE, VIERECKHOEHE, WIDTH, HEIGHT);
 
        vierecke.add(test5);
 
 
 
 
// hier der pane hinzufuegen etc .. 
 
 
root.getChildren().addAll(vierecke);
 
 
 
st = primaryStage; 
scene = new Scene(root, WIDTH, HEIGHT);
st.setTitle("Voller Vierecke");
st.setScene(scene);
st.show();
 
 
 
 
    }
```


----------



## MrTroble (14. Mai 2015)

MrTroble hat gesagt.:


> Hatt es funktioniert?



und?


----------



## Nummer6800 (14. Mai 2015)

Funktioniert bei mir nicht. Aber egal. Ich werde erstmal Arrays etc. erstellen. Um die Sichtbarmachung kuemmere ich mich spaeter.

Viel wichtiger ist mir das hier. Da mache ich int j ganz oben in der Deklaration, weil er mir eine lokale Variable nicht bis nach unten weitergibt ... Dann kommt es immer zu einer Fehlermeldung. Ist das etwa verboten?


```
for (j = 0; j < 10; j++) {
			 vierecke.get(j).setOnMouseClicked(e -> buttonClick(j));			
			
			 root.getChildren().add(vierecke.get(j));
			
		    }
```


----------

