Wie kann eine Tabellenspalte zur Laufzeit ermittelt werden?

Eine Tabellenspalte kann zur Laufzeit mit Hilfe eines MouseListener ermittelt werden.

Der MouseListener liefert die Position des Cursors als Point-Objekt. Über sie kann dann die Spalte bestimmt werden.

Im Beispiel wird in einem JFrame als Anwendungsfenster eine einfache, leere Tabelle in Form einer JTable erzeugt. Über die Methode getTableHeader() wird der Header mit den Titeln der Tabellenspalten ermittelt. Sowohl die Tabelle selbst, als auch der Header werden bei einem MouseListener hier in Form eines MouseAdapter angemeldet. Er ruft beim Entlasten der Maustaste die Methode writePos() auf. Ihr werden das Point-Objekt der Mausposition und das Tabellenobjekt selbst als Parameter übergeben.

In der Methode werden dann auf unterschiedliche Art und Weise die Spalte und im letzten Fall auch die selektierte Zeile ermittelt und ausgegeben.

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

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class GetTableColumn extends JFrame {

    public GetTableColumn() {
        initGUI();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("Tabellenspalte ermitteln");
        this.setSize(600, 400);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }

    public void initGUI() {
        JTable table = new JTable(new DefaultTableModel(25, 5));
        table.setShowGrid(true);
        table.setBackground(Color.LIGHT_GRAY);
        this.add(new JScrollPane(table));
        table.addMouseListener(new MouseAdapter() {
            public void mouseReleased(MouseEvent e) {
                Point p = e.getPoint();
                writePos(table, p);
            }
        });

        table.getTableHeader().addMouseListener(new MouseAdapter() {
            public void mouseReleased(MouseEvent e) {
                Point p = e.getPoint();
                writePos(table, p);
            }
        });
    }

    private void writePos(JTable table, Point p) {
        // Spaltenname über den Header auslesen
        System.out.println("Spaltentitel: " + table.getModel()
                .getColumnName(table.getTableHeader().columnAtPoint(p)));
        // Spaltenname über das Tabellenmodell auslesen
        System.out.println("Spaltentitel: "
                + table.getModel().getColumnName(table.columnAtPoint(p)));
        // Spaltenindex über den Tabellenheader und das Spaltenmodell auslesen
        System.out.println("Spaltenindex: " + table.getTableHeader()
                .getColumnModel().getColumnIndexAtX(p.x));
        // Spalten- und Reihenindex über die selektierte Reihe und Spalte
        // auslesen
        System.out.println("Reihe: " + table.getSelectedRow() + ", Spalte: "
                + table.getSelectedColumn());
    }

    public static void main(String[] args) {
        new GetTableColumn();
    }
}