JavaFX JAVAFX TreeItem mit Tooltip versehen

macaubas

Mitglied
Hallo Forum-Teilnehmer.
Ich möchte in einer TreeView alle TreeItems mit jeweils einem Tooltip versehen. Irgendwie muss das mit CellFactory gehen, aber ich habe alles erdenkliche schon ausprobiert. Ich lese die ganze TreeView/TreeItem aus einer Datenbank, das alles geht problemlos. Mein Beispiel ist somit nur für Testzwecke für mein Problem.
Ich benutze Netbeans11.2 und JAVA13.
Ich bin für jede Antwort dankbar.
 

Anhänge

Java:
package CADM;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.control.Tooltip;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.util.Callback;

public class SML_TSTController implements Initializable {

    @FXML
    private AnchorPane AP;
    @FXML
    private TreeView<DUO> TreeViewS;
    @FXML
    private Label Wert;
    public String SavWert = null;
    public TreeCell<DUO> TreeCellSav = null;

//----------------------------class DUO
    public class DUO {

        private String code;
        private String name;

        public DUO() {
        }

        public DUO(String code, String name) {
            this.code = code;
            this.name = name;
        }

        public String getCode() {
            return code;
        }

        public void setCode(String code) {
            this.code = code;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return this.name;
        }
    }
//----------------------------init

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        loadTreeItems_DUO("w1", "w2", "w3");
        int i = 0;
    }
//-------------------------loadTreeItems

    public void loadTreeItems_DUO(String... rootItems) {  //ist nur ein Test
        TreeItem<DUO> root = new TreeItem<DUO>(new DUO("DUOroot", "DUO"));
        TreeItem<DUO> A1 = new TreeItem<DUO>(new DUO("Zw", "Wid"));
        TreeItem<DUO> A2 = new TreeItem<DUO>(new DUO("Zc", "Cons"));
        TreeItem<DUO> A3 = new TreeItem<DUO>(new DUO("Zi", "IC"));
        root.setExpanded(true);
        root.getChildren().add(A1);
        root.getChildren().add(A2);
        A1.getChildren().add(A3);

//-- -- -- -- -- -- -- -- -- -- -- --- // Set Cell Factory.
        TreeViewS.setCellFactory(new Callback<TreeView<DUO>, TreeCell<DUO>>() {
            @Override
            public TreeCell<DUO> call(TreeView<DUO> p) {
                TreeCell<DUO> TST = new TextFieldTreeCellImpl();
                if (SavWert != null) {
                    if (TST.getTooltip() == null) {
                        Tooltip T = new Tooltip(SavWert);
                        TST.setTooltip(T);
                    }
                }
                int i = 0;
                return TST;
                //return new TextFieldTreeCellImpl();
            }
        });

        TreeViewS.setRoot(root);
        TreeViewS.setOnMouseClicked(Mevent);
    }
    
//----------------------Event-Handler       
    EventHandler<MouseEvent> Mevent = (MouseEvent evt) -> {
        if (((TreeView<String>) evt.getSource()).getSelectionModel().getSelectedItem() != null) {
            String EZG = ((TreeView<DUO>) evt.getSource()).getSelectionModel().getSelectedItem().getValue().getCode();
            Wert.setText(EZG);
            int i = 0;
        }
        int i = 0;
    };

//-------------------class TextFieldTreeCellImpl
    private final class TextFieldTreeCellImpl extends TreeCell<DUO> {

        private TextField textField;

        public TextFieldTreeCellImpl() {
        }

        @Override
        public void startEdit() {
            super.startEdit();
            if (textField == null) {
                //createTextField();
            }
            setText(null);
            setGraphic(textField);
            textField.selectAll();
        }

        /*        @Override
        public void cancelEdit() {
            super.cancelEdit();
            setText((DUO) getItem().getName());
            setGraphic(getTreeItem().getGraphic());
        }*/
        @Override
        public void updateItem(DUO item, boolean empty) {
            super.updateItem(item, empty);
            if (empty) {
                setText(null);
                setGraphic(null);
                //SavWert = null;
            } else {
                if (isEditing()) {
                    if (textField != null) {
                        textField.setText(getString());
                    }
                    setText(null);
                    setGraphic(textField);
                } else {
                    setText(item.getName() + "_b");
                    SavWert = item.getCode();
                    System.out.println(item.getCode() + "," + item.getName());
                    setGraphic(getTreeItem().getGraphic());
                    int i = 0;
                }
            }
        }
        private String getString() {
            return getItem() == null ? "" : getItem().toString();
        }
    }
}
 
Ich habe nun soeben noch meinen JAVA-Code und hier meinen fxml-Code geladen.
XML:
<AnchorPane fx:id="AP" maxHeight="700.0" maxWidth="700.0" minHeight="0.0" minWidth="0.0" prefHeight="700.0" prefWidth="700.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="CADM.SML_TSTController">
    <children>
        <Label fx:id="Wert" layoutX="49.0" layoutY="233.0" prefHeight="53.0" prefWidth="284.0" text="Label" textFill="RED">
         <font>
            <Font size="36.0" />
         </font></Label>
      <TreeView fx:id="TreeViewS" layoutX="156.0" layoutY="59.0" prefHeight="160.0" prefWidth="179.0" />
    </children>
</AnchorPane>
 
In updateItem kannst du den Inhalt des Tooltips aktuell halten. Ich weiß nicht, ob es schöner geht, aber es funktioniert.

Java:
...
TreeViewS.setCellFactory(v -> new TextFieldTreeCellImpl());
...
private final class TextFieldTreeCellImpl extends TreeCell<DUO> {

   ...

    public TextFieldTreeCellImpl() {
        setTooltip(getTooltip() == null ? new Tooltip() : getTooltip());
    }

    ...

    @Override
    public void updateItem(DUO item, boolean empty) {
        super.updateItem(item, empty);
        ...
        getTooltip().setText(getText());
    }

    ...
}
 

Neue Themen


Zurück
Oben