> **Issue:** > When the `TableView` is set with built-in `CONSTRAINED_RESIZE_POLICY`, the > horizontal scroll bar keeps flickering when the `TableView` width is reduced. > > **Cause:** > The table columns widths are recalculated only if the difference of the > `TableView` width and the total columns width is greater than 1px. Because of > this improper calculations, if the `TableView` width is reduced by 1px, the > columns widths are not updated. Which results to computing for horizontal > scroll bar visibility in `VirtualFlow` to improper results and let the > horizontal scroll bar to be visible. > > Where as if the `TableView` width is reduced by more than 1px, the > calculations are done correctly and the horizontal scroll bar visibility is > turned off. Because of this behaviour, it looks like the horizontal scroll > bar is flickering when the `TableView` width is reduced (let’s say by > dragging). > > To confirm this behaviour, please find the below example that showcases the > issue: > When the tableView width is reduced/increased by 1px, the column widths are > recalculated only after every alternate 1px change. Whereas if the tableView > width is reduced/increased by more than 1px (say 10px), the column widths are > calculated correctly. > > > import javafx.application.Application; > import javafx.beans.property.SimpleStringProperty; > import javafx.beans.property.StringProperty; > import javafx.collections.FXCollections; > import javafx.collections.ObservableList; > import javafx.geometry.Insets; > import javafx.scene.Group; > import javafx.scene.Scene; > import javafx.scene.control.*; > import javafx.scene.layout.HBox; > import javafx.scene.layout.VBox; > import javafx.stage.Stage; > > public class ConstrainedResizePolicyIssueDemo extends Application { > @Override > public void start(Stage primaryStage) throws Exception { > TableColumn<Person, String> fnCol = new TableColumn<>("First Name"); > fnCol.setMinWidth(100); > fnCol.setCellValueFactory(param -> > param.getValue().firstNameProperty()); > > TableColumn<Person, String> priceCol = new TableColumn<>("Price"); > priceCol.setMinWidth(100); > priceCol.setMaxWidth(150); > priceCol.setCellValueFactory(param -> > param.getValue().priceProperty()); > > TableColumn<Person, String> totalCol = new TableColumn<>("Total"); > totalCol.setMinWidth(100); > totalCol.setMaxWidth(150); > totalCol.setCellValueFactory(param -> > param.getValue().totalProperty()); > > ObservableList<Person> persons = FXCollections.observableArrayList(); > persons.add(new Person("Harry", "200.00", "210.00")); > persons.add(new Person("Jacob", "260.00", "260.00")); > > TableView<Person> tableView = new TableView<>(); > tableView.getColumns().addAll(fnCol, priceCol, totalCol); > tableView.setItems(persons); > tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); > tableView.setMinWidth(500); > tableView.maxWidthProperty().bind(tableView.minWidthProperty()); > > Button button1 = new Button("Reduce 1px"); > button1.setOnAction(e -> > tableView.setMinWidth(tableView.getMinWidth() - 1)); > Button button2 = new Button("Reduce 10px"); > button2.setOnAction(e -> > tableView.setMinWidth(tableView.getMinWidth() - 10)); > Button button3 = new Button("Reset"); > button3.setOnAction(e -> tableView.setMinWidth(500)); > Button button4 = new Button("Increase 1px"); > button4.setOnAction(e -> > tableView.setMinWidth(tableView.getMinWidth() + 1)); > Button button5 = new Button("Increase 10px"); > button5.setOnAction(e -> > tableView.setMinWidth(tableView.getMinWidth() + 10)); > > HBox row = new HBox(button1, button2, button3, button4, button5); > row.setSpacing(10); > TextArea output = new TextArea(); > > addWidthListeners(tableView, output); > VBox root = new VBox(row, new Group(tableView), output); > root.setSpacing(10); > root.setPadding(new Insets(10)); > > Scene scene = new Scene(root); > primaryStage.setScene(scene); > primaryStage.setTitle("Constrained Resize Policy Issue TableView"); > primaryStage.show(); > } > > private void addWidthListeners(TableView<Person> tableView, TextArea > output) { > tableView.widthProperty().addListener((obs, old, val) -> { > String str = "Table width changed :: " + val + "\n"; > output.setText(output.getText() + str); > output.positionCaret(output.getText().length()); > }); > tableView.getColumns().forEach(column -> { > column.widthProperty().addListener((obs, old, width) -> { > String str = " ---> " + column.getText() + " : width changed > to : " + column.getWidth()+"\n"; > output.setText(output.getText() + str); > output.positionCaret(output.getText().length()); > }); > }); > } > > class Person { > private StringProperty firstName = new SimpleStringProperty(); > private StringProperty price = new SimpleStringProperty(); > private StringProperty total = new SimpleStringProperty(); > > public Person(String fn, String price, String total) { > setFirstName(fn); > setPrice(price); > setTotal(total); > } > > public StringProperty firstNameProperty() { > return firstName; > } > > public void setFirstName(String firstName) { > this.firstName.set(firstName); > } > > public StringProperty priceProperty() { > return price; > } > > public void setPrice(String price) { > this.price.set(price); > } > > public StringProperty totalProperty() { > return total; > } > > public void setTotal(String total) { > this.total.set(total); > } > } > } > > > **Fix:** > On investigating the code, it is noticed that there is an explicit line of > code to check if the difference in widths is greater than 1px. I think this > should be greater than 0px. Because we need to recompute the columns widths > even if the width is increased by 1px. > > The part of the code that need to be updated is in TableUtil.java -> > constrainedResize(..) method -> line 226 > > `if (Math.abs(colWidth - tableWidth) > 1) {` > > If I update the value 1 to 0, the issue is fixed and the horizontal scroll > bar visibility is computed correctly.
Sai Pradeep Dandem has updated the pull request incrementally with one additional commit since the last revision: Fixed copyright review comments ------------- Changes: - all: https://git.openjdk.org/jfx/pull/848/files - new: https://git.openjdk.org/jfx/pull/848/files/330e0368..37c78a4b Webrevs: - full: https://webrevs.openjdk.org/?repo=jfx&pr=848&range=04 - incr: https://webrevs.openjdk.org/?repo=jfx&pr=848&range=03-04 Stats: 1 line in 1 file changed: 0 ins; 0 del; 1 mod Patch: https://git.openjdk.org/jfx/pull/848.diff Fetch: git fetch https://git.openjdk.org/jfx pull/848/head:pull/848 PR: https://git.openjdk.org/jfx/pull/848