[Java] Scrollbares Riesen-Widget

Gast #2325534
Lesenswert?

Ich möchte eine Binärdatei, welche durchaus auch mal ein GByte groß sein 
kann, als "Spannungs/Bitamplituden"-Graphen darstellen.

Das Problem der Datenquelle ist gelöst (NIO, Speicherabbild mit 
wanderndem Fenster).

Bestehen bleibt das Problem der Darstellung. Bis jetzt habe ich eine 
eine von JFrame abgeleitete Darstellungsklasse, welche die 
"Scrollable"-Schnittstelle implementiert und innerhalb eines 
JScrollViews dargestellt wird.

In dieser Darstellungsklasse habe ich die Methode 
"paintComponent(Graphics g)" überschrieben, um den Graphen zu zeichen.

Frage: ist dies so optimal oder sollte man von einer "primitiveren" 
Klasse ableiten und/oder eine noch mehr auf den unteren Ebenen 
angesiedelte Methode (paint()...) überschreiben?
Persönliche Seite #2325548
Lesenswert?

paintComponent(Graphics g) ist genau richtig, die Ableitung von JFrame 
aber irgenwie "merkwürdig"... leite einfach von JComponent ab.

Optimieren kannst du das ganze noch indem du ggf. die Region welche neu 
gezeichnet werden soll berücksichtigts, aber solange das nicht millarden 
Datenpunte sind macht das kaum einen Unterschied.
Persönliche Seite #2325846
Lesenswert?

An welcher Stelle kommt es zum Überlauf? Java biete seit ewig Zeiten das 
Graphics2D Objekt an welches in Double Koordinaten arbeitet, "Standard" 
Graphics Objekte kann man in Swing bedenkenlos auf Graphics2D casten.

> JFrame war eine Gewohnheitstat
Ganz schlechte Gewohnheit, GUI Klassen (insbesondere JFrame) sollte man 
nicht "einfach so" überschreiben, das ist einmal schlechter Stil und 
macht refactorings etc. extrem schwierig, ebenso wie die Kompatibilität 
bei neuen Versionen.
Gast #2326956
Lesenswert?

JFrame: mea culpa.

Beim Clipping-Rechteck. Auch wenn ich mit getMinX() die double-Werte 
abfrage, ab einer bestimmten Größe des Views kommen die internen 
Berechnungen anscheinend durcheinander (sind allerdings auch 2^20 Bits=1 
MBit)


Wenn ich den View ganz nach links scrolle bekomme ich statt 0 einen Wert 
von 7230.

super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.getClipBounds(clippingRectange);
long firstBit=(long) 
java.lang.Math.floor((clippingRectange.getMinX()-offset)*scale);

scale ist dabei 1.0/Bitbreite_in_Pixeln, offset die horizontale 
Einrückung.

Ich habe jetzt angefangen, das Window-Viewport-Konzept selbst 
umzusetzen.

Stichwortartig:
 - Übergeordnetes Scroll-Element mit null-Layout, in doLayout werden 
interner
   Viewport und horizontaler Scrollbalken positioniert.
 - Viewport-Implementierung, welche einen bestimmten Ausschnitt des 
Bitstroms
   als Graphen darstellt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren