문제

jTable 내에서 jList를 선택 가능하게 하고 jScrollPane을 스크롤 가능하게 만드는 방법.

이것은 내 테이블 코드입니다.

private JTable getCalendarTable() {
    if (calendarTable == null) {
        calendarTable = new JTable() {
            public boolean isCellEditable(int nRow, int nCol) {
                if (nRow % 2 != 0) {
                    return true;
                } else
                    return false;
            }
        };
        DefaultTableModel mtblCalendar = (DefaultTableModel) calendarTable
                .getModel();
        String[] headers = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri",
                "Sat" };
        for (int i = 0; i < 7; i++) {
            mtblCalendar.addColumn(headers[i]);
        }
        calendarTable.setCellSelectionEnabled(true);
        calendarTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        calendarTable.setRowHeight(60);
        mtblCalendar.setColumnCount(7);
        mtblCalendar.setRowCount(12);
        GregorianCalendar cal = new GregorianCalendar();
        realDay = cal.get(GregorianCalendar.DAY_OF_MONTH); // Get day
        realMonth = cal.get(GregorianCalendar.MONTH); // Get month
        realYear = cal.get(GregorianCalendar.YEAR); // Get year
        currentMonth = realMonth; // Match month and year
        currentYear = realYear;
        refreshCalendar(currentMonth, currentYear);
    }

    return calendarTable;
}


class tblCalendarRenderer extends JTextArea implements TableCellRenderer {
    public Component getTableCellRendererComponent(JTable table,
            Object value, boolean selected, boolean focused, int row,
            int column) {
        this.setText(value == null ? "" : value.toString());
        this.setLineWrap(true);
        this.setWrapStyleWord(true);

        if (column == 0 || column == 6) { // Week-end
            setBackground(new Color(255, 220, 220));
        } else { // Week
            setBackground(new Color(255, 255, 255));
        }
        if (row % 2 == 0) {
            if (value != null) {
                if (Integer.parseInt(value.toString()) == realDay
                        && currentMonth == realMonth
                        && currentYear == realYear) { // Today
                    setBackground(new Color(220, 220, 255));
                }
            }
        } else {
            if (value != null) {
                                    // Here is just an test data I want to make sure the jList is working. When 
                                    // the date has event, show jList 
                JList list = new JList(new Object[] { "werwre", "fsdfsd",
                        "details", "computer", "folder", "computer" });
                list.setVisibleRowCount(4);
                JScrollPane pane = new JScrollPane(list);
                list.setCellRenderer(new Incorenderer());
                return pane;
            }
        }
        return this;
    }
}

}

날짜에 이벤트가 있을 때 JList 및 JScrollPanel이 나타납니다.그러나 jList는 선택할 수 없으며 스크롤 패널은 스크롤할 수 없습니다.

도움이 되었습니까?

해결책

그림을 그리는 코드를 사용해야 합니다. JList 안에 TableCellRenderer 구현하고 이를 편집기로 사용합니다. 즉:

class CalendarCellEditor extends AbstractCellEditor implements TableCellEditor {
    public Component getTableCellEditorComponent(JTable table,
            Object value, boolean isSelected, int row, int column) {

        if (value != null) {
            // Here is just an test data I want to make sure the jList is
            // working. When
            // the date has event, show jList
            JList list = new JList(new Object[] { "werwre", "fsdfsd",
                    "details", "computer", "folder", "computer" });
            list.setVisibleRowCount(4);
            JScrollPane pane = new JScrollPane(list);
            list.setCellRenderer(new Incorenderer());
            return pane;
        } else {
            // TODO return whatever you need
            return null;
        }
    }

    public Object getCellEditorValue() {
        // TODO return whatever you need
        return 1;
    }

}

그리고 익명 내부 JTable 클래스에서 다음 메서드를 재정의하여 이 편집기를 테이블에 추가합니다.

public TableCellEditor getCellEditor(int row, int column) {
     return new CalendarCellEditor();
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top