Exception in thread "JavaFX Application Thread" [Résolu/Fermé]

Signaler
Messages postés
180
Date d'inscription
samedi 22 novembre 2003
Statut
Membre
Dernière intervention
25 juin 2017
-
Messages postés
592
Date d'inscription
vendredi 7 août 2009
Statut
Membre
Dernière intervention
3 juin 2017
-
Bonjour,
J'ai une comboBox que je remplie avec des splitPane (pour avoir des icons devant les items). Tout se déroule correctement jusqu'au moment ou je click sur un item...
J'obtiens alors une exception: Exception in thread "JavaFX Application Thread" java.lang.NullPointerException etc.
Ci-dessous le code en espérant que quelqu'un ait déjà eu le problème (et l'ait corrigé!):

//comboBox
 
ComboBox<SplitPane> myComboBox = new ComboBox<SplitPane>();
myComboBox.setLayoutX(491.0);
myComboBox.setLayoutY(382.0);
myComboBox.setPrefWidth(176.5);
 
 
//liste d'items  (ComBoxItemPerso est une classe avec des variables et les propriétés qui vont avec)
//une variable "nomItem" par exemple "1" ou "2" etc
//une variable "urlIcon" par exemple "application/1.png" etc.
 
ObservableList<ComBoxItemPerso> options = FXCollections.observableArrayList(new ComBoxItemPerso("1", "application/1.png"), new ComBoxItemPerso("2", "application/2.png"), new ComBoxItemPerso("3", "application/3.png"));	
SplitPane splitItem;
Label rightLabel;		
ImageView leftImage;
 
for(ComBoxItemPerso cIP: options)
{
	splitItem = new SplitPane();
	rightLabel = new Label();
	leftImage = new ImageView();
 
	splitItem.setOrientation(Orientation.HORIZONTAL);
	splitItem.setPrefHeight(25);
 
	rightLabel.setText(cIP.getNomItem());                             //propriété qui récupère le nom de l'item (classe ComBoxItemPerso)
	rightLabel.setOnMousePressed(this::itemClickEvent);
	leftImage.setImage(new Image(cIP.getUrlIcon()));	        //propriété qui récupère l'url de l'icon de l'item (classe ComBoxItemPerso)			
	splitItem.getItems().addAll(leftImage, rightLabel);
	myComboBox.getItems().add(splitItem);
}
 
root.getChildren().add(myComboBox);           //Group root = FXMLLoader...
 
 
//Evènement
 
protected void itemClickEvent(MouseEvent event)
{		
	Label l = (Label)event.getSource();
        //println(...); //fonctionne très bien	
	detailsTextField.setText(l.getText());	//exception ic!!!
}


Merci d'avance!
Bon week-end!



--

2 réponses

Messages postés
592
Date d'inscription
vendredi 7 août 2009
Statut
Membre
Dernière intervention
3 juin 2017
87
Hello,

Ton objet Label est null, surement un probléme de cast, essai ceci :

protected void itemClickEvent(MouseEvent event)
 {  
  String l = event.getSource().toString();
  detailsTextField.setText(l);
 }


En espérant t'avoir aider
Greg
Messages postés
180
Date d'inscription
samedi 22 novembre 2003
Statut
Membre
Dernière intervention
25 juin 2017
2
Re,
Merci pour ton aide... En fait j'ai posté sur toute une série de forum et on m'avait déjà envoyé une solution!
Désolé pour le retard!

Je poste d'ailleurs le code:

package combotest;
 
import javafx.application.Application;
import javafx.beans.InvalidationListener;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.SplitPane;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
 
public class Main extends Application {
 
    private static final class ComBoxItemPerso {
 
        private final String value;
        private final Image icon;
 
        public ComBoxItemPerso(final String value, final String iconUrl) {
            this.value = value;
            this.icon = new Image(iconUrl);
        }
 
        public String getValue() {
            return value;
        }
 
        public Image getIcon() {
            return icon;
        }
    }
 
    private static final class ComBoxItemPersoListCell extends ListCell<ComBoxItemPerso> {
 
        private final ComboBox<ComBoxItemPerso> parent;
        private final Label rightLabel = new Label();
        private final ImageView leftImage = new ImageView();
        private final SplitPane splitPane = new SplitPane(leftImage, rightLabel);
 
        public ComBoxItemPersoListCell(final ComboBox<ComBoxItemPerso> parent) {
            super();
            // Oblige de rajouter tout ce qui suit a cause du splitpane.
            this.parent = parent;
            leftImage.setOnMousePressed(this::selectInCombo);
//            rightLabel.setStyle("-fx-border-color: green;");
            rightLabel.setMaxWidth(Double.MAX_VALUE);
            rightLabel.setOnMousePressed(this::selectInCombo);
        }
 
        private ComBoxItemPerso lastItem;
 
        @Override
        protected void updateItem(final ComBoxItemPerso item, final boolean empty) {
            super.updateItem(item, empty);
            lastItem = item;
            Node graphic = null;
            leftImage.setImage(null);
            rightLabel.setText(null);
            if (!empty && item != null) {
                leftImage.setImage(item.getIcon());
                rightLabel.setText(item.getValue());
                graphic = splitPane;
            }
            setGraphic(graphic);
            setText(null);
        }
 
        private void selectInCombo(final MouseEvent mouseEvent) {
            if (parent != null) {
                parent.getSelectionModel().select(lastItem);
            }
        }
    }
 
    private final TextField detailsTextField = new TextField();
    private final ComboBox<ComBoxItemPerso> myComboBox = new ComboBox<>();
 
    @Override
    public void start(Stage primaryStage) {
        detailsTextField.setEditable(false);
        //comboBox        
        myComboBox.setPrefWidth(176.5);
        final ObservableList<ComBoxItemPerso> options = FXCollections.observableArrayList(new ComBoxItemPerso("1", getClass().getResource("1.png").toExternalForm()),
                new ComBoxItemPerso("2", getClass().getResource("2.png").toExternalForm()),
                new ComBoxItemPerso("3", getClass().getResource("3.png").toExternalForm()));
        myComboBox.setItems(options);
        myComboBox.setButtonCell(new ComBoxItemPersoListCell(null));
        myComboBox.setCellFactory(listView -> new ComBoxItemPersoListCell(myComboBox));
        myComboBox.valueProperty().addListener(valueInvalidationListener);
        final StackPane center = new StackPane();
        center.getChildren().add(myComboBox);
        final BorderPane root = new BorderPane(center, detailsTextField, null, null, null);
        final Scene scene = new Scene(root, 300, 250);
        primaryStage.setTitle("Test");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
 
    private final InvalidationListener valueInvalidationListener = observable -> {
        final ComBoxItemPerso item = myComboBox.getValue();
        final String text = (item == null) ? null : item.getValue();
        detailsTextField.setText(text);
    };
 
    public static void main(String[] args) {
        launch(args);
    }
 
}


--
Messages postés
592
Date d'inscription
vendredi 7 août 2009
Statut
Membre
Dernière intervention
3 juin 2017
87
L'essentiel est que tu ai une solution :)