Как покрасить в определенных ячейках TableView - PullRequest
0 голосов
/ 10 сентября 2018

У меня проблемы с пониманием того, как использовать setCellFactory, setRowFactory и т. Д. Мне удалось раскрасить столбцы, в которых я хочу раскрасить ячейки, но проблема в том, что он окрашивает ВЕСЬ столбец, видимый илине.Красная ячейка (цвет таблицы по умолчанию), которую вы видите, является текущей ячейкой, на которой находится мой курсор, поэтому, если бы вы перешли к другим «пустым» ячейкам, они тоже были бы красными, что я и имел в виду под «видимым илине".

Текущий просмотр таблицы

Мне нужно знать, как окрашивать только определенные ячейки, что я собираюсь догадаться, это отсутствие у меня TableCell, но я не знаюкак это сделать.Я в основном прохожу каждый день, каждого человека и проверяю, есть ли у этого человека событие в этот день.Если да, то какое событие?это то, на чем основан мой цвет.Зеленый для «Каникулы», Синий для «Путешествия» и т. Д. В настоящее время доступ к моему списку объектов (событий) по индексу не работает, поэтому то, что отображается с помощью других простых атрибутов, таких как имя или группа.Это мой код.

Controller.java

for (int i = 0; i < tablecols.length; i++){
        days = new TableColumn<>(pls.get(i));
        days.setText(pls.get(i));;
        days.setMinWidth(55);

    table.getColumns().add(days);
    current = pls.get(i);

    //check each person in the list
    for (Person p: test.getPerson()){

        //check if this day contains the event's start - end
        if (p.getEvents().size() != 0){ 

            for (int j = 0; j < p.getEvents().size(); j++){
                start = p.getEvents().get(j).getStartDate(); 
                String sub = start.substring(0, 5);

                if (current.contains(sub)){     
                    //color in this date! the person row and day column     
                    days.setCellFactory((TableColumn<Person, String> column) -> {
                        return new EventCell(sub, index);
                    }); 
                }
            }
        }
    }
}

EventCell.java

@Override
    protected void updateItem(String item, boolean empty){
        super.updateItem(item, empty);
        if (empty){
            setText(null);
            setStyle("");
        } else {
            setText(item);
            Person person = getTableView().getItems().get(getIndex());  
            if (person.getGroups().equals("Testing")){
                setStyle("-fx-background-color: blue;"); //if condition equals anything, it just colors all the columns blue, visibly I think
                //will only show the ones selected to your condition
            } 
            else if (person.getName().equals("Matt")){
                setStyle("-fx-background-color: black;");
            } 
//vvvvvvvvvvv get(index) DOESN'T WORK if added: IndexOutOfBoundsException vvvvvvvvvvvvvvv
                    else if (person.getEvents().get(index).getEvent().equals("Vacation")) {
                        setStyle("-fx-background-color: green");
                else {
                    setStyle("");
                }
            }
    }

Person.java

public class Person {

    //Columns 
    private String name;
    private String last;
    private String group;
    private ArrayList<Event> events;

    static ArrayList<String> strDays = new ArrayList<String>();

    public ArrayList<Event> getEvents() {
        return events;
    }

    public void setEvents(ArrayList<Event> events) {
        this.events = new ArrayList<>(events);
    }

    //Basically (John, Doe, Testing, [Vacation, Travel, Testing, ...]
    public Person(String name, String last, String group, ArrayList<Event> events){
        this.name = name;
        this.last = last;
        this.group = group;
        this.events = new ArrayList<Event>(events);
    }

Event.java

public class Event {

    private String event;
    private String startDate;
    private String endDate;

    public String getEvent() {
        return event;
    }

    ....rest of setters and getters...
    .
    .

    public Event(){
        this.event= "";
        this.startDate = "";
        this.endDate = "";
    }

    public Event(String event, String startDate, String endDate){
        this.event = event;
        this.startDate = startDate;
        this.endDate = endDate;
    }

Итак, проблема, с которой я столкнулся, на самом деле в классе Controller.java.В основном причина, по которой я получаю исключение IndexOutOfBounds в EventCell, заключается в том, что по какой-то причине в операторе If функция days.setCellFactory не выполняется.Таким образом, поток логики идет от

псевдокод:

  1. For (каждый день в течение следующих 60 дней)
  2. Для (каждый человек в личном списке)
  3. проверить, если (у человека вообще есть события)
  4. если это так, цикл For (через каждое событие в EventArray, которое находится в этот текущий день)
  5. цвет в этой ячейке Дня и Человека!(передать в индекс события eventArray, в котором событие найдено в этот день)

НО ЭТО НИКОГДА НЕ ПРОХОДИТ ИНДЕКС, это не так, но в этом потоке.Делает первые 4 шага, но не 5-й.В моей консоли, когда я печатаю имена, дни, размеры событий и т. Д., Все идет отлично, за исключением того, что когда я распечатываю индекс на 5-м шаге, все индексы находятся в самом конце консоли.Таким образом,

Консоль:

Имя, день, Имя, день, имя, день, .......... индекс, индекс, индекс, <--- вызывающийошибка в моем методе EventCell updateItem. </p>

, когда это должно быть:

Имя, день, индекс, Имя, день, индекс, ......... Имя, день,указатель и т. д.

...