2016-03-20 9 views
1

Ich habe eine JTable mit drei Spalten. Für jede Zeile habe ich ein Wort, seinen Typ und die Anzahl der Vorkommen; Zum Beispiel im nächsten Bild ist der String "Rosing Prize" zwei Mal präsent.Von JTable zu Histogramm - Swing

enter image description here

Ausgehend von diesem JTable ich ein Histogramm bauen wollen, dass die erste und die letzte Spalte als Eingabe verwendet. Die erste Spalte ist der Name von Bars und die letzte ist seine Höhe; Wenn der Benutzer einige Zeilen auswählt, werden sie im Histogramm dargestellt.

Zum Beispiel in dieser Situation I 4 Zeilen haben gewählt:

enter image description here

Der Ausgang gibt vier J-Frames: der erste mit einer einzigen Stange (das ist die erste Reihe); im zweiten J-Frame habe ich zwei Balken (erste und zweite Reihe); im dritten JFrame gibt es 3 Bars für die erste, zweite und dritte Reihe und schließlich in der vierten und letzten JFrame ich die richtige Ausgabe habe: enter image description here

Ich dachte über zwei Möglichkeiten, dieses Problem zu beheben:

  1. um ein Jbutton hinzuzufügen und nachdem man es drückt, werden die ausgewählten Zeilen im Histogramm
  2. gezeichnet, um alle JFrame zu einer ArrayList hinzuzufügen und nur die letzte zu drucken.

Gibt es bessere Lösungen?

+0

Sicher. Fügen Sie ein JButton hinzu und zeichnen Sie die ausgewählten Zeilen in einem Histogramm auf einem JPanel. –

+0

Ok. Das ist nicht schwer. Aber ist es möglich, ein Histogramm ohne JButton-Druck zu malen? – DistribuzioneGaussiana

+0

Möchten Sie wirklich jedes Mal ein neues Histogramm zeichnen, wenn der Benutzer eine oder mehrere JTable-Zeilen auswählt? Wie erkennen Sie, wenn der Benutzer die Auswahl der Zeilen abgeschlossen hat? –

Antwort

2

Wenn ich Ihre Frage richtig verstehe, löst ListSelectionListener Ihr Problem.

eine Auswahl Zuhörer zuerst definieren:

class MySelectionListener implements ListSelectionListener { 

fügen Sie es dann auf Ihre Auswahl Modell Tisch:

MySelectionListener selectionListener = new MySelectionListener(); 
table.getSelectionModel().addListSelectionListener(selectionListener); 

Edit:

ein MouseListener erstellen. Dann füge es zu deiner Tabelle hinzu. Hier ist ein Arbeitsbeispielcode:

import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.JFrame; 
import javax.swing.JTable; 

public class TableTest { 
    JFrame window = new JFrame(); 

    private TableTest() { 
     createWindow(); 
    } 

    public void createWindow() { 
     Object rowData[][] = { { "Row1-Column1", "Row1-Column2", "Row1-Column3" }, 
       { "Row2-Column1", "Row2-Column2", "Row2-Column3" }, 
       { "Row3-Column1", "Row3-Column2", "Row3-Column3" } }; 
     Object columnNames[] = { "Column One", "Column Two", "Column Three" }; 
     JTable table = new JTable(rowData, columnNames); 
     table.addMouseListener(new SelectionListener(table)); 

     window.add(table); 
     window.pack(); 
     window.setVisible(true); 

    } 

    public static void main(String[] args) { 
     new TableTest().createWindow(); 
    } 
} 

class SelectionListener extends MouseAdapter { 
    JTable table; 

    public SelectionListener(JTable table) { 
     this.table = table; 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     int[] rows = table.getSelectedRows(); 

     for (int i = 0; i < rows.length; i++) { 
      System.out.println(rows[i]); 
     } 
    } 
} 
+0

Es tut mir leid, wenn ich nicht klar war, aber das ist nicht mein Problem. Ich habe meinem Tabellenmodell einen 'ListSelectionListener' Listener hinzugefügt. Das Problem ist, dass wenn ich mehr als eine Zeile ausgewählt habe, der Listener für jede ausgewählte Zeile aufgerufen wird. (Wenn beispielsweise 4 Zeilen ausgewählt sind, wird mein Listener für eine ausgewählte Zeile, für zwei ausgewählte Zeilen, für 3 ausgewählte Zeilen und für 4 ausgewählte Zeilen aufgerufen). – DistribuzioneGaussiana

+1

Haben Sie den Maus-Listener versucht? Auf 'mouseReleased()' Methode können Sie die ausgewählten Zeilen abrufen und das Diagramm zeichnen. – rdonuk

+0

Gute Idee. Ich werde es dir danken! – DistribuzioneGaussiana

Verwandte Themen