简体   繁体   English

CustomTableModel + JTable =表未填充

[英]CustomTableModel + JTable = table isn't filled

I'm trying to implement my own table model to show the schedule in JTable. 我正在尝试实现自己的表模型来显示JTable中的计划。 I implemented it, but table even isn't filled. 我实现了它,但表格甚至没有填充。 Maybe I lost some methods which are required to be implemented? 也许我失去了一些需要实施的方法? Here is my code: 这是我的代码:

public class ScheduleTableModel extends AbstractTableModel {

    private ArrayList<TimeInterval> timeIntervals;
    private ArrayList<Day> days;
    private LinkedHashMap<ScheduleSlot, Lesson> fullSchedule;
    private LinkedHashMap<ScheduleSlot, Lesson> partialSchedule;
    private ScheduleType scheduleType;


    public ScheduleTableModel(ArrayList<TimeInterval> timeIntervals, ArrayList<Day> days, LinkedHashMap<ScheduleSlot, Lesson> fullSchedule, LinkedHashMap<ScheduleSlot, Lesson> partialSchedule) {
        this.timeIntervals = timeIntervals;
        this.days = days;
        this.fullSchedule = fullSchedule;
        this.partialSchedule = partialSchedule;
        this.scheduleType = ScheduleType.PARTIAL;
        fireTableStructureChanged();
    }

    public ScheduleTableModel(LinkedHashMap<ScheduleSlot, Lesson> fullSchedule) {
        this.fullSchedule = fullSchedule;
        this.scheduleType = ScheduleType.GENERAL;
        fireTableStructureChanged();
    }

    @Override
    public int getRowCount() {
        if (scheduleType == ScheduleType.PARTIAL) {
            return timeIntervals.size() + 1;
        } else {
            return fullSchedule.size();
        }
    }

    @Override
    public int getColumnCount() {
        if (scheduleType == ScheduleType.PARTIAL) {
            return days.size() + 1;
        } else {
            return 3;
        }
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        if (scheduleType == ScheduleType.PARTIAL) {
            if (columnIndex > 0 && rowIndex > 0) {
                for (Map.Entry<ScheduleSlot, Lesson> entry : partialSchedule.entrySet()) {
                    if (entry.getKey().getDay().equals(getColumnDay(columnIndex)) && entry.getKey().getTime().equals(getRowTimeInterval(rowIndex))) {
                        return entry;
                    }
                }
            } else if (rowIndex == 0 && columnIndex > 0) {
                return days.get(columnIndex);
            } else if (columnIndex == 0 && rowIndex > 0) {
                return timeIntervals.get(rowIndex);
            } else if (rowIndex == 0 && columnIndex == 0) {
                return "";
            }
        } else {
            List<Map.Entry<ScheduleSlot, Lesson>> scheduleIterator = new ArrayList<Map.Entry<ScheduleSlot, Lesson>>(fullSchedule.entrySet());
            switch (columnIndex) {
                case 0: {
                    scheduleIterator.get(columnIndex).getKey().getTimeSlot();
                }
                case 1: {
                    scheduleIterator.get(columnIndex).getKey().getPlaceSlot();
                }
                case 2: {
                    scheduleIterator.get(columnIndex).getValue();
                }
            }
        }
        return "";
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }

    public Day getColumnDay(int columnIndex) {
        return (Day) getValueAt(0, columnIndex);
    }

    public TimeInterval getRowTimeInterval(int rowIndex) {
        return (TimeInterval) getValueAt(rowIndex, 0);
    }

    @Override
    public Class getColumnClass(int columnIndex) {
        if (scheduleType == ScheduleType.GENERAL) {
            switch (columnIndex) {
                case 0: {
                    return fullSchedule.entrySet().iterator().next().getKey().getTimeSlot().getClass();
                }
                case 1: {
                    return fullSchedule.entrySet().iterator().next().getKey().getPlaceSlot().getClass();
                }
                case 2: {
                    return fullSchedule.entrySet().iterator().next().getValue().getGroup().getClass();
                }
                case 3: {
                    return fullSchedule.entrySet().iterator().next().getValue().getProfessor().getClass();
                }
                case 4: {
                    return fullSchedule.entrySet().iterator().next().getValue().getCourse().getClass();
                }

            }
        } else {
            return String.class;
        }
        return String.class;
    }

    @Override
    public String getColumnName(int column) {
        if (scheduleType == ScheduleType.GENERAL) {
            switch (column) {
                case 0: {
                    return "";
                }
                case 1: {
                    return "";
                }
                case 2: {
                    return "";
                }
                case 3: {
                    return "";
                }
                case 4: {
                    return "";
                }
            }
        }
        return "";
    }
}  

Could anybody point me on my mistakes? 有人能指出我的错误吗? Thanks everyone in advance! 提前谢谢大家!

ps I'm not sure if it is necessary to implement setValueAt for Jtable be filled. ps我不确定是否有必要为Jtable实现setValueAt。 If I'm right and it is necessary could you show an example of the implementation of this method? 如果我是对的,你有必要展示一下这种方法的实现吗?

ADDITION: 加成:

Implemented setValueAt(), but nothing changed: 实现了setValueAt(),但没有改变:

@Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        if (scheduleType == ScheduleType.PARTIAL) {
            Map.Entry<ScheduleSlot, Lesson> entry = (Map.Entry<ScheduleSlot, Lesson>) aValue;
            if (columnIndex > 0 && rowIndex > 0) {
                Day day = getColumnDay(columnIndex);
                TimeInterval timeInterval = getRowTimeInterval(rowIndex);
                TimeInterval entryInterval = entry.getKey().getTime();
                Day entryDay = entry.getKey().getDay();
                if (day.equals(entryDay) && timeInterval.equals(entryInterval)) {
                    fullSchedule.put(new ScheduleSlot(new TimeSlot(entry.getKey().getTime(), entry.getKey().getDay()),
                            new PlaceSlot(entry.getKey().getRoom(), entry.getKey().getBuilding())), entry.getValue());
                }
            } else if (rowIndex == 0 && columnIndex > 0) {
                days.add((Day) aValue);
            } else if (columnIndex == 0 && rowIndex > 0) {
                timeIntervals.add((TimeInterval) aValue);
            }
        }

        fireTableDataChanged();
    }  

Here is the picture of tablemodel structure how I see it: 这是tablemodel结构的图片我怎么看:

在此输入图像描述

I wanna yellow part be filled from timeIntervals list, green part - from days list and the purpule part - from partialSchedule hashmap. 我想黄色部分从timeIntervals列表填充,绿色部分 - 从days列表和purpule部分 - 从partialSchedule hashmap填充。

  • your AbstractTableModel missing important setXxx() method(s) 你的AbstractTableModel缺少重要的setXxx()方法

  • why did you use too hard methods fireTableStructureChanged(); 为什么你使用太硬的方法fireTableStructureChanged(); use proper fireXxxXxx()methods , this code example contains most of important methods for AbstractTableModel with proper fireXxxXxx() 使用适当的fireXxxXxx()方法 ,此代码示例包含AbstractTableModel大多数重要方法以及正确的fireXxxXxx()

  • I'd be use DefaultTableModel based on Vector<Vector<Object>> rather than XxxMap or XxxHashMap , this way required depest knowledge about JTable , XxxTableModel and XxxMap or XxxHashMap works together 我会使用DefaultTableModel基于Vector<Vector<Object>> ,而不是XxxMapXxxHashMap ,这样大约需要depest知识JTableXxxTableModelXxxMapXxxHashMap一起工作

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM