JButtons mit JTable verknüpfen

Status
Nicht offen für weitere Antworten.

PollerJava

Top Contributor
Hallo nochmal,

Ich habe mehrere JButtons und ich möchte jeden JButton mit einer JList verbinden,
Hätte da jemand einen Tipp, wie ich das am Besten realisieren kann? Mit einem Observer- Pattern oder soll ich den JButton und die JList direkt koppeln?

Vielen Dank für Eure Ideen,

lg
 

mimo

Aktives Mitglied
Das kommt auf die Fragestellung an, aber Observer ist laut Definition eine 1 zu n Verknüpfung. Also warum meherer Interfaces und sonstiges um ein Object zu steuern???
 

PollerJava

Top Contributor
Naja, das Problem ist auch, wenn ich in der JListe z.B. die Größe des JButtons ändere, dann soll das der JButton auf dem JPanel tun (wenn ich in der JListe ENTER gedrückt habe),
Umgekehrt sollen sich z.B.: die x/y- Koordinaten in der JList ändern, wenn ich den JButton auf meinem JPanel umherziehe (das umherziehenfunktioniert schon, es geht nur um die Attribute des JButtons)

Ich bin mir eben nicht sicher, wie ich das machen kann, soll ich den JButton gemeinsam mit der dazugehörigen JList in einem Objekt speichern oder soll ich diese lose koppeln oder gibts vielleicht ein Design Pattern, mit dem ich dieses Problem lösen könnte,

Hat jemand noch eine Idee,
 

PollerJava

Top Contributor
Muss mich nochmal nach oben schieben,

Gibts kein erprobtes Muster um einzelnen JButtons (z.B.: 10 JButtons) -> jeden JButton mit einer JTable zu verbinden,
und wenn ich in der JTable etwas verändere (z.B.: die Breite) dann sollte sich die Breite des JButtons ändern,

lg
 
T

tuxedo

Gast
Man man man.. Wozu gibts denn das Listener-Prinzip?

Du lässt jeden Button ein Listener-Interface implementieren. In deiner Tabelle bzw. dem CellEditor machst du dann eine "addXyzListener()" Methode rein mit der du die Buttons mit der Tabelle verknüpfst. Bei änderungen in der Tabelle (da gibts auch wieder modified oder changelistener) meldest du die änderungen an die registrierten Listsner der Buttons. Fertig.

BTW: ob's jetzt ne Tabelle oder ne Liste ist, ist wurscht.

- Alex
 

PollerJava

Top Contributor
Hört sich ganz gut an,
ganz hab ichs noch nicht,

Mein Interface schaut dann so irgendwie aus:
Code:
interface MyXYZListener {
void modified();
void changelistener();
}



meine JButton- Klasse schaut dann so aus:

Code:
public class MyButton extends JButton implements MyXYZListener {
// Methoden des XYZListener
}


Bei meiner Tabelle mache ich dann folgendes?:

Code:
myTable.addMyXYZListener();
...
// wenn sich was tut:
myTable.modified() oder myTable.changelistener();

lieg ich da richtig oder hab ich da was falsch verstanden, mir ist die unterscheidung nicht ganz klar -> wenn Tabelle 2 geändert wurde sollte ja z.B.: nut Button 2 die Änderung mitbekommen,

Vielen Dank für deine Antworten (und Geduld),

lg
 
T

tuxedo

Gast
Aaaalso. Ist doch ganz einfach.


Du hast eine JTable. Zusammen mit dieser hat du einen TableCellEditor. Dieser kennt eine addCellEditorListener() Methode der du einen CellEditorListener mitgibst.

Dieser Listener wird dann getriggert wenn sich was an der Tabelle änder (z.B. eine Benutzereingabe gemacht wurde).

So. Das ist der erste Streich.

Deine Tabelle/TableCellEditor braucht dann eine weitere Methode wie z.B. addMyButtonListener (). Diese Methode nimmt dann ein Objekt entgegen das das Interface "MyButtonListener " implementiert hat.

