skorpionking Geschrieben 26. November 2009 Geschrieben 26. November 2009 Hallo zusammen. Wie der Titel schon verrät, versuche ich gerade eine JTable mit Inhalt um 90 Grad gegen den Uhrzeigersinn gedreht darzustellen. Die besagte Tabelle liegt dabei in einem JScrollPane. Die Drehung der Tabelle an sich habe ich schon einigermaßen hinbekommen, indem ich in einer von JTable abgeleiteten Klasse namens "RotateTable" deren Methode paintComponent() wie folgt überschrieben habe: import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.JTable; import javax.swing.event.ListSelectionEvent; public class RotateTable extends JTable { @Override protected void paintComponent(Graphics g) { Graphics2D twoDee = (Graphics2D) g; int xRot = this.getWidth()/2; // x-Koordinate für Mitte int yRot = this.getHeight()/2; // y-Koordinate für Mitte twoDee.rotate(-Math.PI / 2, xRot, yRot); super.paintComponent(g); } } Lediglich der TableHeader wird noch im Urzustand, also ungedreht, oberhalb der gedrehten Tabelle gezeichnet. Dieser muss also irgendwie noch mitgedreht werden. Weiterhin soll die gedrehte Tabelle aber auch genau dieselbe Funktionalität, wie eine nichtgedrehte Tabelle aufweisen. Dazu zählen z.B. Selektieren von Zeilen, Sortieren, anklicken, etc. Wenn ich jedoch auf die gedrehte Tabelle klicke, selektiert diese die Zeilen derzeit noch nach dem ungedrehten "Klickmodel". Kann mir möglicherweise jmd. von euch bei meinem Problem weiterhelfen? Schonmal Danke im Voraus. MFG skorpionking Zitieren
Dragon8 Geschrieben 27. November 2009 Geschrieben 27. November 2009 Interessantes Problem. Aber ich denke dass wird sehr kompliziert. Die JTable ist eine wirklich sehr komplexe Komponente. Da wird es nicht nur reichen wenn du beim Zeichnen die Tabelle einfach drehst, weil ja trotzdem die interne Logik der Tabelle noch immer davon ausgeht im Normalzustand zu sein und auch so reagiert. Du dürftest ja von vorne herein ja eigentlich schon das Problem haben, dass die Tabelle nicht mehr richtig in deine Anwendung passt weil die Methoden getMinimumSize() und getPreferredSize() dem LayoutManager auch noch immer die ungedrehte Größe ausgeben und damit der LayoutManager die Tabelle vollkommen falsch anordnet. Das ist nur ein Beispiel was Probleme verursacht, wie gesagt die JTabellen eigene interne Logik dürfte ja auch Großteils damit nicht klar kommen. Wenn ich mal fragen darf, wozu brauchst du das denn? Zitieren
skorpionking Geschrieben 27. November 2009 Autor Geschrieben 27. November 2009 Ja, da hast du recht, das ist es auch. Das Hauptproblem ist ja derzeit auch noch die interne Tabellenlogik, die mir Probleme macht. Das von dir angesprochene Problem mit den richtigen Abmessungen der Tabelle existiert auch ein wenig, aber das ist nicht so gravieriend. Kennst du manchmal eine günstige Herangehensweise, wie ich vlt. die interne Tabellenlogik dementsprechend umstrukturieren könnte? Bzw. existiert eine andere einfachere Möglichkeit, den Tabelleninhalt inkl. Header gedreht darzustellen? Bin da für alternative Vorschläge offen. Um die Frage zum Nutzen dieser Sache zu beantworten: Ich schreibe derzeit an einem Projekt, bei dem es erforderlich ist, eine solche Tabelle mit einzubinden und habe diesbezüglich leider wenig Entscheidungsspielraum. MFG skorpionking Zitieren
Dragon8 Geschrieben 27. November 2009 Geschrieben 27. November 2009 (bearbeitet) Ich hatte teilweise schon einen Ansatz, das Problem ist aber, du wolltest ja dass Funktionen wie Zeilen makieren und Spalten sortieren noch immer wie gewohnt funktionieren. Ich wäre das so angegangen, dass du dir zu erst ein eigenes TableModel erstellst, dass kannst du direkt von DefaultTableModel ableiten, weil du nur die getValueAt(int row, int column) Methode überschreiben brauchst. Das DefaultTableModel bringt dann schon die restlichen Methoden für die Speicherung und Verwaltung der Daten mit, weswegen man sich darum erstmal keine Sorgen machen muss. Die getValueAt() Methode bekommt die Koordinaten (row, column) der Zelle übergeben für die es den Wert zurück geben soll. Also hätte man zur erst einmal die Koordinaten in der getValueAt() Methode so umbiegen müssen, dass sie jeweils die Werte so zurück liefert als wäre die Tabelle einmal um 90° gedreht. Die Werte übergibst du dann an die getValueAt() Methode vom DefaultTableModel und lässt der Methode die restlichen Arbeit erledigen. Danach wäre ein eigener TableCellRenderer dran gekommen, der als Komponente für die JTable ein eigenes JLabel zurück gibt das den Inhalt um 90° gedreht anzeigt. Nach den beiden Schritten müsste die Tabelle schonmal ansatzweise so aussehen, als wenn sie gedreht wäre, würde aber trotzdem im Zusammenspiel mit anderen Komponenten und dem LayoutManager keine Probleme bereiten. Den ColumnHeader hätte man dann deaktiveren können. Dann müsste man sich einen RowHeader basteln. So genaue Gedanken hatte ich mir darum noch nicht gemacht, ich hatte aber im Internet schonmal Lösungsansätze gesehen wie das machbar wäre. Jedoch bleibt dann als Problem, die Tabelle ist nicht mehr wie gewohnt zu bedienen, da nun beim ehemaligen makieren von Zeilen, Spalten makiert werden. Das mit dem eigenem RowHeader dann auch sowas wie eigenes Anordnen der Spalten nicht mehr funktioniert, kommt ebenfalls dazu. Deswegen habe ich den Lösungsansatz erstmal noch nicht weiter verfolgt. Bearbeitet 27. November 2009 von Dragon8 Zitieren
skorpionking Geschrieben 27. November 2009 Autor Geschrieben 27. November 2009 Ok, ich werde deinen Ansatz mal weiterverfolgen und schauen, wie weit ich damit komme. Zur Not muss ich mir da für das Sortieren was spezielles überlegen/basteln. Schonmal Danke für die Idee. MFG skorpionking Zitieren
Dragon8 Geschrieben 27. November 2009 Geschrieben 27. November 2009 Ich hab mir gerade auch mal die Antwort bei javacore.de durchgelesen die dort auf deine Frage kam (Java Forum @ javaCore.de :: Thema anzeigen - JTable um 90 Grad nach links rotieren). Nachdem ich etwas darüber nachgedacht habe, könnte man das auch als Lösungansatz benutzen. Du müsstest dir dann eine Wrapper Klasse basteln die sich selber als Komponente ausgibt und die Größe entsprechend deiner 90° gedrehten JTable hat. Dann fügst du deiner Komponente die JTabel hinzu und schreibst die paint() Methode deiner eigenen Komponente um, sodass alles gedreht gezeichnet wird. Danach müsstest du dann alle MouseEvents, und eventuell auch Tastatur Events, die auf deine Komponente losgelassen werden so umformen dass sie an die JTable weitergegeben werden, als wenn jemand auf die normal gerichtete JTable klickt. Ich hoffe mal dass war jetzt verständlich :beagolisc Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.