MouseListener auf table oder scrollPane

Hallo,

ich habe einen MouseListener in meinem Programm platziert, der ein neues Fenster aufruft, sobald eine Zeile in einer Tabelle markiert ist und ein Doppelklick ausgeführt wird. Leider funktioniert der MouseListener nicht, wenn ich ihn der Tabelle oder dem scrollPane (welche die Tabelle enthält) platziere. Er funktioniert jedoch, wenn ich ihn ohne direkte Zuweisung im Konstruktor hinzufüge, jedoch auch nur dann, wenn eine Zeile markiert ist und der Doppelklick NICHT auf der Tabelle oder dem scrollPane stattfindet.

Bedeutet nun, ich muss eine Zeile markieren und dann außerhalb der Tabelle einen Doppelklick machen. Kann mir jemand sagen, wie ich es hinbekomme, dass der MouseListener auch funktioniert, wenn der Doppelklick auf der Tabelle stattfindet?

Hier mal der bisherige Code:


public class AuswertungGUI extends JFrame implements ActionListener, KeyListener, ItemListener, MouseListener
{
    public AuswertungGUI ()
    {	
    beschriften(); // Dialogfenster-Titel beschriften
    layoutElements(); // GUI-Elemente positionieren.
     
    /*
    * Event-Haendler installieren.
    *
    */
    addMouseListener(this);
    table.addMouseListener(this);
    scrollPane.addMouseListener(this);
     
    // WEITERER CODE
    }
     
    @Override
    public void mouseClicked(MouseEvent event)
    {
    
if(table.getRowCount() > 0 && (ergebnisL.getText().startsWith("Ergebnis: Fehlerliste") || ergebnisL.getText().startsWith("Ergebnis: Potenzielle Verursacherorte für Fehler")) && event.getClickCount() == 2 && event.getButton() == MouseEvent.BUTTON1) // Doppelklick mit linker Taste auf Liste.
    {	
    zeile = table.getSelectedRow();
    fehler = table.getModel().getValueAt(zeile, 0).toString();
    ort = table.getModel().getValueAt(zeile, 1).toString();
     
    query = "";
     
    xWert = table.getModel().getValueAt(zeile, 3).toString();
    yWert = table.getModel().getValueAt(zeile, 4).toString();
    quad = "Q" + xWert + "." + yWert;
     
    baur = table.getModel().getValueAt(zeile, 5).toString();
     
    Fehleranzeige b = new Fehleranzeige(AuswertungGUI.this, ort, quad, baur);
    }
     
    else if(table.getRowCount() > 0 && ergebnisL.getText().startsWith("Ergebnis: Potenzielle Fehler für Verursacher") && event.getClickCount() == 2 && event.getButton() == MouseEvent.BUTTON1)
    {
    zeile = table.getSelectedRow();
    fehler = table.getModel().getValueAt(zeile, 6).toString();
    ort = table.getModel().getValueAt(zeile, 7).toString();
     
    query = "";
     
    xWert = table.getModel().getValueAt(zeile, 9).toString();
    yWert = table.getModel().getValueAt(zeile, 10).toString();
    quad = "Q" + xWert + "." + yWert;
     
    baur = table.getModel().getValueAt(zeile, 11).toString();
     
    Fehleranzeige b = new Fehleranzeige(AuswertungGUI.this, ort, quad, baur);
    }
    }     
}

Ich hab es auch mal probiert mit “DefaultTableModel.addMouseListener(this)” bzw. “table.getModel().addMouseListener(this)”, da rät er mir aber natürlich zu einem TableListener. Für die Tabelle verwende ich kein eigenes TableModel. Hat da jemand eine Idee? Danke schonmal im Voraus!

Du hängst innerhalb des Konstruktors den MouseListener nur an die JTable. Das sollte schon funktionieren.

Hi,
danke für deine ANtwort. Ich habe mal alle MouseListener auskommentiert, bis auf den an der JTable. Leider passiert nichts, wenn ich per Doppelklick auf die Tabelle klicke. Ich habe mal eine Testausgabe in den MouseListener gepackt und diese wird nicht aufgerufen.


/*
		 * Event-Haendler installieren.
		 * 
		 */
		//addMouseListener(this);
		table.addMouseListener(this);
		//scrollPane.addMouseListener(this);
		//table.getModel().addMouseListener(this);
		

Muss die JTable unbedingt bei einem Doppelklick reagieren?
Wenn du deinen Listener so programmierst, dass er bereits beim ersten Klicken reagiert, sollte es funktionieren.
Ich vermute, dass nur der erste Klick der JTable gilt, der zweite der selektierten Komponente in der Zelle.

Ich habe es nochmal probiert mit einem Klick (was auch okay wäre): Aber auch ein Klick wird nicht akzeptiert. Selbst wenn ich eine Testausgabe in der Konsole anfordere, sobald überhaupt geklickt wird, passiert innerhalb der Tabelle nichts. Außerhalb der Tabelle wird die Ausgabe getätigt.

Probiere das mal aus:


import java.awt.BorderLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author l-ectron-x
 */
public class MainPanel extends JPanel implements MouseListener {

    private JTable table;

    public MainPanel() {
        super(new BorderLayout());
        DefaultTableModel model = new DefaultTableModel(getColumnNames(), 10);
        table = new JTable(model);
        table.addMouseListener(this);
        add(new JScrollPane(table));
    }

    private String[] getColumnNames() {
        return new String[]{
            "Spalte 1", "Spalte 2", "Spalte 3", "Spalte 4", "Spalte 5"
        };
    }

    public void mouseClicked(MouseEvent e) {
         JOptionPane.showMessageDialog(this, "Mausklick in Zeile "+(table.getSelectedRow()+1)+" / Spalte "+(table.getSelectedColumn()+1)+" erkannt!");
    }

    public void mousePressed(MouseEvent e) {

    }

    public void mouseReleased(MouseEvent e) {

    }

    public void mouseEntered(MouseEvent e) {

    }

    public void mouseExited(MouseEvent e) {

    }

}```

```package tabletest;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import tabletest.mouselistener.MainPanel;


/**
 *
 * @author l-ectron-x
 */
public class Main {
    
    private static void createAndShowGUI() {
        JFrame f = new JFrame("JTable-Test");
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        f.add(new MainPanel());
        f.setSize(900, 300);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

Hey,

vielen Dank nochmal für deine Hilfe und dein Coding! Ich habe es jedoch nun über eine Alternativlösung gemacht. Ursprünglich sollte der User per Doppelklick auf die Reihe ein entsprechendes Bild dazu erhalten. Nun muss er leider erst die Zeile markieren und dann auf einen separaten Bildbutton klicken. Ich glaube fast, dass es daran liegt, dass ich kein DefaultTableModel verwende und die Daten direkt in ein JTbale speichere. Das Abändern würde aber wirklich zu lange dauern, da ich morgen mein Ergebnis vorstellen muss. Danke nochmals!

Hallo,

nun wird doch verlangt, dass sowohl ein Doppelklick als auch ein neues weiteres Fenster bei einem Rechtsklick auf die Tabelle erscheint. Ich muss es also hinbekommen, dass ein Klick auf der Tabelle (bzw. der Zeile) erkannt wird.

Folgendes habe ich ausprobiert und keines reagiert beim Klick auf die Tabelle. Außerhalb funktioniert es, aber eben nicht auf der Tabelle (obwohl beim Klick auf eine Zeile diese als markiert hinterlegt wird).

  1. Variante:

addMouseListener(this);
table.addMouseListener(this);
scrollPane.addMouseListener(this);

  1. Variante:

table.addMouseListener(new MouseAdapter() {
			@Override
			  public void mouseClicked(MouseEvent e) {
			    if (e.getClickCount() == 1) {
			      JTable target = (JTable)e.getSource();
			      int row = target.getSelectedRow();
			      int column = target.getSelectedColumn();
			      
			      System.out.println("ENDLICH!");
			    }
			  }
			});
		
		scrollPane.addMouseListener(new MouseAdapter() {
			@Override
			  public void mouseClicked(MouseEvent e) {
			    if (e.getClickCount() == 1) {
			      JTable target = (JTable)e.getSource();
			      int row = target.getSelectedRow();
			      int column = target.getSelectedColumn();
			      
			      System.out.println("ENDLICH!");
			    }
			  }
			});

Nichts davon funktioniert. Ich glaube ich melde darauf ein Patent an: Der erste Code, der nach Lehrbuch funktionieren sollte, aber dies nicht tut… L-ectron-X hat schon viele Hinweise gegeben, aber auch da konnte ich keine Veränderung an meinem Programm hervorrufen. Hat da noch jmd Hinweise, woran das liegen kann? Liegt es evtl. daran, da ich kein DefaultTabelModel verwende? Vielen Dank schonmal im Voraus!

Poste den ganzen code - ein KSKB, nicht nur einen Ausschnitt. Gibt es irgendwelche Exceptions die dein Programm auswirft? Das sollte grundsätzlich so laufen, einzig der Cast getSource auf Target könnte Probleme machen - wofür brauchst du den überhaupt, “table” ist doch eine Variable auf die du Zugriff hast.

Hey,

es funktioniert nun. Der Grund für das Nicht-Funktionieren: Ich habe innerhalb des ActionListeners per DB-Abfrage der Tabelle eine neue Tabelle aus der DB-Abfrage zugewiesen, also

 table = db.getTabelle(query); 

. Scheinbar hat er dann den vorher angefügten MouseListener wieder gelöscht. Ich habe nun am Ende des ActionListeners erneut den MouseListener an die Tabelle gesetzt und nun geht es!

Danke nochmal für die Hilfe!

Gelöscht wird hier nichts. Du hattest nur zwei Table Objekte und an dem das Du nicht nutzt hing der Listener. Jetzt hast Du immer noch zwei Objekte und an beiden hängt der/ein Listener.
Ich würde den Code bereinigen, so dass nur ein Table Objekt erzeugt /verwendet wird. Sonst stolperst Du u.U. noch mehrmals über das Problem.

Und genau darum bestehe ich immer auf ein KSKB. Die “Datenbank” (wohl eher deiner DB-Schicht im Code) eine JTable erzeugen zu lassen ist nämlich ziemlich kontraproduktiv, wie du gerade siehst. JTable ist nicht umsonst MVC - es reicht wenn deine DB-Schicht ein TableModel erzeugt, das du dann bequem per table.setModel() int deinen einzigen JTable bringst.