Dieses Interface sieht dann z.B. so aus:

Code:
interface MyButtonListener {
void changeSize(int width, int height);
void changeText(String text);
void changeLocation(int x, int y);
}

So, dann hast du deine Buttons:

Code:
public class MyButton extends JButton implements MyButtonListener {
// implementiert Methoden des MyButtonListeners
}

So... Der CellEditorListener hat laut API Doc folgende Methode:

Code:
void editingStopped(ChangeEvent e)

Darin kannst du also abfangen wenn es Änderungen gab. In dieser Methode, die du ja selbst implementieren musst, kannst du dann durch alle in deiner Tabelle/TableCellEditor mit addMyButtonListener() registrierten MyButtonListener gehen und die Änderungen die in der Tabelle gemacht wurden (z.B. die größe des Buttons geändert) entsprechend über die Methoden in MyButtonListener dem Button mitteilen.

Mehr ist es nicht.
 
T

tuxedo

Gast
Vielleicht ist der CellEditorListener nicht der beste für diesen Anwendungszweck, aber es ist ein erster Anhaltspunkt.
 

PollerJava

Top Contributor
Hallo Alex nochmal,

ich komm nicht ganz hin,
Mein Programm schaut mom so aus, Könntest Du vielleicht kurz drüberschaun, irgendwie wird keine Methode aufgerufen, wenn ich etwas in der Tabelle ändere,

Dankeschön,

Code:
//**************** Main *************************/
package listenerprojekt;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;

public class Main {
    String[][] data = new String[][]{
            {"a", "b", "c", "d"},
            {"e", "f", "g", "h"},
            {"i", "j", "k", "l"}
      };            
      String[] title = new String[]{
            "A", "B", "C", "D"
      };
    private JScrollPane pane;
  
    public Main() {
        MyButton but = new MyButton("TestButton");
        but.setBackground(Color.RED);
        but.setBounds(10, 10, 200, 50);
        JFrame frame = new JFrame("Listener- Beispiel");
        frame.setBounds(10,10, 300, 700);
        frame.setLayout(new BorderLayout());
                                                                           // hier irgendwo vermute ich meinen Fehler:
        JTable table = new JTable(data,title);                           // tabelle anlegen
        MyTableCellEditor tce = new MyTableCellEditor();         // TableCellEditor anlegen 
        tce.addCellEditorListener(new MyCellEditorListener());  // listener zu TableCellEditor hinzufügen
        tce.addMyButtonListener(but);
        table.setCellEditor(tce);
        pane = new JScrollPane(table);
        frame.add(pane, BorderLayout.NORTH);
        frame.add(but, BorderLayout.SOUTH);
        frame.setVisible(true);
    }
       
    public static void main(String[] args) {
       new Main();
    }    
}

//**************** MyTableCellEditor  *************************/
package listenerprojekt;

import java.awt.Component;
import java.util.EventObject;
import javax.swing.AbstractCellEditor;
import javax.swing.JTable;
import javax.swing.event.CellEditorListener;
import javax.swing.table.TableCellEditor;

public class MyTableCellEditor extends AbstractCellEditor implements TableCellEditor {
    MyButtonListener but;
       
    public MyTableCellEditor() {
    }
    public Object getCellEditorValue() {
        return "Methode getCellEditorValue";
    }
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        return table;
    }    
    public void addMyButtonListener(MyButtonListener mbl) {
        this.but = mbl;
    }
}

//**************** MyCellEditorListener *************************/

package listenerprojekt;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;

public class MyCellEditorListener implements CellEditorListener {
    
    public MyCellEditorListener() {
        super();
    }
    public void editingStopped(ChangeEvent e) {
        System.out.println("Es hat sich was getan in der Methode editingStopped");
    }
    public void editingCanceled(ChangeEvent e) {
        System.out.println("Es hat sich was getan in der Methode editingCanceled");
    } 
}

