У меня проблемы с пониманием того, как использовать 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 не выполняется.Таким образом, поток логики идет от
псевдокод:
- For (каждый день в течение следующих 60 дней)
- Для (каждый человек в личном списке)
- проверить, если (у человека вообще есть события)
- если это так, цикл For (через каждое событие в EventArray, которое находится в этот текущий день)
- цвет в этой ячейке Дня и Человека!(передать в индекс события eventArray, в котором событие найдено в этот день)
НО ЭТО НИКОГДА НЕ ПРОХОДИТ ИНДЕКС, это не так, но в этом потоке.Делает первые 4 шага, но не 5-й.В моей консоли, когда я печатаю имена, дни, размеры событий и т. Д., Все идет отлично, за исключением того, что когда я распечатываю индекс на 5-м шаге, все индексы находятся в самом конце консоли.Таким образом,
Консоль:
Имя, день, Имя, день, имя, день, .......... индекс, индекс, индекс, <--- вызывающийошибка в моем методе EventCell updateItem. </p>
, когда это должно быть:
Имя, день, индекс, Имя, день, индекс, ......... Имя, день,указатель и т. д.