我在理解如何使用setCellFactory,setRowFactory等时遇到了麻烦。我设法在要为单元格着色的列中着色,但是问题是它正在着色ENTIRE列,可见列或不。您看到的红色单元格(默认表格颜色)是光标所在的当前单元格,因此,如果要转到其他“空”单元格,它们也将变为红色,这就是我所说的“可见或不”。
我需要知道如何仅对某些单元格进行着色,我想这是我缺少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类中。基本上,我在EventCell中获得IndexOutOfBounds异常的原因是由于某种原因,在If语句中,days.setCellFactory函数没有通过。因此,逻辑流程来自
伪代码:
但是它永远不会通过索引,但不会通过此流程。它执行前4个步骤,但不执行第5个步骤。在我的控制台中,当我打印名称,日期,事件大小等时,一切都进行得很好,除了在第五步中打印出索引时,所有索引都位于控制台的尽头。所以基本上,
控制台:
名称,日期,名称,日期,名称,日期,...,......,索引,索引,索引,<---在我的EventCell updateItem方法中导致错误。
应该在什么时候出现:
名称,日期,索引,名称,日期,索引,.........名称,日期,索引等