Ajouter un Gestionnaire d'événements pour ImageView contenues dans TilePane contenues dans VBox?
J'ai le schéma suivant:
- Une VBox, contenant une HBox et un TilePane.
Dans HBox sont les boutons, les étiquettes et les champs de texte.
Chaque fois que je clique sur la racine (HBox), je me dois d'ajouter une ImageView à la tuile volet. Cette ImageView shold contenir une image (exemple: "2.jpg"). Maximum de la tuile volet de composants est de 5.
Chaque fois que je clique sur l'image, je doit charger une nouvelle image à l'cliqué ImageView, exemple "1.jpg". Il n'est pas de travail. Lorsque je clique sur mon image, c'est comme je suis en cliquant sur la racine de sorte qu'il crée une autre cellule de TilePane. Voici le code, pouvez-vous m'aider?
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package dadao1;
import java.util.HashSet;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.TilePane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
/**
*
* @author Ambra
*/
public class Dadao1 extends Application {
VBox root;
HashSet dadi = new HashSet();
//static int numeroDadi = 0;
@Override
public void start(Stage primaryStage) {
setGui();
Scene scene = new Scene(root, 300, 300);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
/**
*This private method sets up the GUI.
* No parameters are required
*/
private void setGui(){
root = new VBox();
HBox buttons = new HBox();
final Button newGame = new Button("New Game");
final Button print = new Button("Print");
final Button animation = new Button("Moving");
animation.addEventHandler(ActionEvent.ACTION, new EventHandler<ActionEvent>() {
//this button is labeled "Moving" at the begin. If pressed it changes its label to "Dissolving" and viceversa.
@Override
public void handle(ActionEvent event) {
if (animation.getText().equals(new String("Moving")))
animation.setText("Dissolving");
else animation.setText("Mooving");
}
});
final Label score = new Label("Total");
final TextField points = new TextField();
final Label pointsLabel = new Label("Score");
root.setStyle("-fx-background-color: green");
buttons.getChildren().addAll(newGame,print,animation,score,points,pointsLabel);
final TilePane dadiPane = new TilePane();
dadiPane.setVgap(10);
dadiPane.setHgap(10);
root.getChildren().addAll(buttons, dadiPane);
root.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
if(dadi.size()<5){
System.out.println("Adding img");
final ImageView img = new ImageView("2.jpg");
//should I put final in front of ImageView?
img.addEventHandler(ActionEvent.ACTION, new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
//I want that when a tile is pressed an event occours.
//that event should be "add a new image to the ImageView just clicked",
//for example: img is not "2.jpg" but "3.jpj", by the way, I'm not able neither
//to to print the folowing messagge :(
//It's like my root is pressed even if my mouse ha clicked at the image in img var.
System.out.println("Tile pressed ");
}
});
dadi.add(img);
dadiPane.getChildren().add(img);
}else System.out.println("You cannot create more than 5 dices");
}
});
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
Essayez d'ajouter le eventListenet à l'ImageView au lieu de la racine de
J'ai du ajouter un EventHandlet à la fois parce qu'ils ont à faire des choses différentes: racine devez ajouter une ImageView à la Tuile volet lorsqu'il est cliqué et ImageView doit changer l'image quand on clique dessus.
J'ai du ajouter un EventHandlet à la fois parce qu'ils ont à faire des choses différentes: racine devez ajouter une ImageView à la Tuile volet lorsqu'il est cliqué et ImageView doit changer l'image quand on clique dessus.
OriginalL'auteur bog | 2014-08-28
Vous devez vous connecter pour publier un commentaire.
ImageView
s ne génèrent pas deActionEvent
s; il n'est donc pas surprenant que votre gestionnaire d'événement n'est jamais invoquée. Depuis l'événement de la souris n'est pas traité par leImageView
, il se propage jusqu'au conteneur.Essayer
method addEventHandler in class Node cannot be applòied to given types; required: EventType<T>, EventHandler<? super T>; found: EventType<T>, <anonymous EventHandler<ActionEvent>>
Je pense que je l'ai résolu en mettant "new EventHandler<MouseEvent> ()" à la place de
new EventHandler<ActionEvent>()
. Edit: ça fonctionne, mais il appelle à la fois:img
'événement etroot
'événement.Oui, faute de frappe... Désolé. Pour empêcher l'événement de se propageant jusqu'à la
HBox
une fois que vous avez traitée, elle, appelevent.consume();
. J'ai corrigé le code (la typo et l'appel supplémentaire).Il fonctionne! Merci
OriginalL'auteur James_D
@James_D est correcte; mais remarque pour Java 8, vous pouvez utiliser la syntaxe plus simple:
OriginalL'auteur simpleuser
Noter que
MouseEvent.MOUSE_CLICKED
est une classe de javafx, pas dejava.awt.event
paquetPour quelqu'un qui à tort
import java.awt.event.MouseEvent
classeOriginalL'auteur nokieng