setCellFactory переопределяет updateItem и переносит текст - PullRequest
0 голосов
/ 11 мая 2018

Я хочу, чтобы элементы в моем listView были заглавными и имели разрывы строк.

Я использую setCellFactory для обеспечения реализации Cell.updateItem.Это отлично работает.Когда я добавляю обходной путь для прерывания строк в ListView в мою реализацию ListCell, работает только одна из двух «функций».Первый блок кода начинается со строки 25 и заканчивается строкой 33. Второй блок кода начинается со строки 35 и заканчивается строкой 42. Когда я закомментирую второй блок, все строки в ListView имеют верхний регистр и не имеют разрывов строк.,Когда это не закомментировано, строки имеют разрывы строк и не все в верхнем регистре.Я хочу, чтобы обе "особенности" работали.Как я могу это сделать?

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Callback;

public class Main extends Application {
    public static void main(String[] args) {
        launch(args);
    }

@Override
public void start(Stage primaryStage) {
    ListView<String> myList = new ListView<>();

    myList.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
        @Override
        public ListCell<String> call(final ListView<String> list) {
            return new ListCell<String>() {

                @Override
                protected void updateItem(String item, boolean empty) {
                    super.updateItem(item, empty);
                    if (empty || item == null || item == null) {
                        setText(null);
                    } else {
                        setText(item.toUpperCase());
                    }
                }

                {
                    Text text = new Text();
                    text.wrappingWidthProperty().bind(list.widthProperty().subtract(15));
                    text.textProperty().bind(itemProperty());

                    setPrefWidth(0);
                    setGraphic(text);
                }


            };
        }
    });


    for (int i = 0; i < 100; i++) {
        myList.getItems()
                .add("Lorem ipsum dolor sit amet, consectetur adipisicing elit, "
                        + "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. "
                        + "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris "
                        + "nisi ut aliquip ex ea commodo consequat.");
    }

    primaryStage.setScene(new Scene(myList));
    primaryStage.setTitle("ListWrapBug");
    primaryStage.show();
}

}

Обходной путь для тормозных линий: JavaFX: setWrapText (true) (WordWrap) не работает в ListView .

К сожалениюпредставление кода SO не имеет счетчика строк.

1 Ответ

0 голосов
/ 11 мая 2018

Нет необходимости одновременно устанавливать текст ячейки, и устанавливают графический объект для текстового объекта, который содержит текст, который вы хотите. Делай одно или другое. Так, например, вы можете сделать:

myList.setCellFactory(list -> new ListCell<String>() {

    {
        setWrapText(true);
        prefWidthProperty().bind(list.widthProperty().subtract(12));
    }

    @Override
    protected void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);
        if (empty || item == null || item == null) {
            setText(null);
        } else {
            setText(item.toUpperCase());
        }
    }
});

или вы можете сделать:

myList.setCellFactory(list -> new ListCell<String>() {

    private Text text = new Text();

    {
        prefWidthProperty().bind(widthProperty().subtract(12));
        text.wrappingWidthProperty().bind(widthProperty());
    }

    @Override
    protected void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);
        if (empty || item == null || item == null) {
            setGraphic(null);
        } else {
            text.setText(item.toUpperCase());
            setGraphic(text);
        }
    }
});

Вычитание 12 из ширины ячейки является небольшим взломом для учета вертикальной полосы прокрутки; могут быть более чистые способы сделать это.

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