Javafx ListView kann nicht gefüllt werden.

Diskutiere Javafx ListView kann nicht gefüllt werden. im Java Basics - Anfänger-Themen Bereich.
T

Totti-1987

Hallo zusammen ich bin neu hier und arbeite noch nicht lange mit Java, ich bräuchte einmal Hilfe beim füllen einer ListView (JavaFx). Ich kann die Items weder mit setIems noch mit der Funktion getItems.add hinzufügen.

Code:
    @FXML
    private ListView<String> groundView;
    
    
    ObservableList<String> list = FXCollections.observableArrayList();
    list.removeAll(list);
    list.add("Text1");
    list.add("Text2");
    list.add("Text3");
    groundView.setItems(list);
Würde mich über etwas Hilfe freuen :)

Vielen Dank und Viele Grüße

Totti
 
J

JustNobody

Kannst du das Problem noch im Detail beschreiben? Was passiert bzw. passiert nicht? Die Ausschnitte sehen ok aus auf den ersten Blick. Evtl. mal die ganze Klasse zeigen und das fxml.
 
T

Totti-1987

Hallo JustNobody,

danke schon einmal für die Antwort, die Anwendung bricht beim Setzen der ListView mit einer NullPointerException ab.

Hier noch ein paar mehr Informationen:

Code:
package application;

import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.ListView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.stage.FileChooser;
import javafx.stage.Stage;

public class ControllerGrounds {

    @FXML private BorderPane mainPane;
    @FXML private ListView<String> groundView;
    
    public void importOpenFileTapped(ActionEvent event) {
        FileChooser fileChooser = new FileChooser();
        fileChooser.setTitle("Import File");
        Stage ChooseStage = new Stage();
        File file = fileChooser.showOpenDialog(ChooseStage);
        if (file != null && file.getName().toLowerCase().endsWith("csv")) {
            ImportGroundsCsv newImport = new ImportGroundsCsv(file);
            try {
                try {
                    newImport.importGroundsFromCsV();
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            Alert alert = new Alert(AlertType.ERROR);
            alert.setTitle("Import File");
            alert.setHeaderText("Error:");
            alert.setContentText("Not a valid CSV-File!");
            alert.show();
        }
        
    }
    
    public void showGroundsButton(ActionEvent event) throws IOException {
        
        Pane groundsPane = FXMLLoader.load(getClass().getResource("UiGrounds.fxml"));
        
        ObservableList<String> list = FXCollections.observableArrayList();
        list.removeAll(list);
        list.add("Text1");
        list.add("Text2");
        list.add("Text3");
        groundView.setItems(list);
        
        mainPane.setCenter(groundsPane);
        
    }
    
    public void showMatchesButton(ActionEvent event) {
        
    }
    
    public void showTeamsButton(ActionEvent event) {
        
    }
    
    public void showImportButton(Event event) throws IOException {
        Pane load = FXMLLoader.load(getClass().getResource("UiLoad.fxml"));
        mainPane.setCenter(load);
        
    }

}
Code:
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.ListView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.VBox?>

<AnchorPane xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.ControllerGrounds">
   <children>
      <VBox prefHeight="400.0" prefWidth="600.0" style="-fx-background-color: beige;">
         <children>
            <ListView fx:id="groundView" prefHeight="400.0" prefWidth="600.0" />
         </children>
      </VBox>
   </children>
</AnchorPane>
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException


at javafx.fxml/javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1787)


at javafx.fxml/javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1670)


at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)


at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)


at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)


at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)


at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)


at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)


at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)


at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)


at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)


at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)


at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)


at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)


at javafx.base/javafx.event.Event.fireEvent(Event.java:198)


at javafx.graphics/javafx.scene.Node.fireEvent(Node.java:8865)


at javafx.controls/javafx.scene.control.Button.fire(Button.java:200)


at javafx.controls/com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:206)


at javafx.controls/com.sun.javafx.scene.control.inputmap.InputMap.handle(InputMap.java:274)


at javafx.base/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)


at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)


at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)


at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)


at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)


at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)


at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)


at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)


at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)


at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)


at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)


at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)


at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)


at javafx.base/javafx.event.Event.fireEvent(Event.java:198)


