JTable sowohl Spaltennamen wie auch Spaltenbeschriftungen

  • Themenstarter Themenstarter Gelöschtes Mitglied 56712
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 56712

Gast
Hallo Forum
Wer hätte mir einen Tip wie ich folgendes Problem löse:
ich bräuchte im Header der JTable sowohl die Spalten-Namen und auch die Spalten-Bezeichnung.

Die Spalten-Namen sind identisch mit den Spalten-Namen der DB (z.B. sp1, sp2, sp3, etc.), resp. der Keys in der INI-, xlsx-, csv, usw. /-Datei
Dazu habe ich verschlüsselte Spaltenbezeichnungen, damit bei einem hack nicht gleich klar ist, was in den Spalten für Informationen stehen.

Wie kann ich jetzt die effektiven Spaltennamen beibehalten aber die entschlüsselten Spaltenbeschriftungen setzten/anzeigen?

Der Inhalt der Spalten ist ebenfalls mit eigenem Coder verschlüsselt und wird erst zum anzeigen entschlüsslt.
Darum mach das für mich einen Sinn.
Gruss Richi
 
Zuletzt bearbeitet von einem Moderator:
Jetzt noch einmal aus dem anderen Thread dann hierher umgezogen.

Einfach gefragt wie setzte ich Spaltennamen (werden ja bei new JTable(...) übergeben.
Aber wie überschreibe ich jetzt die Spaltenbezeichnungen? Bis jetzt hat es mir immer die Spaltennamen, auf die ich später zugreife überschrieben... ???
Die Idee ist, dass Du nichts überschreiben musst in der JTable.

Die JTable sollte einfach nur Daten anzeigen, die vorab geladen wurden.
Die Klasse, die diese Daten lädt, die sollte also die entsprechende Umsetzung machen:
  • sp1, sp2, sp3, ... werden also in die entsprechend richtigen Namen geladen. Du hast also dann eine Datenklasse, in denen Du nicht die Felder sp1, sp2, ... hast sondern da hast Du die richtigen Namen
  • Da kann dann auch eine Ver-/Entschlüsselung stattfinden

Die Daten sind also in Datenklassen, in denen nichts verschlüsselt ist und wo alle Namen korrekt sind.
 
Sorry, aber so kann ich ja nicht mit getColumname(c) arbeiten, weil dann der z.B. Vorname heisst.

Folgendes geht nicht:
String spalte = ...getColumname(c);
sql = "UPDATE tabelle SET "+spalte+" = 'neuVorname', WHERE id = 2;
Es gibt in der DB keine Spalte "Vorname", nur z.B "spalte2"

Es müsste also einen ...getColumname(c) (wäre dann spalte2) geben,
obwohl in der Spaltenüberschrift "Vorname" steht.

was habe ich da nicht verstanden?
Meine Methode müsste das Dynamisch erkennen, da ich nicht im Vorraus weiss was Spalten-Namen und Spalten-Bezeichnungen sind.
Und nicht immer ist spalte2 = Vorname.

Vielen Dank
Richi
 
Ich verstehe gerade nicht, an welcher Stelle Du eben genau so Code schreibst. Der Code, der auf die Datenbank zugreift, der sollte das Wissen haben, wie die Spalten heißen. Und daher kannst Du da dann auch das SQL entsprechend bauen. Das alles klingt also etwas danach, dass Du hier Verantwortlichkeiten nicht sauber trennst so dass Du beim erstellen von Datenbankabfragen auf die Columnnames einer JTable zugreifst. Und das sollte so nie sein.

Abhängigkeiten sollten in eine Richtung gehen. Und dann hast Du eine Abhängigkeit hin zu einem Data Access Object. Damit solltest Du keine Abhängigkeit haben zurück. Das ist also ein Argument neben dem separation of concerns.
 
Ich habe es jetzt so glösst:
  1. deklariere eine String[] spNamen;
  2. übergebe aber new JTable(..., spText) -> sind die enschlüsselten Spaltennamen.
  3. setze spNamen = new String[]{...};
  4. und rufe mit spNamen[column] den effektiven Spaltennamen ab (spalte2 oder so)
Ich dachte nur das das so wie z.B. JLabel gehen könnte:
JLabel lab = new JLabel("Name");
lab.setName("spalte2");

Sorry, ich verstehe das halt nicht so richtig.
Aber so scheint es zu klappen.

Gruss Richi
 
Sorry war zu langsam.
Ich verstehe gerade nicht, an welcher Stelle Du eben genau so Code schreibst. Der Code, der auf die Datenbank zugreift, der sollte das Wissen haben, wie die Spalten heißen.
woher? Die Tabelle weiss ja nicht wohin der Eintrag: Zelle(5, 4) hingehört!
Stehe wohl aufm Schlauch...🙁

Was ich machen möchte ist:
Sobald z.B. der Vorname geändert wurde und das Feld mit Tab, resp. Enter verlassen wird, der Eintrag in der Datenbank gespeichert/geupdatet wird

Dazu verwende ich eine Methode die einen SQL-String (Statement) in die DB absetzt > Soweit so Gut.
Aber das SQL-Statement wird beim Verlassen (mit Enter oder Tab oder Klick in ein anderes Feld) sofort generiert, ausser bei ESC.
Und dazu muss ich die SQL sofort aufbauen und das geht soweit ich das verstanden habe direkt mit getSpNamen[column]; am schnellsten.

Jaaa, ich bin etwas von Gestern.

Gruss Richi
 
Vielleicht sollte ich noch Erwähnen:
Das ganze Projekt soll ein MyTabelle.jar ergeben das ich in verschieden anderen Projekte importieren kann und ich mich nicht mehr um den Aufbau der Tabelle kümmern muss.

Woher die Daten auch kommen (Excel, INI-Datei, Access und vorallem MySQL)... ich möchte dann nur noch:
SpaltenNamen, SpaltenText, SpaltenTyp und die allenfalls gesetzte Darstellung übergeben.

Bei MySQL erhalte ich diese Infos mit einem einfachen SQL-Statement.

Dann lese ich die entsprechenden Records und befeuere die JTable.

Im Jar MyTabelle sind alle methoden enthalten wie z.B. Zeileneinfärbung bei MouseEntered/Exited, wenn gewünscht Zebra-Line (wechselnde Zeilenfarbe), Tooltipanzeige wenn Text kleiner als Spaltenbreite ist, die Möglichkeit setHorizontalScrollBar setzen, usw.

MyTabelle hat als extends ein JScollPane. Auch das muss ich künftig nicht mehr in der Hauptanwendung definieren (ausser der Grösse)

Vielleicht hilft das ja zu verstehen, was ich da machen will.
 
Juhui Problem gelösst.
Muss nur noch drei Aufrufe in der Hauptanwendung machen:
  • tabelle = new JTable(new Object[]{spaltenText}) - resp. new JTable(String pfad), - resp. new JTable(String SQL, HashMap connections)
  • tabelle.setSpNamen(new String[]{...});
  • tabelle.setFormate(new Object[]{...});
Den Rest erledigt jetzt mein MyTable.jar
Wenn ich nicht meine Defaults verwenden will, kann ich das mit:
tabelle.setZebraLine(Color), tabelle.setRowHeight(int), tabelle.setGridLine(false) und vieles mehr.

Vielen Dank @KonradN
Richi

ps. Das mit den InstanceOf Fehlern meinerseits hat die Perfomance enorm erhöht. eine Million Records in 1.875 ms geladen.
Vorher 10 sec.
 

Zurück
Oben