如何在特定单元格的TableView中着色

时间:2018-09-10 16:36:05

标签: java javafx tableview fxml tablecell

我在理解如何使用setCellFactory,setRowFactory等时遇到了麻烦。我设法在要为单元格着色的列中着色,但是问题是它正在着色ENTIRE列,可见列或不。您看到的红色单元格(默认表格颜色)是光标所在的当前单元格,因此,如果要转到其他“空”单元格,它们也将变为红色,这就是我所说的“可见或不”。

Current Tableview look

我需要知道如何仅对某些单元格进行着色,我想这是我缺少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函数没有通过。因此,逻辑流程来自

伪代码:

  1. 用于(接下来的60天中的每一天)
    1. 针对(个人列表中的每个人)
      1. 检查是否(某人有事件)
        1. 如果是,则进行For循环(通过当天的eventArray中的每个事件)
            “天和人”这个单元格中的
          1. 颜色! (传入当天发现事件的eventArray事件的索引)

但是它永远不会通过索引,但不会通过此流程。它执行前4个步骤,但不执行第5个步骤。在我的控制台中,当我打印名称,日期,事件大小等时,一切都进行得很好,除了在第五步中打印出索引时,所有索引都位于控制台的尽头。所以基本上,

控制台:

名称,日期,名称,日期,名称,日期,...,......,索引,索引,索引,<---在我的EventCell updateItem方法中导致错误。

应该在什么时候出现:

名称,日期,索引,名称,日期,索引,.........名称,日期,索引等

0 个答案:

没有答案