Google日历就像Swing应用程序一样

时间:2011-07-27 08:14:24

标签: java swing calendar jtable jlabel

上下文

我正在开发一个基于java的桌面应用程序,它为高中提供课堂预订。每个预订都保存在RoomBooking类的对象中,其内容如下(简化):

public class RoomBooking implements java.io.Serializable {

    private int id;
    private String roomName, userName;
    private Date bookDate;
    private int beginTime;  
    // represents the reservation begin time (i.e. 8 means 08.00) 
    private int endTime; 
    // represents the reservation end time (i.e. 9 means 09.00) 
    private int  roomId;

//Constructor and setters-getters follow the above code
.....
}

我从数据库中检索保留并将它们放入一个ArrayList对象中,该对象保存一个类RoomBooking(即ArrayList)的实例列表。列表中对象的顺序基于预定日期的递增顺序。

问题定义

现在我尝试创建一个基于swing的UI(即JFrame),它使用JTable显示一个5乘7的网格视图(它看起来像一个像谷歌日历一样的表格日历)。 Jtable的列应该像星期一,星期二......星期日和Jtable中的单元格将保持特定月份的日期从1到28,30或31,具体取决于月份(例如2月28日)。这里的目的是为存在预约的单元格着色并在其中放置一些信息性文本(例如预订时间间隔,如08.00 - 09.00)

考虑到前面提到的ArrayList中的数据是线性的并且基于预留日期排序,我需要将每个预留映射到如此提到的JTable中的特定单元。

为此,我尝试编写一个接收保留日期的方法,并返回Jtable中相关单元格的相应行号和列号。这引入了几个方面的问题。例如,如果该月的第一天没有在星期一开始,则上述方法应该能够移动行列索引,它将相应地返回。

问题

i)你知道是否有一个免费提供的java bean组件,它将提供一个表格日历视图,其列是几周的日子,单元格是一个月中的几天(单元格应该能够获取其他数据)文字如08.00-09.00)?

我在谷歌搜索中找到了一些商业解决方案,但我对开源解决方案/提案很感兴趣。我有点压力,一个随时可用的组件将受到高度赞赏。

ii)anoyone是否面临与问题定义中描述的类似的问题?如果是这样,你能否提供一些关于编写如此提到的mapper方法的指南。

任何建议/帮助都会很高兴。

提前致谢。

最诚挚的问候, Farda

3 个答案:

答案 0 :(得分:2)

不是您问题的答案,但您必须构建三个视图

1 /您可以将CalendarView的网格放到JTable(最佳方式为四分之一/半/年CalendarView),

但部分内容基于JButton/JTextField/JLabels JPanelGridLaout/GridBagLayout(7x7)

最简单的方法是,如果你放在JButtons,那么prevoius /下个月的输出禁用天数很好

2 /对于WeekView,使用JTable一个TableColumn,其中JPanel包含JLabel,因为可能会有一些导弹被穿透(或其他JComponents#setOpaque(false)),

或将GridLayout(1, 7, 5, 5);7 x JPanel一起用于DayViewShedule(s)

3 /对于DayView,GridLayout(1, 24, 5, 5);为24 x JPanel为HourShedule(s)

答案 1 :(得分:2)

通过Kai Toedter http://www.toedter.com/en/jcalendar/

查看JCalendar

答案 2 :(得分:0)

我提出了一个我在问题描述部分提到的映射器方法。您可以在下面找到此方法的内容。可能有更好的方法来做到这一点,但这完全符合我的需要。我利用两件事来计算JTable中相应的行和列索引,如下所示:

int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
int weekOfMonth = cal.get(Calendar.WEEK_OF_MONTH);


 private int[] getCalendarIndexNumbers(
            int dayOfTheMonth,
            int year,
            int month) {

        int[] retArray = new int[2];
        Calendar cal = Calendar.getInstance();
        cal.set(year, month - 1, dayOfTheMonth);
        int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
        int weekOfMonth = cal.get(Calendar.WEEK_OF_MONTH);

        int rowIndex = weekOfMonth-1;
        if (rowIndex < 0) {
            rowIndex = 0;
        }

        int columnIndex;
        switch (dayOfWeek) {
            case 1:
                columnIndex = 6;
                break;
            case 2:
                columnIndex = 0;
                break;
            case 3:
                columnIndex = 1;
                break;
            case 4:
                columnIndex = 2;
                break;
            case 5:
                columnIndex = 3;
                break;
            case 6:
                columnIndex = 4;
                break;
            case 7:
                columnIndex = 5;
                break;
            default:
                columnIndex = 6;
                break;
        }

        retArray[0] = rowIndex;
        retArray[1] = columnIndex;

        return retArray;

    }

为了填充JTable中单元格的内容,我必须编写一个实现TableCellRenderer并扩展JTextArea的自定义渲染器。有关此示例,请访问:http://archive.devx.com/java/free/articles/kabutz07/Kabutz07-2.asp

希望这有助于那些需要开发类似应用程序的人。

感谢之前的回复。

最好的问候