TreeItem contenente oggetti non String che mostrano testo strano

3

Ciao community di StackExchange! Questo è il mio primo post e apprezzo qualsiasi aiuto che chiunque può offrire. Sono nuovo di Java, e sono sicuro che questo problema è semplicemente dovuto al mio fraintendimento dei fondamenti.

Ho una finestra JavaFX (Java 8) con una TreeView riempita con TreeItems contenente un oggetto Product . Questo oggetto ha molti campi, uno dei quali è model di tipo String. Quando aggiungo un TreeItem, desidero che esso non solo memorizzi l'oggetto Product ma visualizzi anche il campo String model nell'elenco TreeView; tuttavia, ottengo questo: com.[company name].Products.Product@[number] . Questo è il percorso del pacchetto per la classe Product . [number] è una stringa casuale di ciò che sembra essere 8 caratteri esadecimali che è univoco per ogni istanza.

Gli TreeItem vengono aggiunti tramite un metodo di classe e sospetto che sia il mio problema. Ecco un elenco del flusso corretto:

  1. Fai clic sul pulsante "Aggiungi prodotto".
  2. Apri la finestra a comparsa.
  3. Seleziona il modello appropriato.
  4. Fai clic su OK.
  5. Product oggetto viene aggiunto al TreeView tramite il metodo makeTreeItem (vedi sotto).
  6. Nuovo TreeItem dovrebbe mostrare il modello che è una stringa.

Esempio di lavoro minimo:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class TreeItemTest extends Application {

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

    @Override public void start(Stage primaryStage) {
        TreeItem<Product> rootTree = new TreeItem<>(new Product("root"));
        TreeView<Product> treeView = new TreeView<>(rootTree);
        treeView.setShowRoot(false);

        BorderPane rootPane = new BorderPane();
        rootPane.setCenter(treeView);

        makeTreeItem("New Item 1", rootTree);
        makeTreeItem("New Item 2", rootTree);

        Scene scene = new Scene(rootPane);

        primaryStage.setScene(scene);
        primaryStage.setTitle("Tree Item Test");
        primaryStage.show();
    }

    private TreeItem<Product> makeTreeItem(String title, TreeItem<Product> parent) {
        TreeItem<Product> newItem = new TreeItem<>(new Product(title));
        newItem.setExpanded(true);
        parent.getChildren().add(newItem);
        return newItem;
    }
}

Entrambi i "nuovi elementi" si mostrano semplicemente come Product@######## (ricorda che i simboli di hash sono caratteri esadecimali). La classe del prodotto:

public class Product {
    String model;
    public Product(String model) {
        this.model = model;
    }
}

Ho il sospetto che quello che sto cercando sia un CellFactory di qualche tipo, simile al CellFactory di TableView. Per quanto possa sembrare difficile, non riesco a trovare nulla di molto promettente per la vita di me. Aiuto! Cosa mi manca?!

    
posta Josh Jennings 03.02.2016 - 21:47
fonte

1 risposta

4

"New Items" simply show up as Product@########

È normale. Il metodo toString () predefinito viene richiamato.

Invocare il metodo toString () su un oggetto restituisce una stringa che descrive questo oggetto. Per impostazione predefinita, restituisce una stringa composta dal nome classe di cui l'oggetto è un'istanza di, un simbolo at (@) e l'indirizzo di memoria dell'oggetto in notazione esadecimale.

Pertanto, è necessario sovrascrivere il metodo toString () nella classe Product.

Nel tuo caso potresti aggiungere:

@Override
public String toString() {
    return this.model;
}

Pertanto, la tua classe di prodotto dovrebbe apparire così:

public class Product {
    String model;
    public Product(String model) {
        this.model = model;
    }

    @Override
    public String toString() {
        return this.model;
    }
}

Ora, i tuoi "Nuovi elementi" non verranno visualizzati come Product@######## , ma verranno visualizzati in base a come si implementa il metodo toString () (che si sovrascrive) nella classe Product.

    
risposta data 04.02.2016 - 14:50
fonte

Leggi altre domande sui tag