MouseListener hört nur auf eine JTable

Hallo ich habe gerade ein seltsames Problem
und zwar

ich habe 2 JTables auf einem Frame
beiden habe ich den implementierten MouseListener hinzugefügt
aber seltsamerweise hört der nur auf die erste JTable

addTableData(alleKarten);
table=new JTable(new MyTableModel(daten,title));
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
TableColumn col1 = table.getColumnModel().getColumn(0);
col1.setPreferredWidth(20);
TableColumn col2 = table.getColumnModel().getColumn(1);
col2.setPreferredWidth(150);
TableColumn col3 = table.getColumnModel().getColumn(2);
col3.setPreferredWidth(224);
table.setBounds(203,3,250,394);
table.addMouseListener(this);
scroll=new JScrollPane(table);
scroll.setBounds(203,3,400,394);
add(scroll);
		
addTableData(deck);
table2=new JTable(new MyTableModel(daten2,title));
table2.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
TableColumn col12 = table2.getColumnModel().getColumn(0);
col12.setPreferredWidth(20);
TableColumn col22 = table2.getColumnModel().getColumn(1);
col22.setPreferredWidth(150);
TableColumn col32 = table2.getColumnModel().getColumn(2);
col32.setPreferredWidth(224);
table2.addMouseListener(this);
scroll2=new JScrollPane(table2);
scroll2.setBounds(600,3,400,394);
add(scroll2);

noch bevor ich die source abfrage habe ich System.out.println(Event.getSource); drinnen auch das reagiert nicht also wo liegt hier mein fehler

bin für jede hilfe dankbar

Was steht denn im MouseListener. Vielleicht ist die entsprechende Methode leer, oder falsch geschrieben?

nein den der MouseListener reagiert auf der einen JTable nur nicht auf der anderen obwohl ich den Mouselistener in beiden fehlen mit this hinzugefügt habe reagiert er nur auf die eine JTable

package viewing;

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.ScrollPane;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel;
import javax.swing.table.TableColumn;

import funk.Datenbank;
import modeling.Datensatz;
import modeling.Filter;
import modeling.MyTableModel;

public class DeckBuilder extends JFrame implements ActionListener,MouseListener{
	
	private Datenbank db = new Datenbank();
	
	private ArrayList<Datensatz>alleKarten=new ArrayList<Datensatz>();
	private ArrayList<Datensatz>anzeigen=new ArrayList<Datensatz>();
	private ArrayList<Datensatz>deck=new ArrayList<Datensatz>();
	
	
	private JButton bfilterok;
	
	private JCheckBox mana0;private JCheckBox mana1;private JCheckBox mana2;
	private JCheckBox mana3;private JCheckBox mana4;private JCheckBox mana5;
	private JCheckBox mana6;private JCheckBox mana7;private JCheckBox mana8;
	private JCheckBox mana9;private JCheckBox mana10;
	
	private JTextField tsuche;
	
	private String[]sHelden=new String[]{null,"Druide","Hexenmeister","Jäger","Krieger","Magier","Paladin","Priester","Schamane","Schurke"};
	private JComboBox<String>cHeldenBox=new JComboBox<String>(sHelden);
	
	private String[]sRassen=new String[]{null,"Drache","Dämon","Murloc","Pirat","Totem","Wildtier"};
	private JComboBox<String>cRasseBox=new JComboBox<String>(sRassen);
	
	private String[][]daten;
	private String[]title=new String[]{"Mana","Kartenname","Kartentext"};
	private JTable table;
	private JScrollPane scroll;
	
