Methode der Aufrufenden Klasse ansprechen

MScalli

Erfahrenes Mitglied
Hi Leutz.

Ich hab mal ne Frage und hoffe es wird nicht allzu peinlich für mich :)

Ich brauch ziemlich oft Tabellen und jetzt müsste es doch möglich sein irgendwie
bei nem Doppelklick auf die Tabelle eine Methode der Aufrufenden Klasse( in meinem fall TestFrame) aufzurufen, und dieser dann die Daten der Zeile mitzugeben.

TestFrame.fillTextFields() bringt nichts weil die Tabelle von sehr vielen Klassen verwendet werden soll.

Mein Ziel ist es diese Tabellenklasse immer wieder zu verwenden.
Ich übergebe einen Select auf eine Datenbank, bekomme die Daten in der Tabelle angezeigt und will dann eine Methode der Aufrufenden Klasse aufrufen um z.B. Textfelder mit den Daten des ausgewählten Satzes zu füllen.

Bis jetzt mache ich das mittels Reflection, aber mir gefällt diese Lösung nicht wirklich.
Ich hoffe Ihr versteht mein Problem.
Hier mal ein lauffähiges Basic Prog das es evtl. bisschen genauer erklärt.

Code:
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class TestFrame extends JFrame
{
  public TestFrame (){
	  
	  this.setSize(800, 600);
	  JPanel panel = new JPanel();
	  panel.setBounds(200, 150, 400, 300);
	  this.add(panel);
	  
	  MyTable table = new MyTable(); 
	  
	  panel.add(new JScrollPane(table));
	  
	  this.setVisible(true);
  }
  
  public void fillTextFields(){
	  System.out.println("Hier bräucht ich die ausgewählten Spaltendaten um z.B. Textfelder zu füllen");
  }
  
  
  public static void main (String args[]) {
    new TestFrame ();
  }
}

Code:
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class MyTable extends JTable{

	MyTable(){
		String[][] rowData = {
				    { "Japan", "12" }, { "USA", "22" }, { "Italien", "222" },
				    { "Spanien", "21" }, {"Türkei", "21"} ,{ "England", "21" },
				    { "Frankreich", "19" }, {"Griechenland", "18" },
				    { "Deutschland", "18" }, {"Portugal", "17" }
				  };
		String[] columnNames = {
				        "Land", "Platz"
				    };
	    // TableModel Sortierung geht von alleine!!
	    DefaultTableModel model = new DefaultTableModel(rowData, columnNames) {

	        public boolean isCellEditable(int row, int col) {
	            	return false;
	        }
	    };
	    
	    TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
	    this.setRowSorter(sorter);
	    this.setModel(model);
	    
	    this.addMouseListener(new java.awt.event.MouseAdapter() {
			public void mouseClicked(java.awt.event.MouseEvent e) {

				if ( e.getClickCount() == 2 ) { 
					System.out.println("Doppelklick");
					
					System.out.println("Hier müsste ich die Methode fillTextFields() der aufrufenden Klasse aufrufen" );
					// aber wie mache ich das ausserdem müsste ich die ausgewählte Zeile mit übergeben, besser gesagt
					// die Daten in dieser Zeile um dann z.B. über den key einen Select auf die Datenbank zu machen, 
					// mir die Daten des gewählten Satzes holen und dann die (noch nicht vorhandenen) Textfelder 
					// in der aufrufenden Klasse zu füllen
				}
			}
		});
	}
}

hab einfach mal irgendwelche daten zum Probieren in die Tabelle geschrieben.

gruss
MScalli
 
Versuch's mal mit einer Schnittstelle "DetailView", etwa so:
Code:
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

public class TestFrame extends JFrame implements DetailView {

    private MyTable table;

    public TestFrame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(800, 600);
        setLocationRelativeTo(null);
        JPanel panel = new JPanel();
        this.add(panel);
        table = new MyTable();
        table.setDetailView(this);
        panel.add(new JScrollPane(table));
        this.setVisible(true);
    }

    public void fillTextFields(final int row) {
        for (int column = 0; column < table.getColumnCount(); column++) {
            System.out.println(table.getModel().getValueAt(row, column));
        }
    }

    public static void main(final String[] args) {
        Runnable gui = new Runnable() {

            @Override
            public void run() {
                new TestFrame().setVisible(true);
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
}

interface DetailView {

    public void fillTextFields(final int row);
}

class MyTable extends JTable {

    private DetailView detailView;

    public MyTable() {
        String[][] rowData = {
            {"Japan", "12"}, {"USA", "22"}, {"Italien", "222"},
            {"Spanien", "21"}, {"Türkei", "21"}, {"England", "21"},
            {"Frankreich", "19"}, {"Griechenland", "18"},
            {"Deutschland", "18"}, {"Portugal", "17"}
        };
        String[] columnNames = {
            "Land", "Platz"
        };
        // TableModel Sortierung geht von alleine!!
        DefaultTableModel model = new DefaultTableModel(rowData, columnNames) {

            @Override
            public boolean isCellEditable(final int row, final int col) {
                return false;
            }
        };
        setAutoCreateRowSorter(true);
        this.setModel(model);
        this.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(final MouseEvent e) {
                if (e.getClickCount() == 2) {
                    detailView.fillTextFields(convertRowIndexToModel(getSelectedRow()));
                }
            }
        });
    }

    public void setDetailView(final DetailView detail) {
        this.detailView = detail;
    }
}
 
O mann. Genau das was ich gesucht habe.
Ich hatte schon mal nachgefragt und nur blöde Antworten bekommen :(

Ich habe ehrlich gesagt noch keine Interfaces benutzt, denn irgendwie verwirrt mich das. Wenn es nicht zuviel verlangt ist hätte ich noch eine bitte, kannst du mir erklären, am besten anhand deines Beispiels, wie das funktioniert?

Du machst in MyTable eigentlich nur das Interface bekannt undrufst beim Doppelklick die Methode dieses Interfaces auf und übergibst die Zeile.. also nur als Integer wert.

Ausserdem wird eine instanz von MyTable erzeugt die dann irgendwie die Zeile bekommt.. so wies aussieht NUR diese Zeile.. das geschieht mit dem aufruf dieser Methode

Code:
    public void setDetailView(final DetailView detail) {
        this.detailView = detail;
    }

also so
Code:
table.setDetailView(this);

Die aufrufende Klasse kennt das Interface auch.. ok.. und this ist in diesem fall das Interface

aber genau das versteh ich nicht.. also die Methode setDetailView..


auf jeden Fall schon mal ein dickes merci für deine Hilfe :)

EDIT: ist die Lösung evtl. diese.. Du erzeugst die Tabelle und holst dir durch die Schnittstelle eigentlich nur die Zeilennummer..
 
Zuletzt bearbeitet:
Na denn sag ich vielen Dank.

Darf dir gar nicht sagen wie lange ich schon versuche ne vernünftige lösung dafür zu finden. Denn das mit der Reflection geht zwar, hat mir aber gar nicht gefallen ^^
 

Neue Beiträge

Zurück