2017-02-08 8 views
1

я получил ListView в моей JavaFX App, где я создал визуализации ячейки следующим образом:JavaFX ListView: пользовательский шрифт не применяется должным образом

myListView.setCellFactory((params) -> new MyListRenderer()); 

Отображатель класс:

class MyListRenderer extends ListCell<MyItemClass> { 

    private final Label text; 

    MyListRenderer() { 
     text = new Label(); 
     text.setFont(Font.font("Monospaced", 12)); 
    } 

    @Override 
    protected void updateItem(MyItemClass item, boolean empty) { 
     super.updateItem(item, empty); 
     if (item == null || empty) { 
      setGraphic(null); 
      setText(null); 
     } else { 
      if(item.isSpecialItem()){ 
       text.setText("\u25B6 " + item.getString(); 
       text.setStyle("-fx-font-weight: bold;"); 
      } else { 
       text.setText(item.getString()); 
       text.setStyle("-fx-font-weight: normal;"); 
      } 
      setGraphic(text); 
     } 
    } 
} 

Как вы можете видеть, что я устанавливаю шрифт Monospaced, а также я устанавливаю текст и стиль в соответствии с флагом моих предметов ('isSpecialItem')

Итак, он отлично работает вначале, когда я добавляю f Первые несколько записей отображаются правильно. Однако, как только я выберу любую запись в списке, шрифт моей текстовой метки сбрасывается на стандартный шрифт ячеек списка. Интересно, что только шрифт, кажется, сбрасывается, поскольку как текст, который я установил, так и стиль (жирный или обычный), все еще применяются правильно.

Я пытался поставить эту строку:

text.setFont(Font.font("Monospaced", 12)); 

в методе updateItem, так что она будет повторно выполняться при каждом обновлении. Однако он все еще не работает, поскольку я заметил, что метод даже не вызывается, когда я выбираю элементы.

Итак, проблема заключается в следующем: при выборе в представлении списка шрифт по какой-то причине сбрасывается, а метод updateItem еще не вызван, поэтому я не могу установить его обратно на нужный шрифт.

Кто-нибудь знает, что здесь происходит и как я могу это исправить?

Благодаря

ответ

0

Используйте CSS файл и установить семейство шрифтов и размер шрифта для .list-cell:

.list-cell { 
    -fx-font-family: "Monospaced"; 
    -fx-font-size: 12px; 
} 

EDIT

Отвечая на Ваш вопрос в комментарии: Да, что код будет изменить все ячейки списка в вашем приложении.

Вы можете создать свой собственный селектор класса стиля для конкретного элемента списка или стиля идентификатора. См. Skinning JavaFX Applications with CSS и JavaFX CSS Reference Guide, есть простые примеры их создания.

В файле CSS случай:

.custom-list-cell { 
    -fx-font-family: "Monospaced"; 
    -fx-font-size: 12px; 
} 

и MyListRenderer класс:

MyListRenderer() { 
    getStyleClass().add("custom-list-cell"); 
    text = new Label(); 
} 

Обратите внимание, что это изменит шрифты во всех Labeled компонентов пользовательского ListCell.

+0

но разве это не значит, что все мои списки меняются в моем приложении? К сожалению, я пока не использовал CSS с JavaFX, не могли бы вы привести пример того, как я могу настроить это только для этого списка (который я определил в файле fxml). – user3237736

+0

Проверьте отредактированный ответ. – MBec