我正在尝试调整特定cell
中TableView
中特定Row
的尺寸。
我使用的代码,
import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.stage.Stage;
import javafx.util.Callback;
public class TableColors extends Application {
TableView<String> tView = new TableView<>();
@Override
public void start(Stage primaryStage) {
TableColumn<String, String> tcName = new TableColumn("name");
TableColumn<String, String> tcName1 = new TableColumn("name1");
ObservableList<String> items = FXCollections.observableArrayList("One", "Two", "Three", "Four");
tView.setItems(items);
tView.getColumns().add(tcName);
tView.getColumns().add(tcName1);
tView.setColumnResizePolicy((param) -> true);
Platform.runLater(() -> customResize());
tcName.setCellValueFactory((p) -> new SimpleStringProperty(p.getValue()));
tcName.setCellFactory(new Callback<TableColumn<String, String>, TableCell<String, String>>() {
@Override
public TableCell call(TableColumn p) {
return new TableCell<String, String>() {
@Override
public void updateItem(final String item, final boolean empty) {
super.updateItem(item, empty);//*don't forget!
if (item != null) {
setText(item);
setAlignment(Pos.CENTER);
} else {
setText(null);
}
}
};
}
});
Scene scene = new Scene(tView, 300, 250);
primaryStage.setScene(scene);
primaryStage.show();
}
private void customResize() {
try {
TableColumn<?, ?> col = tView.getColumns().get(0);
col.setPrefWidth(150);
} catch (Exception r) {
r.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
当我运行这个完整的name
列时,大小会增加(正如预期的那样)。
相反,我想只增加包含“三”的单元格的大小。
我不确定,我应该使用什么代码来使其以这种方式工作。
我该如何解决这个问题?
答案 0 :(得分:0)
你可以试试这个逻辑
让您的单元格DataHolder实现类似这样的
public class DataHolder{
boolean cellOverlaps = false; //tells the cell whether its string overlaps others
int rowPos = -1;// the vertical position
int columnPos =-1; //its column position
boolean startPoint = false;//whether its the start point
//in other words it begins from here hence its right border we care
String text = ""
}
所以你基本上做的是,在你的updateIndex()
或updateItem()
方法或你的单元格的Commit()
方法中,(使用commit())你计算单元格的宽度在Cell.prefWidth(-1)
或Cell.getWidth()
之后,当您获得文本占据第一个单元格的空间后,将其与宽度进行比较(如果&gt;然后你修剪文本并使其重叠。在这里你有类似的东西
dataHolder.cellOverlaps = true;
dataHolder.startPoint = true;//other overlapping cell will have this false
dataHolder.rowPost = getIndex();
dataHolder.columnPos = getTableView().getColumns().indexof(getTableColumn());
所以现在使用columnPos&gt;查找行getIndex()
中的单元格startPoint
并且您更改单元格的样式,例如具有透明边框右侧颜色的起始单元格
-fx-border-color: black black black transparent;
现在另一个重叠的celss将具有左透明
-fx-border-color: black transparent black black;
并将剩余字符串的文本设置为单元格。如果可能的话,更改TableRow的背景,使其与您的单元格匹配,因此您无法看到分隔线。
试试看,想要放弃一个演示但是没有太多时间。
希望有帮助