at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Scene.java:3876)


at javafx.graphics/javafx.scene.Scene$MouseHandler.access$1300(Scene.java:3604)


at javafx.graphics/javafx.scene.Scene.processMouseEvent(Scene.java:1874)


at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2613)


at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:397)


at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)


at java.base/java.security.AccessController.doPrivileged(Native Method)


at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:434)


at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)


at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:433)


at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(View.java:556)


at javafx.graphics/com.sun.glass.ui.View.notifyMouse(View.java:942)


at javafx.graphics/com.sun.glass.ui.mac.MacView.notifyMouse(MacView.java:127)


Caused by: java.lang.reflect.InvocationTargetException


at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)


at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)


at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)


at java.base/java.lang.reflect.Method.invoke(Method.java:564)


at com.sun.javafx.reflect.Trampoline.invoke(MethodUtil.java:76)


at jdk.internal.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)


at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)


at java.base/java.lang.reflect.Method.invoke(Method.java:564)


at javafx.base/com.sun.javafx.reflect.MethodUtil.invoke(MethodUtil.java:275)


at javafx.fxml/com.sun.javafx.fxml.MethodHelper.invoke(MethodHelper.java:83)


at javafx.fxml/javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1782)


... 45 more


Caused by: java.lang.NullPointerException


at application.ControllerGrounds.showGroundsButton(ControllerGrounds.java:70)
 
J

JustNobody

Kannst Du noch die Zeile 70 markieren in ControllerGrounds.java?

Wenn ich vermuten müsste, dürfte es
mainPane.setCenter(groundsPane);
sein.
mainPane ist null, weil in deinem fxml keine mainPane enthalten ist. Wenn du die AnchorPane aus dem fxml darüber kriegen willst, dann sollte da wohl noch ein fx:id="mainPane" als Attribut dazu.

Aber ich bin kein javaFX Profi - das ist ein Themengebiet als BackEnd Entwickler, das man nur selten streift. Aber das wäre mein aktuelles Verständnis der Problematik.
 
T

Totti-1987

Bei der Zeile handelt es sich um die Zeile:
groundView.setItems(list);

Die mainPane ist in einer anderen fxml Datei erstellt worden und im Center sollen halt verschiedene andere Panes, welche in weiteren fxml files gestaltet werden eingeblendet werden. Dies funktioniert aber grundsätzlich, beispielsweise bei der Funktion showImportButton. Die Problematik scheint also wirklich beim füllen der Liste zu liegen und nicht bei der Anzeige der Objekte. Wobei ich das wirklich nicht verstehe weil ich das Füllen der Liste ja hier schon auf das absolute Minimum beschränkt habe.
 
J

JustNobody

Dann ist das Problem, dass die groundView null ist.

Also scheint da das automatische Laden nicht korrekt zu sein. Wie wird das denn geladen? Wenn du ein anderes fxml hast, in dem die mainPane enthalten ist, dann basiert der Controller darauf beim laden? So dass die groundsPane nicht bekannt ist?

Wenn das alles dynamisch ist, dann ist statt diesem Autowire durch @FXML evtl. ein lookup Aufruf notwendig?

Kannst Du da evtl. ein kleines, compilierbares Beispiel erstellen, das die Problematik aufzeigt? Dann wäre eine Analyse auf meiner Seite denkbar. Aber so mit den kleinen Ausschnitten ist es ein raten, was wieso schief läuft ...
 
T

Totti-1987

Der Sinn der mehreren fxml Dateien liegt darin das die MainPane, eine BorderPane ist in der oben lediglich ein paar Buttons sind, dies soll quasi als Menü fungieren. Im Center sollen dann die Panes aus den anderen fxml eingeblendet werden. Das einblenden der Panes klappt grundsätzlich, z.B. bei dem anderen Button (Import) oder wenn ich das Füllen der Liste auskommentiere (auch die leere Liste ist dann sichtbar).

Da es sich insgesamt nur um ein kleines private Projekt handelt habe ich mal den Projektorder angefügt.

Viele Dank für deine Mühe.

Viele Grüße

Totti
 

Anhänge

Thema: 

Javafx ListView kann nicht gefüllt werden.

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben