При отображении длинного списка 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();
}
}