Swing Realisierung einer Korrelationsmatrix

Status
Nicht offen für weitere Antworten.

banshee

Bekanntes Mitglied
hi Leute,

ich würde so etwas gerne mit Swing basteln, weiß aber nicht, mit welchen Komponenten man das am besten zusammenbaut. Als Eingabe werden Spalten aus einer Tabelle ausgewählt (im Prinzip beliebig viele, meistens aber so um die 5-50) und dann soll eine Matrixdarstellung farblich darstellen, welche Spalte wie stark von einer anderen abhängt.
Man trägt also auf der x- und y-Achse die Spalten ab und malt jedes Viereck mit einer Farbe aus. Wie realisiert man das am besten? Erstellt man sich dafür dann einfach dynamisch ganz viele Labels und Container oder ist Java2D hier doch die bessere Wahl?
 

Marco13

Top Contributor
Ich hatte mal vor, ein Raster der Größe ... joa, 25x25 bis ... (bliebig groß, aber so 250x250) darzustellen. Dieses Raster sollte nach Spalten sortiert werden können. Deswegen hatte ich kurz angesetzt, dort eine JTable zu verwenden, aber das war grottenlangsam. Mit JLabels und JComponents dürfte es noch langsamer sein. Ich hatte dann einfach ein "GridPanel" erstellt, das so ein Raster einfach mit Java2D malt, und das war schön schnell.

Bei 5x5 bis 25x25 fällt das mit der Geschwindigkeit sicher nicht so ins Gewicht. Aber vielleicht ist hier die Empfehlung darum besonders wichtig, Modell und Visualisierung zu trennen. Wenn du ein Datenmodell für deine Korrelationsmatrix hast, und dann (ohne groß was ändern zu müssen) von einem CorrelationPanelWithJLabels umschalten kannst zu einem CorrelationPanelWithJava2D kannst du beides mal antesten, und schauen, welches dir geeigneter erscheint. Da du (bisher) noch keine Detaillierteren Anforderungen genannt hast, ist eine Entscheidung hier erstmal schwierig.
 

banshee

Bekanntes Mitglied
hi,

hab nochmal ein paar Fragen dazu:

1) Ich wollte auch einfach mit Java2d auf einem JPanel rumzeichnen. Das ganze hab ich noch in eine JScrollPane gepackt, aber das erkennt jetzt ja logischerweise nicht, wann die Zeichnerei aus dem Bild rausgeht und es scrollen muss. Wie krieg ich das hin?

2) Bei mir hängt die Anzahl der Zeilen/Spalten, die gezeichnet werden von einer Eingabedatei ab. D.h. ich muss das JPanel neu zeichnen, nachdem die Datei vom user geladen wurde. Danach einfach die repaint()-Methode des Panels aufzurufen funktioniert aber nicht.

Weiß da jemand weiter?
 

Marco13

Top Contributor
1. Du mußt dem Panel eine passene PreferredSize geben.
zeichenPanel.setPreferredSize(new Dimension(1000,1000));

2. repaint() sollte reichen. Beschreib' den Fehler ggf. genauer.
 

banshee

Bekanntes Mitglied
Hallo,

vielen Dank erstmal. Es geht schrittweise weiter, aber es tauchen natürlich immer wieder Kleinigkeiten auf, für die mir noch die nötige Erfahrung fehlt ;)

Hier mal ein Screenshot der Anwendung bisher:



1) Der Inhalt der TabbedPane soll immer bis zum unteren Bildschirmrand gehen. Auf dem JFrame liegt ein BorderLayout mit horizontaler Trennzeile. Die Leiste oben zum Datei laden ist die linke, die TabbedPane die rechte Komponente. In der Java Doku steht drin, dass sich die Komponenten in einem BorderLayout automatisch den freien Platz nehmen. Wieso tun sie das also hier nicht?

2) Die Matrix da zeichne ich einfach per Java2D auf ein JPanel. Dazu hab ich die paintComponent überschrieben und das ganze noch in eine ScrollPane gepackt. Lustigerweise passiert das, was auf dem Screenshot zu sehen ist, wenn ich scrolle. Woran liegt das?

3) Es fehlen natürlich noch die Beschriftungen. Wie mache ich die am Besten? Über die Datei werden die Zeilen/Spaltennamen eingelesen und sollen dann jeweils links daneben und oben dran stehen. Ich hatte mir jetzt gedacht, einfach erstmal links alle Spaltennamen aufzuschreiben und die Länge der längsten Spalte zu speichern, um den Abstand zu kennen, den die Matrix braucht. Dann rotiere ich den Viewport einfach um -90° und zeichne nochmal genau das gleiche, sodass die Spaltennamen um -90° gedreht oben drüber stehen. Funktioniert das so oder kann man sicher das erneute Zeichnen irgendwie sparen, indem man den Viewport irgendwie dupliziert?

Vielen Dank schonmal
 

Marco13

Top Contributor
1) Der Inhalt der TabbedPane soll immer bis zum unteren Bildschirmrand gehen. Auf dem JFrame liegt ein BorderLayout mit horizontaler Trennzeile. Die Leiste oben zum Datei laden ist die linke, die TabbedPane die rechte Komponente. In der Java Doku steht drin, dass sich die Komponenten in einem BorderLayout automatisch den freien Platz nehmen. Wieso tun sie das also hier nicht?

Ein BorderLayout hat keine "Trennlinie".... was genau meinst du?



2) Die Matrix da zeichne ich einfach per Java2D auf ein JPanel. Dazu hab ich die paintComponent überschrieben und das ganze noch in eine ScrollPane gepackt. Lustigerweise passiert das, was auf dem Screenshot zu sehen ist, wenn ich scrolle. Woran liegt das?

Code:
public void paintComponent(Graphics g)
{
    super.paintComponent(g); // Wichtig!
    // Hier der rest...
}


3) Es fehlen natürlich noch die Beschriftungen. Wie mache ich die am Besten?
Das kann (wie man an deiner Beschreibung sieht) ein bißchen fummelig werden. I.a. kann man aber alles Zeichnen, was man zeichnen will, und dann die Transform vom Graphics so setzen, dass man gedrehte und verschobene Texte malen kann
Code:
public void paintComponent(Graphics g)
{
    super.paintComponent(g); // Wichtig!
    // Hier der rest...

    Graphics2D g2 = (Graphics2D)g;
    g2.translate(...);
    g2.rotate(...);
    g2.drawString(...); // Malt verschoben und rotiert....
}
 

banshee

Bekanntes Mitglied
Ein BorderLayout hat keine "Trennlinie".... was genau meinst du?

Ja, mein Fehler. Mein Ziel ist es eigentlich nur, die SplitPane aus der Abbildung immer genauso groß zu haben, wie das Fenster. Ich benutze derzeit noch ein BorderLayout, glaube aber, dass es unnötig ist.

Die Beschriftungen hab ich soweit auch schon, nur eine Sache verwundert mich:

[highlight="java"]
Graphics2D g2 = (Graphics2D)g;
int maxLen = 0;

Font font = new Font(Font.SERIF, Font.PLAIN, 24);
Hashtable<TextAttribute, Object> map = new Hashtable<TextAttribute, Object>();
map.put(TextAttribute.KERNING, TextAttribute.KERNING_ON);
font = font.deriveFont(map);
// get metrics from the graphics
FontMetrics metrics = g.getFontMetrics(font);

for(int i = 0; i < featurenames.size(); i++)
{
if(metrics.stringWidth(featurenames.get(i)) > maxLen)
maxLen = metrics.stringWidth(featurenames.get(i));
}

maxLen = metrics.stringWidth("Test");
g2.drawString("Test", 0, 100);
g2.drawString("Test", maxLen, 100);[/highlight]

Wenn ich das zeichnen lasse, ist zwischen beiden Wörtern trotzdem noch ein Abstand. Muss ich da noch irgendwo umrechnen?

/edit: Mir ist noch etwas eingefallen:

Den JTable würde ich gerne durch clicks in die Headerzeile sortieren. Die Daten werden dann alle über ein TableModel als Objects eingelesen und wahrscheinlich vom AutoTableSorter als String ausgelesen, was bei numerischen Werten dazu führt, dass 400 vor 9 kommt. Ich habe jetzt schon gelese, dass ich mir einen eigenen Sorter mit implementation des Comparable interfaces schreiben muss, aber wie bringe ich dem Table bei, dass er je nach Datentyp einen anderen Sorter benutzen muss? Im Table sind floats, longs und Strings drin...
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Das mit dem Text hab ich jetzt nicht nachvollzogen. (Kein KSKB, keine Zeit)

Zum sortieren: Du kannst bei deinem TableModel auch die passende ColumnClass zurückgeben: TableModel (Java 2 Platform SE 5.0))
Code:
class SpecialTableModel extends DefaultTableModel
{
    public Class getColumnClass(int index)
    {
        if (index == 2) return Float.class; // Wenn Spalte 2 float-Werte enthält...
        return super.getColumnClass(index);
    }
}
 

banshee

Bekanntes Mitglied
Was würde ich nur ohne dich machen ;)

[highlight="java"]
import javax.swing.*;
import java.awt.*;
import java.awt.font.*;
import java.util.*;

public class TestPanel extends JPanel
{
public TestPanel()
{

}

@Override
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D)g;

Font font = new Font(Font.SERIF, Font.PLAIN, 24);
Hashtable<TextAttribute, Object> map = new Hashtable<TextAttribute, Object>();
map.put(TextAttribute.KERNING, TextAttribute.KERNING_ON);
font = font.deriveFont(map);
// get metrics from the graphics
FontMetrics metrics = g.getFontMetrics(font);

int strWidth = metrics.stringWidth("Test");
g2.drawString("Test", 0, 100);
g2.drawString("Test", strWidth, 100);
}

private static void createAndShowGUI() {

//Create and set up the window.
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//Create and set up the content pane.
TestPanel newContentPane = new TestPanel();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);

//Display the window.
frame.pack();
frame.setVisible(true);
}


public static void main(String[] args)
{
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
[/highlight]

Hier ist auch noch eine kompilierfähige Version von dem Zeichenproblem. Was ich mit dem Beispiel sagen wollte: Ich messe die Länge des Strings "Test", zeichne dann 2x den String "Test", wobei der erste um die gemessene Länge verschoben wird (also müsste 2x "Test" nahtlos aneinander stehen), allerdings ist zwischen beiden Wörtern ein kleiner Abstand.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Ollek Realisierung: JTable zur Laufzeit mit neuen Daten füllen AWT, Swing, JavaFX & SWT 3
W Realisierung Gradient in der Titlebar JInternalFrame AWT, Swing, JavaFX & SWT 7
P JTree aus Datenbank für Kategorien-Realisierung AWT, Swing, JavaFX & SWT 2
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
T VerifyListener - Ersetzen einer 0 AWT, Swing, JavaFX & SWT 5
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
N Dropshadow setzen bei einer Gruppe von Tiles, die sich jeweils in einer Stackpane befinden, welche in einer Gridpane angeordnet sind. AWT, Swing, JavaFX & SWT 0
M Daten zufällig Einlesen aus einer Datei (binäres Format) AWT, Swing, JavaFX & SWT 7
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
Linjutsu Den Inhalten aus einer ArrayList Bilder zuweisen (Kartenspiel) AWT, Swing, JavaFX & SWT 8
H JavaFX Timeline II: Verschieben einer ImageView AWT, Swing, JavaFX & SWT 16
I Hilfe bei dem Erstellen einer SQL Abfrage aus gewählten JComboBoxen AWT, Swing, JavaFX & SWT 5
L Swing TextPanel Schrift untereinander und auf einer Höhe AWT, Swing, JavaFX & SWT 3
mananana Mögliche probleme die in einer GUI passieren Können AWT, Swing, JavaFX & SWT 6
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
melaniemueller Wortliste in einer Datei ablegen AWT, Swing, JavaFX & SWT 12
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
Jose05 JavaFx Fxml: GUI aus einer anderen Klasse starten AWT, Swing, JavaFX & SWT 1
U Was genau ist das Objekt einer affinentransformation? AWT, Swing, JavaFX & SWT 1
B JavaFX Prüfen ob ein Objekt sich mehrmals in einer Liste befindet AWT, Swing, JavaFX & SWT 5
mac2010 JavaFX Einbindung einer Karte AWT, Swing, JavaFX & SWT 1
donnico2 Objekte in der GUI ausgeben mit Hilfe einer DAO AWT, Swing, JavaFX & SWT 1
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
W Aufrufen einer bestimmten Scene mit if-Bedingung AWT, Swing, JavaFX & SWT 4
J Ablaufsteuerung/Anleitung machen mit JDialog und einer Zustandsmaschine AWT, Swing, JavaFX & SWT 1
missy72 JavaFX Wiederholen einer IF-Abfrage beim erneuten Öffnen einer Stage AWT, Swing, JavaFX & SWT 11
missy72 JavaFX TableView / TableColumn / ObservableList / zwei Werte in einer Zelle AWT, Swing, JavaFX & SWT 2
S JavaFX - mit Listener Veränderungen in einer TableView abhören AWT, Swing, JavaFX & SWT 3
missy72 JavaFX ObservableList in einer ArrayList speichern. AWT, Swing, JavaFX & SWT 7
HoT Sortieren von ein paar Zeilen in einer Tabelle, aber nicht die ganze Tabelle AWT, Swing, JavaFX & SWT 3
kodela Swing Element einer JComboBox ausgrauen AWT, Swing, JavaFX & SWT 3
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
H Daten aus einer XML(x83-Datei) in einem JFrame anzeigen lassen AWT, Swing, JavaFX & SWT 9
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
N Einer TextArea ein ScrollPane hinzufügen AWT, Swing, JavaFX & SWT 8
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1
K Probleme bei der Erstellung und Ausführung einer Jar Datei AWT, Swing, JavaFX & SWT 2
A checkbox in einer TableView abhängig von einem anderen Celleninhalt disablen AWT, Swing, JavaFX & SWT 1
G Verknüpfung einer pdf Datei AWT, Swing, JavaFX & SWT 2
B Ausgaben einer Umrechnung vom Textfeld in ein Label AWT, Swing, JavaFX & SWT 2
F jTree und das Model aus einer eigenen Klasse AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
N Wie kann ich zwei Grafiken in einer Oberfläche anzeigen lassen? AWT, Swing, JavaFX & SWT 8
@SupressWarnings() JavaFX Auf den Controller einer ListCell zugreifen AWT, Swing, JavaFX & SWT 4
Drachenbauer Swing Wie ändere ich den Hintergrund vom Anzeigefeld einer JComboBox, die nicht zum Hineinschreiben offen steht? AWT, Swing, JavaFX & SWT 32
H 3 verschiedene Nachrichten in einer FXML View die Infos kommen aus DB AWT, Swing, JavaFX & SWT 4
karlmasutra JavaFX Zugriff auf eine erzeugte Scene aus einer anderen Klasse AWT, Swing, JavaFX & SWT 1
S Java GUI durch variable Größe einer Map anpassen AWT, Swing, JavaFX & SWT 3
B Textfelder in einer ListView ausgeben AWT, Swing, JavaFX & SWT 13
J Searchfunktion auf einer MS Access Datenbank AWT, Swing, JavaFX & SWT 7
B Text im Tetfeld in einer TableView darstellen AWT, Swing, JavaFX & SWT 20
M Inhalte einer FlowPane AWT, Swing, JavaFX & SWT 4
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
E Prinzip: wie man Ereignisse in einer GUI verarbeit. Frage zum Design? AWT, Swing, JavaFX & SWT 10
FRI3ND JavaFX: Wie kann ich einer Scene Argumente übergeben? AWT, Swing, JavaFX & SWT 14
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
G JavaFX JavaFX-Dialog aus einer Nicht-JavaFX-Anwendung heraus AWT, Swing, JavaFX & SWT 1
1 Swing Progressbar benutzen um Fortschritt einer Methode anzuzeigen AWT, Swing, JavaFX & SWT 4
K JavaFX ViewTable mit einer LinkedList befüllen AWT, Swing, JavaFX & SWT 3
L CardLayout in einer Klasse? AWT, Swing, JavaFX & SWT 2
J Compiler in der JavaFX stop() Methode warten lassen bist eine Aktion in einer anderen Scene gemacht AWT, Swing, JavaFX & SWT 5
D Java FX Image in einer Webanwendung annotieren und den Bereich ausschneiden AWT, Swing, JavaFX & SWT 0
L Java- UI zweites Fenster aus einer anderen Klasse öffnen durch ButtonClick AWT, Swing, JavaFX & SWT 4
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing Ausführung einer SwingWorker Klasse stoppen AWT, Swing, JavaFX & SWT 4
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
xYurisha Aus einer Gui Buttons, Label und ProgessBars entfernen AWT, Swing, JavaFX & SWT 4
MiMa Selektion aus einer ListView AWT, Swing, JavaFX & SWT 5
J 2D-Grafik Background einer Jpanel Klasse ändern AWT, Swing, JavaFX & SWT 1
J JFram Location aus Konstruktor einer anderen Klasse auslesen AWT, Swing, JavaFX & SWT 10
L Methode zum Füllen einer ComboBox AWT, Swing, JavaFX & SWT 4
J Suche nach einer horizontal aufklappbaren Toolbar AWT, Swing, JavaFX & SWT 1
P Variable einer Eingabe in anderes Textfeld schreiben AWT, Swing, JavaFX & SWT 7
D JavaFX Einbinden einer .fxml AWT, Swing, JavaFX & SWT 1
B Zeile einer Tabelle selektieren AWT, Swing, JavaFX & SWT 1
A Prüfung einer Eingabe auf Gleitkommazahl AWT, Swing, JavaFX & SWT 5
J Suchmaschine einer Datenbank AWT, Swing, JavaFX & SWT 5
Kanda Sorata Inhalt einer .txt Datei einlesen und in ein Label einfügen (JavaFX) AWT, Swing, JavaFX & SWT 2
A Swing JLabels in einer ForEach Schleife an den JPanel anheften (UNO Netzwerkspiel) AWT, Swing, JavaFX & SWT 1
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9
M Auswahl aus einer ListView AWT, Swing, JavaFX & SWT 3
J JavaFX - Felder (Label) in einer ForSchleife bearbeiten AWT, Swing, JavaFX & SWT 4
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
L Dynamischer Aufbau einer Tabelle über Objekte AWT, Swing, JavaFX & SWT 2
C JavaFX Tief setzen in der Überschrift einer Tabellenspalte AWT, Swing, JavaFX & SWT 3
D Swing Größe einer JComboBox im GridBagLayout aufgrund der maximalen Länge der enthaltenen Daten AWT, Swing, JavaFX & SWT 7
R Java FX - Fxml - relative Größenangaben für Breite und Höhe einer TextArea AWT, Swing, JavaFX & SWT 8
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
P Einer JList mit eigenem ListModel einen Eintrag hinzfügen AWT, Swing, JavaFX & SWT 5
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
P JavaFX Slider soll Value erst ab einer bestimmten Bedinung aendern AWT, Swing, JavaFX & SWT 19
M Ausgabe der HSL oder RGB Zusammensetzung einer Farbe (JColorChooser AWT, Swing, JavaFX & SWT 1
X Zeilen aus einer Textdatei einzelnd als String abrufen AWT, Swing, JavaFX & SWT 8
R JavaFX Wert einer ChoiceBox bekommen ohne Lambdas AWT, Swing, JavaFX & SWT 11
W Swing bzgl. Tableskalierung/Darstellung einer Matrix AWT, Swing, JavaFX & SWT 8
F JavaFX ChoiceBox Name als Auswahl bei einer Objektliste AWT, Swing, JavaFX & SWT 4
F JavaFX Mit einer Methode auf Stage zugreifen. AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen


Oben