javaFX:TableView的cellvalue不足以在列中显示,它将被剪切到'...'结尾,如何在这样的单元格上显示提示? 我需要一个提示,因为有时我不能拖动colunm的头。所以我看不到细胞的全部内容。
答案 0 :(得分:2)
TableCell的子类下面用于设置单元格的ToolTip。它不区分文本适合的单元格和文本太大的单元格。它在单元格工厂中用于表格列。
import javafx.application.Application;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.Tooltip;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Callback;
public class SO extends Application {
static class XCell extends TableCell<String, String> {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
this.setText(item);
this.setTooltip(
(empty || item==null) ? null : new Tooltip(item));
}
}
@Override
public void start(Stage primaryStage) throws Exception {
StackPane pane = new StackPane();
Scene scene = new Scene(pane, 300, 100);
primaryStage.setScene(scene);
ObservableList<String> list = FXCollections.observableArrayList(
"Short",
"This is quite long - almost very long");
TableView<String> tv = new TableView<>(list);
TableColumn<String, String> col = new TableColumn<>("Column");
col.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<String,String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(CellDataFeatures<String, String> param) {
return new ReadOnlyStringWrapper(param.getValue());
}
});
col.setMaxWidth(50);
col.setCellFactory(new Callback<TableColumn<String,String>, TableCell<String,String>>() {
@Override
public TableCell<String, String> call(TableColumn<String, String> param) {
return new XCell();
}
});
tv.getColumns().add(col);
pane.getChildren().add(tv);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
结果如下:
答案 1 :(得分:0)
这应该可以实际解决您的问题。
column.setCellFactory(col -> new TableCell<Object, String>()
{
@Override
protected void updateItem(final String item, final boolean empty)
{
super.updateItem(item, empty);
setText(item);
TableColumn tableCol = (TableColumn) col;
if (item != null && tableCol.getWidth() < new Text(item + " ").getLayoutBounds().getWidth())
{
tooltipProperty().bind(Bindings.when(Bindings.or(emptyProperty(), itemProperty().isNull())).then((Tooltip) null).otherwise(new Tooltip(item)));
} else
{
tooltipProperty().bind(Bindings.when(Bindings.or(emptyProperty(), itemProperty().isNull())).then((Tooltip) null).otherwise((Tooltip) null));
}
}
});