	private String[][]daten2;
	private JTable table2;
	private JScrollPane scroll2;
	
	
	public DeckBuilder(){
		alleKarten=db.auslesen();
		for(Datensatz ds : alleKarten){
			System.out.println(ds.getNAME());
		}
		anzeigen=alleKarten;
		System.out.println(alleKarten.size());
		setSize(1000,400);
		setUndecorated(true);
		setLocation(100,300);
		setLayout(null);
		getContentPane().setBackground(Color.WHITE);
		((JComponent)getContentPane()).setBorder(BorderFactory.createMatteBorder( 3, 3, 3, 3, Color.blue ));
		JPanel pfilter = new JPanel();
		pfilter.setLayout(new GridLayout(20,1));
		pfilter.setBounds(3,3,200,394);
		pfilter.setBackground(Color.WHITE);
		pfilter.add(cHeldenBox);
		pfilter.add(cRasseBox);
		
		bfilterok=new JButton("Filter anwenden");
		bfilterok.addActionListener(this);
		pfilter.add(bfilterok);
		
		mana0=new JCheckBox("0 Mana");		mana0.setBackground(Color.WHITE);	pfilter.add(mana0);
		mana1=new JCheckBox("1 Mana");		mana1.setBackground(Color.WHITE);	pfilter.add(mana1);
		mana2=new JCheckBox("2 Mana");		mana2.setBackground(Color.WHITE);	pfilter.add(mana2);
		mana3=new JCheckBox("3 Mana");		mana3.setBackground(Color.WHITE);	pfilter.add(mana3);
		mana4=new JCheckBox("4 Mana");		mana4.setBackground(Color.WHITE);	pfilter.add(mana4);
		mana5=new JCheckBox("5 Mana");		mana5.setBackground(Color.WHITE);	pfilter.add(mana5);
		mana6=new JCheckBox("6 Mana");		mana6.setBackground(Color.WHITE);	pfilter.add(mana6);
		mana7=new JCheckBox("7 Mana");		mana7.setBackground(Color.WHITE);	pfilter.add(mana7);
		mana8=new JCheckBox("8 Mana");		mana8.setBackground(Color.WHITE);	pfilter.add(mana8);
		mana9=new JCheckBox("9 Mana");		mana9.setBackground(Color.WHITE);	pfilter.add(mana9);
		mana10=new JCheckBox("10+ Mana");	mana10.setBackground(Color.WHITE);	pfilter.add(mana10);
		
		mana0.setSelected(true);
		mana1.setSelected(true);
		mana2.setSelected(true);
		mana3.setSelected(true);
		mana4.setSelected(true);
		mana5.setSelected(true);
		mana6.setSelected(true);
		mana7.setSelected(true);
		mana8.setSelected(true);
		mana9.setSelected(true);
		mana10.setSelected(true);
		
		tsuche=new JTextField();
		pfilter.add(tsuche);
		
		add(pfilter);
		
		
		
		addTableData(alleKarten);									addDeckData(deck);
		table=new JTable(new MyTableModel(daten,title));			table2=new JTable(new MyTableModel(daten2,title));
		table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);			table2.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		TableColumn col1 = table.getColumnModel().getColumn(0);		TableColumn col12 = table2.getColumnModel().getColumn(0);
		col1.setPreferredWidth(20);									col12.setPreferredWidth(20);
		TableColumn col2 = table.getColumnModel().getColumn(1);		TableColumn col22 = table2.getColumnModel().getColumn(1);
		col2.setPreferredWidth(150);								col22.setPreferredWidth(150);
		TableColumn col3 = table.getColumnModel().getColumn(2);		TableColumn col32 = table2.getColumnModel().getColumn(2);
		col3.setPreferredWidth(224);								col32.setPreferredWidth(224);						
		table.addMouseListener(this);								table2.addMouseListener(this);
		scroll=new JScrollPane(table);								scroll2=new JScrollPane(table2);
		scroll.setBounds(203,3,396,394);							scroll2.setBounds(596,3,394,394);
		add(scroll);												add(scroll2);
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		setVisible(true);
	}
	
	public void addTableData(ArrayList<Datensatz>x){
		daten=new String[x.size()][3];
		for (int i = 0; i < x.size(); i++) {
			System.out.print(".");
			daten**[0]=""+x.get(i).getMANA();
			daten**[1]=x.get(i).getNAME();
			daten**[2]=x.get(i).getKARTENTEXT();
		}
	}
	
	public void addDeckData(ArrayList<Datensatz>x){
		daten2=new String[x.size()][3];
		for (int i = 0; i < x.size(); i++) {
			System.out.print(".");
			daten2**[0]=""+x.get(i).getMANA();
			daten2**[1]=x.get(i).getNAME();
			daten2**[2]=x.get(i).getKARTENTEXT();
		}
	}
	
	
	
	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==bfilterok){
			String held="";
			if(cHeldenBox.getSelectedItem()==null){
				held ="";
			}
			else{
				held = cHeldenBox.getSelectedItem().toString();
			}
			String rasse = "";
			if(cRasseBox.getSelectedItem()==null){
				
			}
			else{
				rasse = cRasseBox.getSelectedItem().toString();
			}
			String suche = tsuche.getText();
			ArrayList<Integer>mana=new ArrayList<Integer>();
			if(mana0.isSelected()){
				mana.add(0);
			}
			if(mana1.isSelected()){
				mana.add(1);
			}
			if(mana2.isSelected()){
				mana.add(2);
			}
			if(mana3.isSelected()){
				mana.add(3);
			}
			if(mana4.isSelected()){
				mana.add(4);
			}
			if(mana5.isSelected()){
				mana.add(5);
			}
			if(mana6.isSelected()){
				mana.add(6);
			}
			if(mana7.isSelected()){
				mana.add(7);
			}
			if(mana8.isSelected()){
				mana.add(8);
			}
			if(mana9.isSelected()){
				mana.add(9);
			}
			if(mana10.isSelected()){
				mana.add(10);
				mana.add(12);
				mana.add(20);
			}
			for (Integer s : mana) {
				System.out.println(""+s);
			}
			anzeigen=new Filter(alleKarten, held, mana, rasse, suche).getFiltered();
			System.out.println(anzeigen.size());
			for (Datensatz x : anzeigen) {
				System.out.println("===================");
				System.out.println(x.getNAME());
				System.out.println("===================");
			}
			remove(scroll);
			addTableData(anzeigen);
			table=new JTable(new MyTableModel(daten,title));
			table.setBounds(203,3,200,394);
			scroll=new JScrollPane(table);
			scroll.setBounds(203,3,400,394);
			add(scroll);
			cHeldenBox.setSelectedItem(null);
			cRasseBox.setSelectedItem(null);
			tsuche.setText(null);
			mana0.setSelected(true);
			mana1.setSelected(true);
			mana2.setSelected(true);
			mana3.setSelected(true);
			mana4.setSelected(true);
			mana5.setSelected(true);
			mana6.setSelected(true);
			mana7.setSelected(true);
			mana8.setSelected(true);
			mana9.setSelected(true);
			mana10.setSelected(true);
			validate();
			repaint();	
		}
	}

	@Override
	public void mouseClicked(MouseEvent e) {}
	@Override
	public void mouseEntered(MouseEvent e) {}
	@Override
	public void mouseExited(MouseEvent e) {}
	@Override
	public void mousePressed(MouseEvent e) {
		System.out.println(e);
		if(e.getSource()==table){
			int count = e.getClickCount();
			int row = table.rowAtPoint(e.getPoint());
			System.out.println(anzeigen.get(row)+" "+count);
			deck.add(anzeigen.get(row));
			System.out.println(deck.size());
			
			remove(scroll2);
			addDeckData(deck);
			table2=new JTable(new MyTableModel(daten2,title));
			scroll2=new JScrollPane(table2);
			scroll2.setBounds(600,3,400,394);
			add(scroll2);
			validate();
			repaint();
		}
		else if(e.getSource()==table2){
			int row = table2.rowAtPoint(e.getPoint());
			System.out.println("Enferne "+deck.get(row));
			deck.remove(row);
			System.out.println(deck.size());
			remove(scroll2);
			addDeckData(deck);
			table2=new JTable(new MyTableModel(daten2,title));
			scroll2=new JScrollPane(table2);
			scroll2.setBounds(600,3,400,394);
			add(scroll2);
			validate();
			repaint();
		}
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
}

            int count = e.getClickCount();
            int row = table.rowAtPoint(e.getPoint());
            System.out.println(anzeigen.get(row)+" "+count);
            deck.add(anzeigen.get(row));
            System.out.println(deck.size());
           
            remove(scroll2);
            addDeckData(deck);
            table2=new JTable(new MyTableModel(daten2,title));
            scroll2=new JScrollPane(table2);
            scroll2.setBounds(600,3,400,394);
            add(scroll2);
            validate();
            repaint();
        }
        else if(e.getSource()==table2){
            int row = table2.rowAtPoint(e.getPoint());
            System.out.println("Enferne "+deck.get(row));
            deck.remove(row);
            System.out.println(deck.size());
            remove(scroll2);
            addDeckData(deck);
            table2=new JTable(new MyTableModel(daten2,title));
            scroll2=new JScrollPane(table2);
            scroll2.setBounds(600,3,400,394);
            add(scroll2);
            validate();
            repaint();
        }```Dieser Code lässt stark vermuten, dass du eigentlich zwei Mouselistener brauchst. Prinzipiell finde ich deinen Code sehr unübersichtlich. Ich würde dir Raten die Klasse "DeckBuilder" nochmal zu überarbeiten und sie in die Klassen `DeckBuilder extends JFrame`, `DeckBuilderActionListener implements ActionListener` und ein oder mehrer `DeckBuilderMouseListener implements MouseListener` zu untergliedern. Denn so wie es aktuell ist, würde ich da ungern einen Fehler suchen.

Und ich würde fast wetten, dass du den Fehler ganz von alleine findest, wenn du das oben genannte Refactoring durchführst ;).

wo ist denn da die Herausforderung? :wink:

der Fehler ist simpel,
ganz am Anfang dürfte der Listener auch auf table2 funktioniert,
aber an gefühlt jeder Stelle im Programm wird table2, teils auch table(1), neu erstellt, ersetzt

→ die alte Table mit MouseListener ist nicht mehr da, die neue hat keinen MouseListener,
bei jeder neuen JTable muss alles dazu wieder neu, richtig JScrollPane, genauso aber auch wieder MouseListener adden

oder noch besser GUI-Komponenten NICHT ständig ersetzen,
das gibt solche Probleme, teils auch Layout-Probleme, und macht mächtig Arbeit intern,
und oben drauf noch unschön (wiederholten!) Code mit JScrollPane usw., kann man zwar in Methoden auslagern, aber einfach unnötig

dafür gibt es doch Models!, tausche einfach nur das Model der jeweiligen Table aus, schon alles fertig,
ein neues JTable-Objekt ist nicht besser als das alte

            addDeckData(deck);
            table2=new JTable(new MyTableModel(daten2,title));
            scroll2=new JScrollPane(table2);
            scroll2.setBounds(600,3,400,394);
            add(scroll2);
            validate();
            repaint();

->
            addDeckData(deck);
            table2.setModel(new MyTableModel(daten2,title));

edit: Bounds sind andere als an anderen Programmstellen, 
wenn nicht ein Fehler durch solche Codewiederholung, dann den Bounds-Befehl eben lassen, repaint dann wohl auch

man kann auch noch weiter gehen und das Model belassen, nur die Daten im Model teils oder ganz austauschen,
aber da ist der Unterschied nun nicht mehr so groß

Keine Ahnung was du unübersichtlich findest ich bin eigentlich immer stolz gewesen auf die formatierung meines Quellcodes XD

den MouseListener auszulagern könnte schwer werden da ich im MouseListener ja auf die Tables zugreifen muss die im DeckBuilder drinnen sind
habe aber mittlerweile das null Layout durch ein BorderLayout ersetzt das null hab ich nur benutzt weil ich noch nicht wußte wie das teil genau aussehen soll

gebracht hat es nur leider nichts

Habe jetzt den fehler gefunden nachdem ich in die erste Table das erste mal klicke baue ich ja die table neu auf und hatte da vergessen den mouselistener wieder hinzuzufügen
Danke trotzdem

Deine Klasse macht einfach zu viele Dinge gleichzeitig. Riesige ActionListener mit einer Abfrage, welche Komponente denn nun die auslösende war, hatte ich anfangs auch. Inzwischen finde ich es viel eleganter, an Ort und stelle einen kurzen, anonymen ActionListener zu erzeugen, in dem nur der Code für genau das Element drin steht, für das er erzeugt wird.

Zwei Anweisungen in einer Zeile finde ich ein absolutes no-go. Dann lager das Zeug lieber einzeln in Methoden aus.

Code, wie der in den Zeilen 97 bis 119 ließe sich auch viel besser in einer for-Schleife machen.

Statt deine Gottklasse alle möglichen Listener implementieren zu lassen ist es viel übersichtlicher wenn du anonoyme Listener verwendest. Das geht so:

class MyPanel extends JPanel
{
private JButton button1, button2;
private JLabel label1,label2;
public MyComponent()
{
button1=new JButton("1");
button1.addActionListener(new ActionListener()
       {
           public void actionPerformed(ActionEvent e)
                      {label1.setText("Klick 1");}
        });

button1=new JButton("2");
button1.addActionListener(new ActionListener()
       {
           public void actionPerformed(ActionEvent e)
                      {label1.setText("Klick 2");}
        });
add(button1);
add(button2);
add(label1);
add(label2);
}
}