//**************** MyButtonListener *************************/ 
package listenerprojekt;

public interface MyButtonListener {
    void changeSize(int width, int height);
    void changeText(String text);
    void changeLocation(int x, int y);
}


//**************** MyButton *************************/ 
package listenerprojekt;
import javax.swing.JButton;

public class MyButton extends JButton implements MyButtonListener {

    public MyButton(String name) {
        super("My" + name);
    }
    public void changeSize(int width, int height) {
        System.out.println("Die Größe muss geändert werden");
    }
    public void changeText(String text) {
        this.setText("Irgendwas");
    }
    public void changeLocation(int x, int y) {
        System.out.println("Die Location muss geändert werden");
    }   
}
 
T

tuxedo

Gast
Hmm, gute Frage. Hab lang nix mehr mit Tabellen gemacht und da auch noch keinen Listener verwendet. google doch einfach mal nach listener und tablecelleditor ..

- Alex
 

PollerJava

Top Contributor
aber grundsätzlich müsste es ja so passen, oder, nur die Methoden
public void editingStopped(ChangeEvent e)
public void editingCanceled(ChangeEvent e)
werden nicht aufgerufen, aber vom Aufbau her glaub ich, passts,

lg
 
T

tuxedo

Gast
Jupp, Grundsätzlich müssts stimmen. Aber irgendwo is noch der Wurm drin.

- Alex
 

PollerJava

Top Contributor
Hallo,

Das mit dem TableModelListener funktioniert schon, wennn ich den Listenener zum den Model hinzufüge ,dann wird die Methode unten aufgerufen, aber wie kann ich jes jetzt realidieren, dass mein JButton sich ändert wenn ich in der JTabel etwas eingabe?

Vielen dank für Deine/Eure Hilfe,

lg

Code:
table.getModel().addTableModelListener(new MyTableModelListener());

Code:
public class MyTableModelListener implements TableModelListener {
    
    public MyTableModelListener() {
        super();
    } 

    public void tableChanged(TableModelEvent e) {
        System.out.println("Es hat sich was getan in der Tabelle: " + e.getSource());
    }
}
 
T

tuxedo

Gast
Man, Bub, daz braucht man nichtmal Hirnschmalz.

Code:
import java.util.ArrayList;
import java.util.List;

import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;


public class MyTableModelListener implements TableModelListener{

	private List<ButtonListener> buttonListeners = new ArrayList<ButtonListener>();

	public void tableChanged(TableModelEvent e) {
		
		// jeden registrierten ButtonListener ansprechen
		for (ButtonListener buttonListener : buttonListeners) {
			
			int column = e.getColumn();
			int firstRow = e.getFirstRow();
			
			// Irgendwie aus der Tabelle mit column und firstRow 
			// die notwenidgen Daten gewinnen un din x und y speichern
			// Das ist dein Part, den musst du dir ausdenken. Weiß ja nicht
			// wie die Tabelle aussieht. Soll hier ja auch nur ein Beispiel sein.
			int x = 0;
			int y = 0;
			
			
			buttonListener.sizeChanged(x, y);
		}
	}

	public void addButtonListener(ButtonListener buttonListener){
		buttonListeners.add(buttonListener);
	}

}


Das ganze muss nicht im MyTableModelListener stattfinden. Du kannst das auch weiter oben in der Hierarchie (in der Tabelle selbst) platzieren.

- Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Integers in jButtons weiterverwenden Allgemeine Java-Themen 8
Lord.Djerun (Taschenrechner) jButtons mit gleicher Funktion zusammenfassen Allgemeine Java-Themen 6
A Multithreading mit JButtons Allgemeine Java-Themen 5
Developer_X JButtons werden nicht angezeigt Allgemeine Java-Themen 26
H JButtons selbst gestallten Allgemeine Java-Themen 6
KeTho1712 Java Swing: JTable standardmäßig füllen, sodass bei Start bereits Datensätze gespeichert sind Allgemeine Java-Themen 1
H Swing JTextArea als TableCellRenderer in JTable - wie Zeilen selektieren? Allgemeine Java-Themen 47
D JTable mit JTextAreas in den Zellen Allgemeine Java-Themen 8
X Swing JTable zeigt nichts Allgemeine Java-Themen 4
G jTable aktualisieren?! Allgemeine Java-Themen 1
S JTable - mehrere ausgewählte Rows in ArrayList Allgemeine Java-Themen 5
A Fehler beim Aktualisieren JTable Allgemeine Java-Themen 1
D falsche Zeile aus JTable in MySQL gelöscht Allgemeine Java-Themen 6
offi Drag and Drop mehrerer File aus Explorer in JTable Allgemeine Java-Themen 1
V JTable Externe Lib Allgemeine Java-Themen 2
F JTable Pfeiltasten-Verhalten Allgemeine Java-Themen 1
T jTable Gestaffelte Überschriften Allgemeine Java-Themen 22
Paul15 2D Arraylist in Jtable Allgemeine Java-Themen 1
R jTable, nur Werte zwischen 2 Double values ausgeben Allgemeine Java-Themen 3
B Klassen JTable mit einer Liste Allgemeine Java-Themen 0
A JTable Bilder Allgemeine Java-Themen 1
F JTable mit Zellen die sich durch andere Eingaben füllen Allgemeine Java-Themen 1
A JTable - CellRange auslesen Allgemeine Java-Themen 2
A jTable Renderer Allgemeine Java-Themen 5
N JTable filtern Allgemeine Java-Themen 3
hdi JTable#print & Druckgröße Allgemeine Java-Themen 6
S JTable: Model durch ein anderes ersetzen Allgemeine Java-Themen 2
G JTable: ListSelectionListener removen Allgemeine Java-Themen 8
M JTable + ArrayList Allgemeine Java-Themen 3
G Aktualisierung einer JTable erfolgt nicht zuverlässig Allgemeine Java-Themen 14
E Hintergrund einer JTable änden Allgemeine Java-Themen 2
G Darstellung von Ergebnissen einer Dokumentensuche über eine JTable Allgemeine Java-Themen 19
Iron Monkey Inhalt von JTable in die Textdatei mit StringWidth schreiben Allgemeine Java-Themen 3
P jTable getSelectedRow? Allgemeine Java-Themen 2
B JTable eigene Daten Add Methode Allgemeine Java-Themen 2
B LEERE JTable MouseListener + popupmenu Allgemeine Java-Themen 2
X xml aus Zip in JTable Allgemeine Java-Themen 2
L jTable drag & drop einzelner Zeilen Allgemeine Java-Themen 4
S JTable und Spalten löschen Frage Allgemeine Java-Themen 5
H JTable per iText in PDF: Größenanpassung möglich? Allgemeine Java-Themen 2
F XML zu JTable mit JDOM Allgemeine Java-Themen 2
E JTable wird nicht angezeigt Allgemeine Java-Themen 11
Screen ImageIcon in Cell der JTable Allgemeine Java-Themen 2
G JTable mit Keylistener geht nicht Allgemeine Java-Themen 3
C Swing JTable Vector aus DB adden Allgemeine Java-Themen 3
A Swing JTable Polymorphismus Allgemeine Java-Themen 2
trash super + JTable Allgemeine Java-Themen 7
D JTable -> 1Spalte nur zahlen Allgemeine Java-Themen 2
L JTABLE setvalueat methode! Allgemeine Java-Themen 16
C Swing Daten zwischen JTable teilen Allgemeine Java-Themen 6
hdi JTable: Sortierung von Date-Objekten Allgemeine Java-Themen 4
B JTable nach Icon sortieren Allgemeine Java-Themen 6
N Exception beim auslesen einer JTable Allgemeine Java-Themen 5
M jdesktop binding: jTable update nach Änderung... Allgemeine Java-Themen 3
D JTable mit GROUP BY Allgemeine Java-Themen 23
martin82 Regex - JTable - Filter Allgemeine Java-Themen 10
X JTable mit Checkboxen -> Setzen (true/false) der Checkboxen per Mouseklick... Allgemeine Java-Themen 3
P JTable drucken Allgemeine Java-Themen 8
A JTable Feldwerte in JTextFelder mit blättern Allgemeine Java-Themen 5
DStrohma [Erledigt] Wieso kann ich Taste 'ENTER' in JTable nicht belegen? Allgemeine Java-Themen 2
M jTable Allgemeine Java-Themen 19
D jTable und TableModel Allgemeine Java-Themen 2
B Exception bei leerem JTable verhindern Allgemeine Java-Themen 10
A Observable BeansBinding an einer JTable bzw. JXTable Allgemeine Java-Themen 3
P Textfile -> Array -> JTable Allgemeine Java-Themen 9
S JTable Aktuelisieren ber Wie ? Allgemeine Java-Themen 4
MQue JComboBox in JTable Allgemeine Java-Themen 4
J Ergebnismenge eines SQL-Queries in JTable anzeigen Allgemeine Java-Themen 3
MQue JTable alles rechts Allgemeine Java-Themen 8
G Checkboxen abfragen,Auswahl sichern, JTable laden Allgemeine Java-Themen 2
G Hibernate, JTable und Performance Allgemeine Java-Themen 17
R JTable und Cell Renderer Allgemeine Java-Themen 3
M JTable: Anzahl Zeichen bei Eingabe Allgemeine Java-Themen 2
S Welche Speicherung von Daten bei Kalendarfunktion der jtable Allgemeine Java-Themen 7
J keylistener auf jtable Allgemeine Java-Themen 19
C JTable, Abstand zwischen Zellen Allgemeine Java-Themen 2
G Eindeutiges Identifizieren einer JTable/Component z.laufzeit Allgemeine Java-Themen 2
D JTable -> ArrayIndexOutOfBoundsException bei Mausklick Allgemeine Java-Themen 2
S JTable editieren + in JTextField schreiben Allgemeine Java-Themen 7
G Daten in / für JTable beim Scrollen nachladen? Allgemeine Java-Themen 5
M JTable verändert Position auf meinem JPanel Allgemeine Java-Themen 3
P JTable Allgemeine Java-Themen 2
H JTable Löschen [Alle Zeilen aufeinmal Löschen] Allgemeine Java-Themen 6
P JTable setDataVector Allgemeine Java-Themen 2
D Scrollbalken in meiner JTable auf einmal weg. Allgemeine Java-Themen 2
P JTable Allgemeine Java-Themen 8
G fehler bei JTable mit JDK1.6 Allgemeine Java-Themen 4
M CheckBox in JTable - ich verzweifle gleich Allgemeine Java-Themen 2
P JTable/Vector Allgemeine Java-Themen 5
P JTable Allgemeine Java-Themen 4
E JButton bleibt in der JTable Allgemeine Java-Themen 2
E JButton in einer Zelle von JTable Allgemeine Java-Themen 16
P JTable selektierte Zeile mitwandern Allgemeine Java-Themen 2
F Checkbox in JTable , eigener Cellrenderer -wie gehts weiter? Allgemeine Java-Themen 2
P JTable suchen in einer Spalte Allgemeine Java-Themen 24
G JTable wird nicht richtig aufgebaut Allgemeine Java-Themen 9
C Ausdrucken einer JTable in eine Datei mit Erhalt des Formats Allgemeine Java-Themen 3
W Columns austauschen/verschieben von jtable Allgemeine Java-Themen 3
P 3rd party JTable libraries (freeware/opensource) Allgemeine Java-Themen 19
D JTable aus Eclipse Ok, kompeliert aber nicht Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben