Ergebnis des Listeners ermitteln

Status
Nicht offen für weitere Antworten.

daNny

Aktives Mitglied
Hallo Leute!

Ich habe da gerade ein Problem, wo ich es glaube ich total verpeile.

Ich habe mir einen Dialog gebaut, in dem sich eine Tabelle, gefüllt mir Werten, befindet. Jetzt wollte ich erreichen, dass wenn man auf die Spalten des JTableHeader klickt, die ID der Spalte in eine Liste einfügt wird, wenn sie noch nicht drin ist. Falls sie sich schon in der Liste befindet, dann soll sie wieder entfern werden.
Damit will ich erreichen, dass man per Knopfklick nur diese Spalten auslesen kann und diese dann weiterverarbeitet.

Gelöst habe ich das nach einigem Nachlesen nun so:

Code des DIalogs:
Code:
DefaultTableModel tMod = new DefaultTableModel(0, reader.getColumnCount());
this.jTable1.setModel(tMod);
for (String[] s : data) {
    tMod.addRow(s);
}
JTableHeader header = this.jTable1.getTableHeader();
header.addMouseListener(new ColumnHeaderListener());
Ich erstelle also ein neues TableModel und update somit die als Attribut definierte Tabelle. in der Schleife wird diese dann mit den Daten, die ich aus dem Reader bekomme, befüllt.
Danach füge ich dem Header der Tabelle dann einen Listener hinzu, der so aussieht:

Code:
public class ColumnHeaderListener extends MouseAdapter {
    
    @Override
    public void mouseClicked(MouseEvent evt) {
        
        JTable table = ((JTableHeader)evt.getSource()).getTable();
        TableColumnModel colModel = table.getColumnModel();
    
        // Index der angeklickten Spalte
        int spaltenIndex = colModel.getColumnIndexAtX(evt.getX());
        
     }
}
Jetzt fehlt es mir allerdings gerade an der zündenden Idee, wie ich die nun ermittelte ID in den DIalog zurückbekomme, sodass ich diese in eine Liste einfügen bzw. falls schon vorhanden auch wieder löschen kann. Könnte mir da jemand auf die Sprünge helfen?
 
G

Gast

Gast
naja, du brauchst eine Funktion, die den Wert in die Liste einfügt. Diese musst du dann mit dem Ergebnis deiner getColumIndexAt- Funktion aufrufen.
 

HLX

Top Contributor
1 Möglichkeit: JTable ableiten und die Liste hier als als Attribut aufnehmen. Statt JTable die Ableitung im Listener verarbeiten.
 

daNny

Aktives Mitglied
Danke schonmal für deine Antwort.

Dass ich das mit ner Funktion bzw. Methode in ne Liste einfügen/entfernen kann ist mir schon klar. Aber wie komme ich in dem Listener an den Dialog, in dem sich der Header befindet? Ich hatte das mal mit mehreren getParent() aufrufen hintereinander versucht. Die Source steht ja in dem Event drin. Aber irgendwie hatte ich immer nen Casting-Problem.
Das ganze müsste doch bestimmt auch eleganter zu lösen sein.

Also im Dialog könnte ich ja ne öffentliche Methode einfügen, wie:
Code:
public void addColumn(Integer i) {
    if (list.contains(i)) {
        list.remove(i);
    } else {
        list.add(i);
   }
}

Nur irgendwie müsste ich ja auch an die Methode drankommen aus dem Listener heraus ;)
 

daNny

Aktives Mitglied
@ HLX: Das klingt schonmal interessant.

Du meinst quasi, dass ich eine Art TabelleMitListe-Klasse erstelle, die aus JTable abgeleitet ist und zusätzlich eine Liste beinhaltet, die meine selektierten Spalten beinhaltet?

ALso so ungefähr?
Code:
public class TableMitListe extends JTable {
    private List<Integer> list;
    
    public TableMitListe() {
        super();
        this.list = new LinkedList<Integer>();
    }
    
    /**
     * Fügt eine SPalte in die interne Liste ein oder löscht sie, falls sie
     * schon existiert
     * @param i Index der Spalte
     */
    public void addColumn(Integer i) {
        if (list.contains(i)) {
            list.remove(i);
        } else {
            list.add(i);
       }
    }
}

Ich denke, da sollte ich mich mal hinterklemmen
 

daNny

Aktives Mitglied
Die Idee funktioniert bisher sehr gut! Jetzt bin ich allerdings auf einen Fehler gestoßen, den ich absolut nicht nachvollziehen kann! Die Klasse sieht nun so aus:
Code:
public class SelectableColumnTable extends JTable {
    
    /** Die vom Benutzer ausgewählten Spalten */
    private List<Integer> columnSelection;
    
    /**
     * Erstellt eine neue SelectableColumnTable
     */
    public SelectableColumnTable() {
        super();
        this.columnSelection = new LinkedList<Integer>();
    }
    
    
    /**
     * Fügt den Index einer Spalte in die interne Liste ein
     * Falls sich ser Index der Spalte bereits in der internen Liste befindet,
     * so wird er aus dieser wieder entfernt.
     * @param i Index der Spalte
     */
    public void addToColummSelection(Integer i) {
        if (this.columnSelection.contains(i)) {
            this.columnSelection.remove(i);
        } else {
            this.columnSelection.add(i);
        }
    }
    
    @Override
    public void setModel(TableModel dataModel) {
        super.setModel(dataModel);
        this.columnSelection.clear(); 
    }
    
    public int getColumnSelectionCount() {
        return this.columnSelection.size();
    }
    
    /**
     * Leert die interne Liste der ausgewählten Spalten
     */
    public void clearColumnSelection() {
        this.columnSelection.clear();
    }

}

Wenn ich die setModel()-Methode auskommentiere, funktioniert alles suppi! Allerdings will ich diese überschreiben. Denn wenn ich ein neues Model einfüge, die Tabelle also einen neuen Inhalt bekommt, möchte ich, dass die ausgewählten Spalten geleert werden.

Allerdings hagelt es immer ne NullPointerException, und ich weiß nicht, wieso das so ist:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at de.hitseller.comparator.gui.SelectableColumnTable.setModel(SelectableColumnTable.java:49)
        at javax.swing.JTable.<init>(JTable.java:611)
        at javax.swing.JTable.<init>(JTable.java:539)
        at de.hitseller.comparator.gui.SelectableColumnTable.<init>(SelectableColumnTable.java:28)
Allerdings rufe ich die Methode nie mit einer Null-Referenz auf! Kann sich das jemand erklären?

Aber auf jeden Fall schonmal: Vielen Dank ;)
 

HLX

Top Contributor
In deinem Konstruktor rufst du korrekterweise zuerst den Konstruktor von JTable auf. Dummerweise ruft der JTable-Konstruktor die Methode 'setModel' auf. Dabei wird deine Implementierung dieser Methode aufgerufen. Zum Zeitpunkt dieses Aufrufs ist deine LinkedList jedoch noch nicht initialisiert - das machst du ja erst später in deinem eigenen Konstruktor.
 

daNny

Aktives Mitglied
Wow! Super vielen Dank für die Hilfe ;)

Code:
@Override
    public void setModel(TableModel dataModel) {
        super.setModel(dataModel);
        if (this.columnSelection != null) {
            this.columnSelection.clear();
        }
    }
Tut's nun ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F 2D-Grafik JTextArea drucken bringt mieses Ergebnis AWT, Swing, JavaFX & SWT 2
T JavaFx Examples ändern liefert unerwartetes Ergebnis AWT, Swing, JavaFX & SWT 5
M Falsches Ergebnis bei Bildrotation AWT, Swing, JavaFX & SWT 1
P Swing Alle Zeilen einer Spalte (jTable) zusammen zählen und in eine eigene Zeile das Ergebnis schreiben. AWT, Swing, JavaFX & SWT 7
S JComboBox mit Ergebnis einer SQL Abfrage füllen AWT, Swing, JavaFX & SWT 39
M Hauptprogramm pausieren und auf Ergebnis eines JDialogs warten AWT, Swing, JavaFX & SWT 7
M GWT: Wie das Ergebnis eines Asynchronen Calls behandeln? AWT, Swing, JavaFX & SWT 7
G Auf Ergebnis vom Thread warten AWT, Swing, JavaFX & SWT 3
R AWT Listeners entfernen AWT, Swing, JavaFX & SWT 0
T Anzahl Event Listeners AWT, Swing, JavaFX & SWT 4
K Listeners und das Ende einer Componente AWT, Swing, JavaFX & SWT 4
G Event eines Listeners unterbrechen AWT, Swing, JavaFX & SWT 2
H CheckBoxListCell Selektion ermitteln AWT, Swing, JavaFX & SWT 2
B Minimum x und y von Children-JPanels ermitteln AWT, Swing, JavaFX & SWT 3
P JavaFX aktuelle Tabellenzeile bei Choice-Box-Auswahl in Zelle ermitteln AWT, Swing, JavaFX & SWT 28
P JavaFX Key-Value-Paar auf TreeItem ermitteln AWT, Swing, JavaFX & SWT 6
L JComponent aus JPanel anhand Mausposition ermitteln AWT, Swing, JavaFX & SWT 10
H automatische Anzahl der Spalten ermitteln -> geht nicht AWT, Swing, JavaFX & SWT 6
C JavaFX Positionen auf dem Bildschirm ermitteln AWT, Swing, JavaFX & SWT 1
M Schnittpunkte zwischen zwei Graphics2D Elemente ermitteln. AWT, Swing, JavaFX & SWT 5
C TableModel zugehörige Table ermitteln AWT, Swing, JavaFX & SWT 3
C Größe des Mauszeigers ermitteln AWT, Swing, JavaFX & SWT 5
J JavaFX Länge von Line ermitteln AWT, Swing, JavaFX & SWT 9
M JavaFX Stage in einer FXML-Controllerklasse ermitteln? AWT, Swing, JavaFX & SWT 5
J Swing Letzten Tab einer JTabbedPane ermitteln AWT, Swing, JavaFX & SWT 6
hdi Swing JFrame Größe ermitteln AWT, Swing, JavaFX & SWT 6
hdi Shift Modifier zur Laufzeit ermitteln AWT, Swing, JavaFX & SWT 3
B Position in einem Bild ermitteln AWT, Swing, JavaFX & SWT 3
I Textbreite von Font inklusive Tabs ermitteln AWT, Swing, JavaFX & SWT 4
A Swing Alle Komponenten auf JFrame ermitteln AWT, Swing, JavaFX & SWT 4
B Label breite ermitteln vor dem rendern? AWT, Swing, JavaFX & SWT 7
G Applet, Link ermitteln, dem der Benutzer gefolgt ist AWT, Swing, JavaFX & SWT 2
C Caret Position mit X-Y-Koordinaten ermitteln AWT, Swing, JavaFX & SWT 2
C Swing Inhalt eines JPanels ermitteln & bearbeiten AWT, Swing, JavaFX & SWT 5
B aktuelle Position des Fensters ermitteln AWT, Swing, JavaFX & SWT 3
N Methode zum ermitteln der editierte Zeile/Zelle in jTable AWT, Swing, JavaFX & SWT 8
H Eltern-Frame von JPanel ermitteln AWT, Swing, JavaFX & SWT 2
C Ermitteln ob JComponent einen Listener besitzt AWT, Swing, JavaFX & SWT 2
S Swing JTree expandierte Pfade ermitteln AWT, Swing, JavaFX & SWT 6
S Swing Swing maximale Fenstergrösse ermitteln AWT, Swing, JavaFX & SWT 5
R Focus ermitteln AWT, Swing, JavaFX & SWT 2
ElViZ End-Position eines gezeichneten Strings ermitteln. AWT, Swing, JavaFX & SWT 2
H Name einer Komponente ermitteln AWT, Swing, JavaFX & SWT 5
F Pixelfarbe von Panel ermitteln AWT, Swing, JavaFX & SWT 14
R Suchbare Zeilen von JTable in JScrollPane ermitteln AWT, Swing, JavaFX & SWT 9
M Schriftgröße ermitteln AWT, Swing, JavaFX & SWT 7
T Button des Popup-Menüs ermitteln AWT, Swing, JavaFX & SWT 4
Iron Monkey JPopupMenu/JMenuItem Index für getSubElements()[] ermitteln AWT, Swing, JavaFX & SWT 8
D printdialog ausgewählten drucker ermitteln AWT, Swing, JavaFX & SWT 2
J absolute Position einer JComponent ermitteln AWT, Swing, JavaFX & SWT 4
R JScrollBar / JScrollPane: Ermitteln ob ganz unten AWT, Swing, JavaFX & SWT 2
F JScrollbar Verschiebung des Viewport ermitteln AWT, Swing, JavaFX & SWT 3
M Wirkliche Größe eines JPanels/o.ä. ermitteln AWT, Swing, JavaFX & SWT 3
S Parent eines Menu-Eintrages ermitteln? AWT, Swing, JavaFX & SWT 3
K DefaultTableModel makierte Row ermitteln AWT, Swing, JavaFX & SWT 6
I font-größe ermitteln AWT, Swing, JavaFX & SWT 4
F Komponente der GUI ermitteln AWT, Swing, JavaFX & SWT 3
F Größe ermitteln AWT, Swing, JavaFX & SWT 3
P ID einer ausgewaehlten Node aus JTree ermitteln AWT, Swing, JavaFX & SWT 6
L Schnittpunkt von 2 Strecken ermitteln AWT, Swing, JavaFX & SWT 4
H Node neben dem Expand/Collapse Symbol ermitteln AWT, Swing, JavaFX & SWT 4
G TableModelEvent ermitteln AWT, Swing, JavaFX & SWT 18
I Popup-Trigger-Maustaste gleich beim Programmstart ermitteln? AWT, Swing, JavaFX & SWT 7
S JPanel Größe ermitteln AWT, Swing, JavaFX & SWT 9
J Grösse eines Graphikobjektes ermitteln AWT, Swing, JavaFX & SWT 3
C SWT - Fontgröße des aktuellen Fonts ermitteln AWT, Swing, JavaFX & SWT 2
P Wie das Component Object des Hauptfensters ermitteln? AWT, Swing, JavaFX & SWT 4
G Klasse Image - Höhe und Breite ermitteln AWT, Swing, JavaFX & SWT 12
L TreePath eines Objektes innerhalb eines JTree ermitteln? AWT, Swing, JavaFX & SWT 1
K Höhe und Breite eines Panels im GridBagLayout ermitteln AWT, Swing, JavaFX & SWT 9
H Größe eines Fensters ermitteln AWT, Swing, JavaFX & SWT 13
javasdann JTable sichtbare Zeilen innerhalb von JScrollPane ermitteln AWT, Swing, JavaFX & SWT 5
K aktuellen Inhalt eines JPanels ermitteln AWT, Swing, JavaFX & SWT 3
T Name des Hauptframes ermitteln AWT, Swing, JavaFX & SWT 17
I JTextArea: Zeilennummer ermitteln AWT, Swing, JavaFX & SWT 4
N Toplevel-Fenster ermitteln AWT, Swing, JavaFX & SWT 13
L Größe (in Byte) eines Image ermitteln AWT, Swing, JavaFX & SWT 2
T Größe und Position eines JLabels ermitteln AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen


Oben