Welche dieser Schleifen im TableCellRendererist effizienter?

  • Themenstarter Themenstarter Andi0815
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
A

Andi0815

Gast
Hallo!

folgendes ist das Problem:
Es sollen einige tausend JTable Zellen auf bestimmte Eigenschaften überprüft werden, so z.B. ob in einem String überflüssige Leerzeichen enthalten sind, oder ob ein bestimmtes Wort vorkommt. Das ganze wird im TableCellRenderer geprüft und wenn dies der Fall ist, soll die Zelle eine Warnfarbe bekommen.
Zudem wird zunächst geprüft, ob diese Funktion überhaupt eingeschaltet ist.

Folgendes hab ich mir dazu überlegt:

Hinweis: Die boolean "whitespace" ist die Einstellung des Users, ob überhaupt danach gesucht werden soll!
Code:
            if (((value.toString().endsWith(" ")) || (value.toString().startsWith(" "))) && (whitespace == true) ) {
                setBackground(Color.MAGENTA);
                System.out.println("Whitespace gefunden");
            }



        while (whitespace==true){
            if (((value.toString().endsWith(" ")) || (value.toString().startsWith(" "))) {
                setBackground(Color.MAGENTA);
                System.out.println("Whitespace gefunden");
            }
        }

Hierzu die Frage, welcher dieser beiden Möglichkeiten die bessere ist.


Weiterhin wird noch mehrfach nach bestimmten Wörter gesucht. Jeweils auch nur, wenn der User das möchte (vorname == true)

Code:
            if (vorname == true){
                if (value.toString().compareToIgnoreCase(Vorname) == 0) {
                    reihe= reihe+row;  //ist dazu da um festzustellen ob die ganzen zu suchenden wörter  in einer reihe stehen
                    setBackground(Color.RED);
                System.out.println("Vorname gefunden");
                }
            }

// ... dieser Code kommt dann noch 5-6 mal vor, jeweils für nachname, titel etc.

Hier fällt mir auch die 2. Möglichkeit wie oben mit der while schleife ein.

Ich bitte um ein paar Meinungen, welche der Schleifen ich benutzen soll. Oder habt ihr vielleicht noch eine bessere Möglichkeit, die für einen Anfänger noch zu verstehen sind 🙂

Da der Renderer ja scheinbar bei jeder kleinsten Mausbewegung aufgerufen wird, möchte ich hier möglichst performant arbeiten, um unnötige Belastung zu vermeiden

Viele Grüße
Andi
 
In nem Renderer würde ich (pauschal) jede Art von Schleife als Falsch ansehen.

--> while (whitespace==true){ ist nicht gut
 
pack das ins Model, so dass nicht einfach Strings abgegeben werden sondern ein Spezialobjekt, aus dem du die Hintergrundfarbe ablesen kannst
 
und bei dieser prüfung
Code:
if (((value.toString().endsWith(" ")) || (value.toString().startsWith(" "))) && (whitespace == true) ) {
                setBackground(Color.MAGENTA);
                System.out.println("Whitespace gefunden");
            }

würde ich wennschon zuerst überprüfen, ob überhaupt whitespace true ist. wenn nicht, dann wird der rest der abfrage gar nicht erst ausgewertet (kann bei mehreren tausend zeilen wie du sagst) mitunter zeit einsparen...

also so:
Code:
if ( (whitespace == true) && ((value.toString().endsWith(" ")) || (value.toString().startsWith(" "))) ) {
                setBackground(Color.MAGENTA);
                System.out.println("Whitespace gefunden");
            }

aber ich finde auch, dass du das im model erledigen solltest. zumindest solltest du im model festlegen, ob es speziell angezeigt werden soll (true false, oder wenn mehrere zustände geben soll mit konstanten) und welche farbe du dann nimmst, entscheidest du dann im renderer, weil da gehört es auch meiner meinung nach hin...
 
Wie entlocke ich einem neuem Objekt denn die Farbinformation?

Habe jetzt ein Objekt erstellt, welches den String und eine Farbinfo enthält. Im Model wird in der getValueAt Methode der String und eine Farbinfo ins Objekt geschrieben. und dieses dann returnt.

Hab dem Objekt eine Methode gegeben, die die Farbinfo ausspucken soll. Wenn ich aber jetzt im Renderer Versuche mit value.getFarbInfo diesen Wert zu bekommen, geht das nicht. Wie dann=
 
ich nehme an, das value ist vom Typ java.lang.Object, oder? Dann musst du zuerst noch auf dein Objekt casten und dann steht auch die methode getFarbInfo zur Verfügung...
 
Ah Supi, das funzt soweit 😀

Jetzt hab ich grad ein anderes Problem bekommen: Vorher konnte man ganz einfach per Doppelklick in die Zelle und den Inhalt verändern. Mit dem Spezialobjekt geht das nun nicht mehr. Wie bekomme ich das wieder hin?
 
Andi0815 hat gesagt.:
Vorher konnte man ganz einfach per Doppelklick in die Zelle und den Inhalt verändern. Mit dem Spezialobjekt geht das nun nicht mehr. Wie bekomme ich das wieder hin?

Kommt schon, weiß das denn keiner? 🙁
 
Jo,

die JTable weiß nicht, wie sie dein Objekt bearbeiten soll. Brauchst also zu dem Renderer noch einen Editor. (siehe FAQ)

Gruß
Mag1c
 
Sodele. Habs jetzt so umgeschrieben, das im Model ein Objekt mit Farbinfo übergeben wird, das im Renderer ausgelesen wird. Funzt soweit.

Jetzt habe ich nen Editor geschrieben, der den Inhalt der Zellen neu schreibt.

Jetzt ist nur das Problem: Wenn in der Vorhandenen geladenen Tabelle der Wert "Vorname" vorkommt, macht er den Hintergrund rot, wie gewünscht. Wenn ich diesen Wert aber dann neu eintrage, macht ers nicht mehr rot, so als ob es den wert nicht geben würde, woran könnte das liegen?
 
Hi,

Hast du geprüft, ob dein eingegebener Wert auch tatsächlich so wie gewünscht im TableModel ankommt (setValueAt(...)). Wenn das korrekt ist, mußt du mal dein TableModel und den Renderer zeigen.

Gruß
Mag1c
 
Der String muss ja ankommen. Ich seh ihn ja schließlich 😀

Also die Werte werden immer als String behandelt. Gespeichert als ein zweidimensionales String Array im Model. Einzig dem übergeben der Daten vom Model an den Renderer wird der String als Objekt mit Farbinfo übergeben.

Wenn jetzt mit dem Editor ein String geschrieben wird, der dann an das Model übergeben wird, müsste das Model doch dann den String lesen können, erkennen, das es ein gesuchtes Wort ist, es als Objekt mit Farbinfo an den Renderer übergeben. Machts aber nicht. Es wird nur angezeigt, ohne Farbinfo
 
Argh ich bin so dumm!

Soll ich dir mal erzählen warum es nicht ging? Der Editor erbt von der JEditorPane. Ich habe das editieren der Zelle immer mit einem Return abschlossen. Und jetzt rate mal, der Cursor geht in eine neue Zeile und ist nicht mehr sichtbar und man denkt, der hat die Zelle geändert, dabei hat er nur einen Zeilenumbruch eingefügt. Deshalb wurde das auch nicht mehr gefunden *gmpf*
Auf sowas muss man erstmal kommen
 
Hmm ich hab JEditorPane genommen, weil beim JTextField beim editieren innerhalb der Tabelle so ein unschöner Rahmen ist, wo dann das Wort abgeschnitten wird. Dem JEditorPane kann man den Zeilenumbruch nicht abstellen oder?
 
Hi,

damit kannst du die Zellen-Höhe korrekt einstellen:

table.setRowHeight(new JTextField().getPreferredSize().height);

und damit machst du den Rand weg:

textField.setBorder(null);

sieht absolut sauber aus bei mir.

Gruß
Mag1c
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben