JTable: Maus-Click ohne Datensätze

Status
Nicht offen für weitere Antworten.

Reinhard

Aktives Mitglied
Hallo,

ich habe eine JTable und eine TableMouseAdapter, mit dem ich auf den Rechtsklick in der Tabelle reagieren und ein Popupmenu anzeige:

Code:
public class TableMouseAdapter extends MouseAdapter
{
  public TableMouseAdapter(JTable table) {
    this.table = table;
  }
  
  public void mouseClicked(MouseEvent me) {
    try {
      // Abfrage rechte Maustaste
      if(me.getButton() == MouseEvent.BUTTON3) {              
        // Popup anzeigen
      }            
  
      // Abfrage linke Maustaste
      if(me.getButton() == MouseEvent.BUTTON1) {
        // Datensatz aktualisieren
      }
      me.consume();
    } catch(Exception ex) {
      Message.ShowExceptionMessage(ex);
    }  
  }
}

Der TableMouseAdapter wird so aufgerufen:

Code:
TableMouseAdapter tma = new TableMouseAdapter(table);
table.addMouseListener(tma);

Das ganze funktioniert auch einwandfrei, solande ich Rows in der Tabelle habe. Sind aber keine Zeilen in der Tabelle, reagiert die Tabelle nicht auf den Maus-Click.

Kann ich einstellen, das die JTable trotzdem auf den Maus-Click reagiert?

Danke,
Reinhard
 
Der Listener reagiert auf einen Klick auf die Komponente, was in den Zeilen steht sollte also egal sein.
Bekommst du Exceptions?
Was macht der Code popup anzeigen?
 
Wildcard hat gesagt.:
Der Listener reagiert auf einen Klick auf die Komponente, was in den Zeilen steht sollte also egal sein.
Bekommst du Exceptions?
Was macht der Code popup anzeigen?

Ne, wenn du keine Daten hast, also praktisch nur die Spaltenköpfe und klickst auf diese, reagiert der Listener nicht. Habsch auch schon festgestellt, war mir aber nicht wichtig genug um nach einer Lösung zu suchen 😉.
 
Ach so, ich dachte die Zeilen sind nur leer.
Wenn nur der Header da ist kann der Listener auch nicht reagieren, da der Header zur ScrollPane und nicht zur Table gehört.
-> Listener auch auf der ScrollPane registrieren
 
Guten Morgen,

ich habe den Listener wie folgt dem scrollPane hinzugefügt:

Code:
TableMouseAdapter tma = new TableMouseAdapter(table);
table.addMouseListener(tma); 
scrollPaneTable.addMouseListener(tma);

Leider reagiert dann die Table / ScrollPane auch nicht auf den Rechtsklick, wenn keine Daten vorhanden sind.
Hat noch jemand eine Idee?

Danke,
Reinhard
 
Versuch's mit nem Listener zum Header:
Code:
import javax.swing.table.*;
...
        JTableHeader th = table.getTableHeader();
        th.addMouseListener(new MouseAdapter() {
            public void mouseReleased(MouseEvent evt) {
                tableMouseReleased(evt);
            }
        });
...
    private void tableMouseReleased(MouseEvent evt) {
        if(evt.isPopupTrigger()){
            System.out.println("OK");
        }
    }
...
 
Hallo André,

mit deinem Code funktioniert es. Aber natürlich nur im TableHeader.
Wenn ich nun in die Table klicke, wird leider wieder kein MouseEvent abgefangen.

Hat noch jemand eine Idee?

Danke,
Reinhard
 
Reinhard hat gesagt.:
..Wenn ich nun in die Table klicke, wird leider wieder kein MouseEvent abgefangen..
Komisch, bei mir funktioniert's aber:
Code:
//package tableDemo;
/*
 * Table_Popup.java
 */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class Table_Popup extends JFrame {
    public Table_Popup() {
        super("Table Popup");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 300);
        setLocationRelativeTo(null);
        scrollPaneTable = new JScrollPane();
        table = new JTable();
        table.setModel(new DefaultTableModel(
            new Object [][] {
//                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        scrollPaneTable.setViewportView(table);
        getContentPane().add(scrollPaneTable, BorderLayout.CENTER);
        scrollPaneTable.addMouseListener(new MouseAdapter() {
            public void mouseReleased(MouseEvent evt) {
                tableMouseReleased(evt);
            }
        });
        JTableHeader th = table.getTableHeader();
        th.addMouseListener(new MouseAdapter() {
            public void mouseReleased(MouseEvent evt) {
                tableMouseReleased(evt);
            }
        });
        table.addMouseListener(new MouseAdapter() {
            public void mouseReleased(MouseEvent evt) {
                tableMouseReleased(evt);
            }
        });
    }
    private void tableMouseReleased(MouseEvent evt) {
        if(evt.isPopupTrigger()){
            System.out.println("OK");
        }
    }
    public static void main(String args[]) {
        new Table_Popup().setVisible(true);
    }
    private JScrollPane scrollPaneTable;
    private JTable table;
}
 
Hallo André,

ich habe dein Beispiel getestet. Funktioniert perfekt - vielen Dank 🙂
Jetzt muss ich mal schauen, was ich da in meinem Programm falsch gemacht habe.

Schöne Grüße,
Reinhard
 
Hallo André,

ich habe dein Beispiel jetzt in meinem Programm umgesetzt.
Es funktioniert dort auch einwandfrei.

Schöne Grüße,
Reinhard
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben