JavaFx ListView показывает горизонтальную полосу прокрутки при перетаскивании вертикальной полосы прокрутки - PullRequest
0 голосов
/ 04 марта 2020

При отображении длинного списка Label в ListView с вертикальной полосой прокрутки я не хочу показывать горизонтальную полосу прокрутки.

Например, когда prefWith ListView равен 200, я устанавливаю prefWidth Label равным 184 ( я пробую это значение от 200 до 183, значение 184 - это граничное значение, которое не будет отображать горизонтальную полосу прокрутки.

оно хорошо отображается в окне инициализации, но при перетаскивании вертикальной полосы прокрутки отображается горизонтальная полоса прокрутки.

это gif show case

, затем я пытаюсь использовать Label prefWidth от 184 до 170, и нахожу, что 171 является лучшим значением.

что произошло, когда вертикальная полоса прокрутки прокрутилась вниз? как ListView вычисляет горизонтальную полосу прокрутки?

В SceneViewer xLayout VirtualFlow равен 1:

SceneViewer на VirtualFlow

xLayout LabelCell равен 7.

SceneViewer на LabelCell

MainWindow.f xml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.layout.VBox?>

<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="250.0" xmlns="http://javafx.com/javafx/8.0.171"
    xmlns:fx="http://javafx.com/fxml/1" fx:controller="test.MainWindowController">
    <left>
        <VBox BorderPane.alignment="CENTER">
            <children>
                <ListView fx:id="listView" prefHeight="200.0"  prefWidth="200.0" />
            </children>
        </VBox>
    </left>
</BorderPane>

MainWindowController

public class MainWindowController implements Initializable {

    @SuppressWarnings("rawtypes")
    @FXML
    private ListView listView;

    @SuppressWarnings("unchecked")
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        listView.setCellFactory(lv -> new LabelCell());
        for (int i = 0; i < 100; i++) {
            listView.getItems().add(i);
        }
    }

}

LabelCell :

public class LabelCell extends ListCell<Integer> {

    private final Label label;

    public LabelCell() {
        label = new Label();
        label.setPrefWidth(184);
        setGraphic(label);
        setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
    }

    @Override
    protected void updateItem(Integer item, boolean empty) {
        super.updateItem(item, empty);
        if (item != null) {
            label.setText(String.valueOf(item));
        }
    }

}

Приложение:

public class App extends Application {

    public static void main(String[] args) throws IOException {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        FXMLLoader fxmlLoader = new FXMLLoader(App.class.getClassLoader().getResource("test/MainWindow.fxml"));
        Parent root = fxmlLoader.load();
        Scene primaryScene = new Scene(root);
        primaryStage.setScene(primaryScene);
        primaryStage.setTitle("Test App");
        primaryStage.show();
    }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...