Lotus Notes / Domino Sonstiges > Java und .NET mit Notes/Domino

swing besser/einfacher: gefährliche Versprechungen oder Zukunft?

<< < (2/2)

Ralf_M_Petter:
Wie siehts da mit der Performance bei deiner Tabelle aus, z.B. wenn du die Grösse einer Spalte anpasst. Den laut Java Swing Tutorial soll man in der  getValueAt Methode des Table Modells so performant wie möglich programmieren und eher nicht komplexe Funktionen in verschiedenen Klassen aufrufen.

Grüße

Ralf

Axel_Janssen:

--- Zitat von: Ralf_M_Petter am 06.08.03 - 12:29:41 ---Wie siehts da mit der Performance bei deiner Tabelle aus, z.B. wenn du die Grösse einer Spalte anpasst. Den laut Java Swing Tutorial soll man in der  getValueAt Methode des Table Modells so performant wie möglich programmieren und eher nicht komplexe Funktionen in verschiedenen Klassen aufrufen.

--- Ende Zitat ---

Guter Punkt, aber ich mache es so auch nicht.
Der User kann (Jahr/Woche) in Comboboxen in der Swing-GUI umstellen.
Aus den entsprechenden Listenern der ComboBoxen wird dann im TableModel die BusinessMethode dateChanged (int week, int year) aufgerufen. Das sieht dann in etwa ungefähr so aus (das hat für die letzte version geklappt, jetzt nach Gespräch mit Auftraggeber ist totaler Design-Wechsel angesagt (d.h. ich nähere mich immer mehr einem framework, wie ich es haben will)).  

--- Code: ---public void dateChanged (int week, int year) {
      // setzt member ArrayList alAppointments auf einen neuen Wert.  
     dbFacadeNotes.getAppointmentsOfWeek (week, year);
     // folgenden Methoden sind notwendig, um die gui zu refreshen (geht so nicht automatisch und
// yup: Das ist ein Nachteil, aber keine Performance-Problem so far.
       TableAbwesenheit.frame.validate();
        TableAbwesenheit.frame.getTable().repaint();            
}

--- Ende Code ---
Die TableModel.getValueAt wird offenbar bei jTable.repaint() aufgerufen.
Die TableModel.getRowCount() bei frame.validate();
Beide holen sich ihre Daten dann über dbFacadeNotes.getAlAppointments();
// diese Variable wird innerhalb der dbFacadeNotes.getAppointmentsOfWeek (week, year); geändert.

Hat bei der letzten Version soweit gut, dh performant funktioniert.
Ich bin ein großer Freund von solchen gelayerten Designs. So 100% sicher, ob ich hier nicht vielleicht Swing mit J2EE-patterns vergewaltige bin ich mir übrigens auch nicht, aber ich werde dich informiert halten über die Ergebnisse.

Gruß Axel

Ralf_M_Petter:
Hallo Axel!

Das mit den Repaint ist nicht ganz die korrekte Methode das zu machen. Du musst die Methode fireTableDataChanged(); des Tabellenmodells aufrufen, dann holt sich die Tabelle die neuen Daten. Neben diesem Event gibt es noch ein Vielzahl andere mit dem man der Tabelle mitteilen kann, dass z.B. eine neue Zeile eingefügt oder gelöscht wurde. Das ein bestimmter Bereich der Tabelle geändert wurde usw. Das bringt natürlich Performance.

Grüße

Ralf

Axel_Janssen:
muß ich mal ausprobieren.

In Bereich der genauen update-Funktionsweise der Layoutmanager bin ich ohnehin noch mehr am raten.
Ich habe das durch ausprobieren rausbekommen. Hab eine wechselnde Anzahl an Tabellenzeilen (zumindest in der letzten Version, jetzt ändert sich das vermutlich, aber das ist eine andere Geschichte).
Jedenfalls änderte er die sichtbare Zeilenanzahl nur durch ein repaint auf einen parent-container.

Gruß Axel

Ralf_M_Petter:
Kann du nur empfehlen, die richtigen Ereignisse zu verwenden, da es sonst sein kann, das deine Anwendung mit einer anderen JDK Version nicht mehr funktioniert. Momtentan ist es zwar so, das er bei einem neuzeichnen die Daten aus dem Tablemodell holt, aber es nicht sicher gewährleistet, das er das auch in Zukunft tut. Er könnte sich z.B. auch die Anzahl der Zeilen in der Tabelle zwischenspeichern und dann würde das mit dem repaint nicht mehr funktionieren.

Grüße

Ralf

Navigation

[0] Themen-Index

[*] Vorherige Sete

Zur normalen Ansicht wechseln