On Sat, 13 Aug 2022 06:58:13 GMT, Sai Pradeep Dandem <d...@openjdk.org> wrote:

>> **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

looks good
(I am not a Reviewer/Committer, so you may need to ask a real one to approve)

-------------

Marked as reviewed by angorya (Author).

PR: https://git.openjdk.org/jfx/pull/848

Reply via email to