2 Stimmen

Google Kalender wie Swing-Anwendung

Kontext

Ich arbeite an einer javabasierten Desktop-Anwendung, die Klassenraumreservierungen für eine Highschool vornimmt. Jede Reservierung wird in einem Objekt der Klasse RoomBooking gespeichert, dessen Inhalt wie folgt aussieht (vereinfacht):

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
.....
}

Ich rufe die Reservierungen aus der Datenbank ab und lege sie in ein ArrayList-Objekt, das eine Instanzliste der Klasse RoomBooking (d.h. ArrayList) enthält. Die Reihenfolge der Objekte in der Liste basiert auf dem Reservierungsdatum in aufsteigender Reihenfolge.

Problemstellung

Jetzt versuche ich, eine Swing-basierte UI (d.h. JFrame) zu erstellen, die eine 5 x 7 Grid-Ansicht mit JTable zeigt (Es sollte wie ein tabellarischer Kalender genau wie Google Kalender aussehen). Die Spalten der JTable sollte wie Montag, Dienstag....Sonntag und die Zellen in der JTable wird die Tage eines bestimmten Monats von 1 bis 28, 30 oder 31 je nach Monat (z. B. 28 für Februar) halten. Hier geht es darum, eine Zelle, für die eine Reservierung vorliegt, einzufärben und einen informativen Text darin zu platzieren (z. B. Reservierungszeitintervall wie 08.00 - 09.00)

In Anbetracht der Tatsache, dass die Daten in der zuvor erwähnten ArrayList linear und nach dem Reservierungsdatum geordnet sind, muss ich jede Reservierung einer bestimmten Zelle in der so genannten JTable zuordnen.

Zu diesem Zweck habe ich versucht, eine Methode zu schreiben, die das Datum für eine Reservierung empfängt und die entsprechende Zeilen- und Spaltennummer der entsprechenden Zelle in der J-Tabelle zurückgibt. Dies führt zu mehreren Nebenproblemen. Wenn zum Beispiel der erste Tag des Monats nicht am Montag beginnt, sollte die oben genannte Methode in der Lage sein, die Zeilen- und Spaltenindizes, die sie zurückgibt, entsprechend zu verschieben.

Frage

i) Wissen Sie, ob es eine frei verfügbare Java-Bean-Komponente gibt, die eine tabellarische Kalenderansicht bereitstellt, deren Spalten die Tage der Wochen und die Zellen die Tage des Monats sind (die Zellen sollten in der Lage sein, zusätzliche Daten in Textform wie 08.00-09.00 aufzunehmen)?

Ich habe bei meiner Google-Suche einige kommerzielle Lösungen gefunden, aber ich bin an Open-Source-Lösungen/Vorschlägen interessiert. Ich stehe ein wenig unter Druck und eine gebrauchsfertige Komponente wäre mir sehr willkommen.

ii) Hatte jemand ein ähnliches Problem wie das in der Problemstellung beschriebene? Wenn ja, könnten Sie mir bitte einige Leitlinien zum Schreiben der so genannten Mapper-Methode geben.

Für jede Anregung/Hilfe wäre ich sehr dankbar.

Vielen Dank im Voraus.

Mit freundlichen Grüßen, Farda

2voto

mKorbel Punkte 109073

Keine Antwort auf Ihre Frage, aber Sie müssen drei Ansichten aufbauen

1/ können Sie ein Gitter für CalendarView in die JTable (am besten für viertel/halb/jährliche CalendarView),

aber ein Teil von ihnen basiert auf JButton/JTextField/JLabels platziert in JPanel con GridLaout/GridBagLayout(7x7) ,

Am einfachsten ist es, wenn Sie hier JButtons Für eine schöne Ausgabe deaktivieren Sie die Tage für den vorhergehenden/nächsten Monat.

2/ für WeekView werden Shedules verwendet JTable mit einem TableColumn setzen, dort JPanel die Folgendes enthält JLabel weil es möglich ist, dass einige Schuppen durchdrungen sind (oder aus anderen JComponents#setOpaque(false) ),

oder durch die Verwendung von GridLayout(1, 7, 5, 5); con 7 x JPanel für DayViewShedule(s)

3/ für DayView mit GridLayout(1, 24, 5, 5); mit 24 x JPanel für Stundentafel(n)

2voto

maneesh Punkte 1692

Sehen Sie sich JCalendar von Kai Toedter an http://www.toedter.com/en/jcalendar/

0voto

farda Punkte 21

Ich habe eine Mapper-Methode entwickelt, die ich in der Problembeschreibung erwähnt habe. Nachfolgend finden Sie den Inhalt dieser Methode. Vielleicht gibt es bessere Methoden, aber diese erfüllt meine Anforderungen perfekt. Ich habe zwei Dinge verwendet, um die entsprechenden Zeilen- und Spaltenindizes in der JTable wie folgt zu berechnen:

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;

    }

Um den Inhalt der Zellen in der JTable zu füllen, musste ich einen eigenen Renderer schreiben, der TableCellRenderer implementiert und JTextArea erweitert. Ein Beispiel dafür ist verfügbar unter: http://archive.devx.com/java/free/articles/kabutz07/Kabutz07-2.asp

Ich hoffe, dies hilft denen, die eine ähnliche Anwendung entwickeln müssen.

Vielen Dank für die bisherigen Antworten.

Mit freundlichen Grüßen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X