javafx динамически добавляет всплывающую подсказку к каждому столбцу - PullRequest
0 голосов
/ 07 июня 2018

Я создал простой Tableview, в котором должны храниться заметки, все работает нормально, но я хочу добавить всплывающую подсказку к каждому столбцу.
Пример моего TableView

Как вы можетесмотреть дату, которая не помещается в ячейку, я хочу добавить всплывающую подсказку, если при наведении мыши на ячейку она должна появиться и показать всю строку.
В основном последние 3 ячейки (date, noteTitle, noteTags)в каждой строке должна быть всплывающая подсказка, потому что они могут переполниться.

Вычеркнуто из GUI-класса (создание табличного представления)

        //create TableCols
        TableColumn colorCol = new TableColumn<Rectangle, String>("C");
        colorCol.setMinWidth(30.0);
        colorCol.setMaxWidth(30.0);
        TableColumn prioCol = new TableColumn<Note, String>("priority");
        prioCol.setMinWidth(70.0);
        prioCol.setMaxWidth(70.0);
        TableColumn dateCol = new TableColumn<Note, String>("date");
        dateCol.setMinWidth(150.0);
        dateCol.setMaxWidth(150.0);
        TableColumn titleCol = new TableColumn<Note, String>("title");
        titleCol.setMaxWidth(150.0);
        titleCol.setMinWidth(150.0);
        TableColumn tagsCol = new TableColumn<Note, String>("tags");
        tagsCol.setMaxWidth(100.0);
        tagsCol.setMinWidth(100.0);
        fxListView.getColumns().addAll(colorCol, prioCol, dateCol, titleCol, tagsCol); //add cols to table. fxListView is the table

        colorCol.setCellValueFactory(new PropertyValueFactory<>("rect"));
        prioCol.setCellValueFactory(new PropertyValueFactory<>("priority"));
        dateCol.setCellValueFactory(new PropertyValueFactory<>("date"));
        titleCol.setCellValueFactory(new PropertyValueFactory<>("title"));
        tagsCol.setCellValueFactory(new PropertyValueFactory<>("tags"));
        DBManager temp = new DBManager(); 
        fxListView.setItems(temp.getTableData()); // this Method just returns a ObservableList<Note> with a few test datas.

Note-Class

  public class Note {
        private Rectangle rect;
        private String rectColorString;
        private String priority;
        private String date;
        private String title;
        private String note;
        private String tags;
        private String fontStyle;
        private int fontSize;

        public Note(String rectColorString, String priority,String title, String note,String tags, String fontStyle, int fontSize) {
            this.rectColorString = rectColorString;
            rect = new Rectangle(24, 24, Color.web(rectColorString));
            this.priority = priority;
            this.date =  new Date().toString();
            this.title = title;
            this.note = note;
            this.tags = tags;
            this.fontStyle = fontStyle;
            this.fontSize = fontSize;
        }
        public String getDate() {
            return this.date;
        }
        public Rectangle getRect() {
            return rect;
        }

        public void setRect(Rectangle rect) {
            this.rect = rect;
        }

        public String getRectColorString() {
            return rectColorString;
        }

        public void setRectColorString(String rectColorString) {
            this.rectColorString = rectColorString;
            this.rect = new Rectangle(24, 24, Color.web(rectColorString));
        }

        public String getPriority() {
            return priority;
        }

        public void setPriority(String priority) {
            this.priority = priority;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getNote() {
            return note;
        }

        public void setNote(String note) {
            this.note = note;
        }

        public String getTags() {
            return tags;
        }

        public void setTags(String tags) {
            this.tags = tags;
        }

        public String getFontStyle() {
            return fontStyle;
        }

        public void setFontStyle(String fontStyle) {
            this.fontStyle = fontStyle;
        }

        public int getFontSize() {
            return fontSize;
        }

        public void setFontSize(int fontSize) {
            this.fontSize = fontSize;
        }
    }

Вот еще одна картинка о том, как я хочу, чтобы всплывающие подсказкипоявляются (если мое объяснение недостаточно ясно) Результат

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Добавьте Tooltip к ячейке, а не TableColumn.

public class CustomTableCell extends TableCell<Note, String>() {

    private final Tooltip tooltip = new Tooltip();

    public CustomTableCell() {
        tooltip.textProperty().bind(itemProperty());
    }

    @Override
    protected void updateItem(String item, boolean emtpy) {
        super.updateItem(item, empty);
        if (empty || item == null) {
            setText(null);
            setTooltip(null); // so an empty cell doesn't display a Tooltip
        } else {
            setText(item);
            setTooltip(tooltip);
        }
    }
}

Затем установите фабрику ячейки на TableColumn, используя column.setCellFactory(Callback).

Редактировать:

Ответ , данный fabian , также учитывает, отображается ли весь элемент перед добавлением Tooltip.

.
0 голосов
/ 07 июня 2018

Это необходимо сделать с помощью пользовательской реализации TableCell.Возвратите такую ​​реализацию из cellFactory столбцов:

public class TooltipTableCell<S, T> extends TableCell<S, T> {

    private final Tooltip tooltip = new Tooltip();
    private final Text measureText = new Text();
    private Node textDisplay;
    private final InvalidationListener listener = o -> {
        setTooltip((measureText.getBoundsInLocal().getWidth() > textDisplay.getBoundsInLocal().getWidth()) ? tooltip : null);
    };

    @Override
    protected void layoutChildren() {
        super.layoutChildren();

        measureText.boundsInLocalProperty().addListener(listener);
        Node oldTextDisplay = textDisplay;
        textDisplay = lookup("LabeledText"); // lookup node displaying the text via CSS

        if (oldTextDisplay != textDisplay) {
            if (oldTextDisplay != null) {
                oldTextDisplay.boundsInLocalProperty().removeListener(listener);
            }
            textDisplay.boundsInLocalProperty().addListener(listener);
            listener.invalidated(null);
        }
    }

    @Override
    protected void updateItem(T item, boolean empty) {
        super.updateItem(item, empty);

        String newText = empty || item == null ? "" : item.toString();
        setText(newText);
        tooltip.setText(newText);
        measureText.setText(newText);
    }

    public static <E, F> Callback<TableColumn<E, F>, TableCell<E, F>> forTableColumn() {
        return column -> new TooltipTableCell<>();
    }

}
titleCol.setCellFactory(TooltipTableCell.forTableColumn());

Обратите внимание, что не имеет смысла указывать параметры типа в конструкторе, но не при объявлении переменной.Лучше указать его в объявлении и использовать оператор diamond в вызове конструктора:

TableColumn<Note, String> dateCol = new TableColumn<>("date");

(Это приведет к ошибке времени компиляции для colorCol, если объявление fxListView содержит параметр типа.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...