增加特定行的单元格大小-JAVAFX TableView

时间:2016-09-26 13:20:07

标签: java javafx

我正在尝试调整特定cellTableView中特定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 时,大小会增加(正如预期的那样)。

相反,我想只增加包含“”的单元格的大小。

我不确定,我应该使用什么代码来使其以这种方式工作。

我该如何解决这个问题?

1 个答案:

答案 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的背景,使其与您的单元格匹配,因此您无法看到分隔线。

试试看,想要放弃一个演示但是没有太多时间。

希望有帮助