# JTable mit Buttons?



## Gast (28. Feb 2005)

Hallo, ich wollt hier gleich mal die Profis fragen, ob das überhaupt machbar ist, ich will in ein JTable Buttons einfügen und wenn man dann auf den jeweiligen Button im JTable klickt soll die Tabelle gefüllt werden. Das mit den Button und dem Füllen der Tabelle würd ich dann wohl hinbekommen, aber erst mal in die Tabelle zu kriegen, schaff ich schon nicht, kann mir da jemand helfen?

Mein Code schaut bisher so aus:

```
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

public class Test{
   public static void main( String[] args ){
      // Die Daten für das Table
      Vector data = new Vector();
         Vector rowA = new Vector();
         JButton btnBeenden, btnNeu;
            rowA.add(  "0" );
            rowA.add(  "2" );
            rowA.add(  "4" );
            rowA.add(  "6" );
         Vector rowB = new Vector();
            rowB.add(  "1" );
            rowB.add(  "3" );
            rowB.add(  "5" );
            rowB.add(  "7" );
            // Hier soll ein Button rein
            rowB.add(   "btnNeu = new JButton( "Neue Werte" ));
         Vector rowC = new Vector();
            rowC.add(  "9" );
            rowC.add( "10" );
            rowC.add( "11" );
            rowC.add( "12" );
            // und hier der nächste Button
            rowC.add( "btnBeenden = new JButton( "Beenden" )); 
      
         data.add( rowA );
         data.add( rowB );
         data.add( rowC );
            
      // Die Titel 
      Vector title = new Vector();
         title.add( "A" );
         title.add( "B" );
         title.add( "C" );
         title.add( "D" );
         title.add( "Buttons" );
      
      JTable table = new JTable(  data, title );
      
      JFrame frame = new JFrame( "Test" );
      frame.getContentPane().add( new JScrollPane( table ) );
      frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
      frame.pack();
      frame.setVisible( true );
   }
}
```

Kennt da jemand ne Mäglichkeit? Wäre super, ich weiß da nicht mehr weiter.


----------



## Beni (28. Feb 2005)

Dazu musst du einen TableCellEditor (simuliert den Druck auf den Knopf) implementieren (und auch einen TableCellRenderer (simuliert den Button ohne dass was geschieht, einfach die Darstellung)).

Ich verweise dich mal auf die FAQ.


----------



## abollm (28. Feb 2005)

Ich habe hier Beispielcode, zunächst für den Button Renderer:

```
import java.awt.Component;

import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.TableCellRenderer;


public class ButtonRenderer extends JButton implements TableCellRenderer {

	public ButtonRenderer() {
		setOpaque(true);
	}

	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		if (isSelected) {
			setForeground(table.getSelectionForeground());
			setBackground(table.getSelectionBackground());
		} else {
			setForeground(table.getForeground());
			setBackground(UIManager.getColor("Button.background"));
		}
		setText((value == null) ? "" : value.toString());
		return this;
	}
}
```

Und hier für die Hauptklasse mit Button Editor (ext. Cell Editor) mit einem simplen Beispiel (auf Knopfdruck wird der Währungsbetrag in der jeweils anderen Währung angezeigt):


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;

public class JButtonTableExample extends JFrame {

	public JButtonTableExample() {
		super("JButtonTable Beispiel");

		DefaultTableModel dm = new DefaultTableModel() {
			public boolean isCellEditable(int rowIndex, int columnIndex) {
				if (columnIndex == 1)
					return false;
				return true;
			}
		};
		String amountDollar[] = {"8,76 $","7,78 $"};
		String amountEuro[] = {"10,00 €", "8,88 €"};
		dm.setDataVector(new Object[][] { { "Drück mich für $!", amountEuro[0], "Sorten" },
				{ "Drück mich für €!", amountDollar[0], "---" } }, new Object[] { "Knopf",
				"Betrag in [$] oder [€]", "Bemerkung" });

		JTable table = new JTable(dm);
		table.getColumn("Knopf").setCellRenderer(new ButtonRenderer());
		ButtonEditor editor = new ButtonEditor(new JCheckBox(), "Drück mich für €!",
				"Drück mich für $!");
		// Cell-Editor zu Spalte hinzufügen
		editor
				.addCellEditorListener(new MyListener(table, 1, amountEuro[0],
						amountDollar[0]));
		table.getColumn("Knopf").setCellEditor(editor);
		getContentPane().add(new JScrollPane(table));
	}

	public static void main(String[] args) {
		JButtonTableExample frame = new JButtonTableExample();
		frame.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		frame.setLocation(100, 100);
		frame.setSize(650, 200);
		frame.setVisible(true);
	}
}

class MyListener implements CellEditorListener {
	private JTable table;

	private TableModel model;

	private int col;

	private String currency1;

	private String currency2;

	MyListener(JTable table, int col, String sideA, String sideB) {
		this.table = table;
		this.model = table.getModel();       //getModel();
		this.col = col; // Ziel-Spalte für Text
		this.currency1 = sideA;
		this.currency2 = sideB;
	}

	public void editingStopped(ChangeEvent e) {
		int row = table.getSelectedRow();
		String str = (String) model.getValueAt(row, col);
		if (currency1.equals(str)) {
			model.setValueAt(new String(currency2), row, col);
		} else {
			model.setValueAt(new String(currency1), row, col);
		}
	}

	public void editingCanceled(ChangeEvent e) {
	}
}

class ButtonEditor extends DefaultCellEditor {
	protected JButton button;

	private String label;

	private boolean isPushed;

	private String sel1;

	private String sel2;

	public ButtonEditor(JCheckBox checkBox, String selection1, String selection2) {
		super(checkBox);
		this.sel1 = selection1;
		this.sel2 = selection2;
		button = new JButton();
		button.setOpaque(true);
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				fireEditingStopped();
			}
		});
	}

	public Component getTableCellEditorComponent(JTable table, Object value,
			boolean isSelected, int row, int column) {
		if (isSelected) {
			button.setForeground(table.getSelectionForeground());
			button.setBackground(table.getSelectionBackground());
		} else {
			button.setForeground(table.getForeground());
			button.setBackground(table.getBackground());
		}
		label = (value == null) ? "" : value.toString();
		button.setText(label);
		isPushed = true;
		return button;
	}

	public Object getCellEditorValue() {
		if (isPushed) {
			if (sel1.equals(label)) {
				label = sel2;
			} else {
				label = sel1;
			}
		}
		isPushed = false;
		return new String(label);
	}

	public boolean stopCellEditing() {
		isPushed = false;
		return super.stopCellEditing();
	}

	protected void fireEditingStopped() {
		super.fireEditingStopped();
	}
}
```

Hoffe dir geholfen zu haben.


----------



## L-ectron-X (28. Feb 2005)

Hm abollm, wenn ich die Klassen kompiliere, ist der Compiler der Meinung, das die Klasse ButtonRenderer fehlt.


----------



## abollm (28. Feb 2005)

L-ectron-X hat gesagt.:
			
		

> Hm abollm, wenn ich die Klassen kompiliere, ist der Compiler der Meinung, das die Klasse ButtonRenderer fehlt.



Hmm, ich habe das obige Beispiel (also den Code per Copy and Paste) einmal in einem anderen Projekt kompiliert und keine Probleme gehabt. Meine Randbedingungen:

Java 1.5.0 b63
Eclipse 3.0M9

Andere Einflussfaktoren (OS etc.) kann ich mir nicht vorstellen.

Muss wohl ein anderes Problem sein, am Code scheint es wahrlich nicht zu liegen.


----------



## Illuvatar (28. Feb 2005)

Hihi Lex, nimm mal _beide_ Klassen


----------



## L-ectron-X (28. Feb 2005)

:lol: Das ist der Nachteil von diesen 16:9 Laptop-Panels. Man sieht den Wald vor lauter Bäumen nicht.
Sorry, vielmals. Ich werd wohl alt. Naja, hab wohl den Avatar doch verdient.   :wink:


----------



## abollm (28. Feb 2005)

L-ectron-X hat gesagt.:
			
		

> :lol: Das ist der Nachteil von diesen 16:9 Laptop-Panels. Man sieht den Wald vor lauter Bäumen nicht.
> Sorry, vielmals. [..]



Das ist alles eine Frage der Übung, weniger des Alters. Ich habe so ein Ding auch seit einigen Wochen (mit total schwammiger Tastatur).


----------



## Gast (1. Mrz 2005)

Hey, danke für diesen tollen Tipp bzw. dieses super Beispiel, damigt hab ich es jetzt richtig gut hinbekommen, danke abollm


----------



## prob12 (1. Mrz 2005)

Hallo da ihr euch hier ja eh gerade über das Thema unterhaltet hab ich da mal ne Frage an 

die Profis hier. Ich hab mir nach obiger Vorlage von abollm so eine Tabelle gebaut und versuche damit, dort meine erzeugten Daten einzufüllen in die Tabelle. Das ganze soll ein kleines Würfelspiel werden. Die Zahlen werden in einem sepaeratem Fenster generiert.
Es schaut auch so aus wie es soll, so weit so gut. 
Jetzt kommt der Kern der Sache, ich möchte nicht, dass der Buttontext verändert wird, also wenn dort z.B.steht "1er", soll der Buttontext bestehen bleiben und nicht verändert werden, ich hab jetzt schon so einiges probiert, aber wenn ich da irgendwas rausnehme bzw. versuche umzuschreiben nörgelt Eclipse gleich rum, kann da nochmal jemand bei mir schauen? Wäre super, ich hänge mal meinen Code dran für die Tabelle und vorab ne Grafik wie es aussehen soll.

Aso und 2. Sache, der letzte Eintrag soll ein Label sein und kein Button, da "Summe" nicht anklicken können soll. Ich hoffe mir kann da jemand helfen, oder gibt es sogar noch ne bessere Möglickeit so etwas zu erstellen?
Grafik:


```
-------------------------------------------
| Wurf	       |Spieler 1    |	Spieler 2  |
-------------------------------------------
| Button "1er" |      0      |       0     |
-------------------------------------------
| Button "2er" |      0	     |       0     |
-------------------------------------------
| Button "3er" |      0      |       0     |
-------------------------------------------
| Button "4er" |      0      |       0     |
-------------------------------------------
| Button "5er" |      0      |       0     |
-------------------------------------------
| Button "6er" |      0      |       0     |
-------------------------------------------
| Label "Summe"|      0      |       0     |
-------------------------------------------
```


1. ButtonRenderer


```
import java.awt.Component; 

import javax.swing.JButton; 
import javax.swing.JTable; 
import javax.swing.UIManager; 
import javax.swing.table.TableCellRenderer; 


public class ButtonRenderer extends JButton implements TableCellRenderer { 

   public ButtonRenderer() { 
      setOpaque(true); 
   } 

  public Component getTableCellRendererComponent(JTable table, Object value, 
         boolean isSelected, boolean hasFocus, int row, int column) { 
      if (isSelected) { 
         setForeground(table.getSelectionForeground()); 
         setBackground(table.getSelectionBackground()); 
      } else { 
         setForeground(table.getForeground()); 
         setBackground(UIManager.getColor("Button.background")); 
      } 
      setText((value == null) ? "" : value.toString()); 
      return this; 
   } 
}
```

2. JButtonTableExample

```
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.table.*; 
import javax.swing.event.*; 

public class JButtonTableExample extends JFrame { 

   public JButtonTableExample() { 
      super("JButtonTable Beispiel"); 

      DefaultTableModel dm = new DefaultTableModel() { 
         public boolean isCellEditable(int rowIndex, int columnIndex) { 
            if (columnIndex == 1) 
               return false; 
            return true; 
         } 
      }; 
      String amountEuro[] = {"0", "0" }; 
      dm.setDataVector(new Object[][] { 
      { { "1er", amountEuro[0], amountEuro[1]}, 
        { "2er", amountEuro[0], amountEuro[1]}, 
        { "3er", amountEuro[0], amountEuro[1]}, 
	{ "4er", amountEuro[0], amountEuro[1]}, 
        { "5er", amountEuro[0], amountEuro[1]}, 
        { "6er", amountEuro[0], amountEuro[1]},
        { "Summe", amountEuro[0], amountEuro[1]}},
 
      new Object[] { "Wurf", 
               "Spieler 1", "Spieler 2" });

      JTable table = new JTable(dm); 
      table.getColumn("Wurf").setCellRenderer(new ButtonRenderer()); 
      ButtonEditor editor = new ButtonEditor(new JCheckBox(), "1er", 
            "2er"); 
      // Cell-Editor zu Spalte hinzufügen 
      editor 
            .addCellEditorListener(new MyListener(table, 1, amountEuro[0], 
                  amountEuro[0])); 
      table.getColumn("Wurf").setCellEditor(editor); 
      getContentPane().add(new JScrollPane(table)); 
   } 

   public static void main(String[] args) { 
      JButtonTableExample frame = new JButtonTableExample(); 
      frame.addWindowListener(new WindowAdapter() { 
         public void windowClosing(WindowEvent e) { 
            System.exit(0); 
         } 
      }); 
      frame.setLocation(100, 100); 
      frame.setSize(950, 200); 
      frame.setVisible(true); 
   } 
} 

class MyListener implements CellEditorListener { 
   private JTable table; 

   private TableModel model; 

   private int col; 

   private String currency1; 

   private String currency2; 

   MyListener(JTable table, int col, String sideA, String sideB) { 
      this.table = table; 
      this.model = table.getModel();       //getModel(); 
      this.col = col; // Ziel-Spalte für Text 
      this.currency1 = sideA; 
      this.currency2 = sideB; 
   } 

   public void editingStopped(ChangeEvent e) { 
      int row = table.getSelectedRow(); 
      String str = (String) model.getValueAt(row, col); 
      if (currency1.equals(str)) { 
         model.setValueAt(new String(currency2), row, col); 
      } else { 
         model.setValueAt(new String(currency1), row, col); 
      } 
   } 

   public void editingCanceled(ChangeEvent e) { 
   } 
} 

class ButtonEditor extends DefaultCellEditor { 
   protected JButton button; 

   private String label; 

   private boolean isPushed; 

   private String sel1; 

   private String sel2; 

   public ButtonEditor(JCheckBox checkBox, String selection1, String selection2) { 
      super(checkBox); 
      this.sel1 = selection1; 
      this.sel2 = selection2; 
      button = new JButton(); 
      button.setOpaque(true); 
      button.addActionListener(new ActionListener() { 
         public void actionPerformed(ActionEvent e) { 
            fireEditingStopped(); 
         } 
      }); 
   } 

   public Component getTableCellEditorComponent(JTable table, Object value, 
         boolean isSelected, int row, int column) { 
      if (isSelected) { 
         button.setForeground(table.getSelectionForeground()); 
         button.setBackground(table.getSelectionBackground()); 
      } else { 
         button.setForeground(table.getForeground()); 
         button.setBackground(table.getBackground()); 
      } 
      label = (value == null) ? "" : value.toString(); 
      button.setText(label); 
      isPushed = true; 
      return button; 
   } 

   public Object getCellEditorValue() { 
      if (isPushed) { 
         if (sel1.equals(label)) { 
            label = sel2; 
         } else { 
            label = sel1; 
         } 
      } 
      isPushed = false; 
      return new String(label); 
   } 

   public boolean stopCellEditing() { 
      isPushed = false; 
      return super.stopCellEditing(); 
   } 

   protected void fireEditingStopped() { 
      super.fireEditingStopped(); 
   } 
}
```


----------



## abollm (1. Mrz 2005)

Ja, so ist das mit Beispielen. Die sind meistens für einen bestimmten Anwendungszweck geschrieben.
Ich schau mir dein Teil einmal heute oder spätestens morgen an. Wenn ich eine Lösung und/oder Frage dazu habe, poste ich hier.


----------



## prob12 (1. Mrz 2005)

Das wäre ja supernett, danke


----------



## abollm (2. Mrz 2005)

Hier einmal ein Grundgerüst für dein geplantes Spiel. Der Code ist selbsterklärend. Allerdings ist das Problem mit der Summe noch offen. Dafür habe ich zwar schon eine Lösung im Kopf, aber die erscheint mir für dein Problem als zu aufwändig.

Vielleicht schaust du selbst einmal, wie du in _einer Spalte_ unterschiedliche Renderer unterbringen kannst. Das geht wohl, aber ich habe dazu jetzt leider keine Zeit mehr.


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

public class MyGame extends JFrame {
	public MyGame() {
		super("Beispiel für ein einfaches Spiel");
		String[] columnNames = { "Wurf", "Spieler 1", "Spieler 2", "Bemerkung" };
		Object[][] playerData = {
				{ "Spieler 1", new Integer(11), new Integer(12), "" },
				{ "Spieler 2", new Integer(21), new Integer(22), "" },
				{ "Spieler 3", new Integer(31), new Integer(32), "" },
				{ "Spieler 4", new Integer(31), new Integer(32), "" },
				{ "Spieler 5", new Integer(31), new Integer(32), "" },
				{ "Spieler 6", new Integer(41), new Integer(42), "" } };

		Object[][] sumData = { { "Summe", new Integer(99), new Integer(99), "" } };

		DefaultTableModel dmb = new DefaultTableModel(playerData, columnNames);
		JTable tableButton = new JTable(dmb) {
			//  Gibt die Klasse jeder Spalte zurück. Erlaubt verschiedene 
			//  Renderer auf der Basis der jeweiligen Klasse
			public Class getColumnClass(int column) {
				return getValueAt(0, column).getClass();
			}
		};

		DefaultTableModel dml = new DefaultTableModel(sumData, columnNames);
		JTable tableLabel = new JTable(dml) {
			public Class getColumnClass(int column) {
				return getValueAt(0, column).getClass();
			}
		};

		JScrollPane scrollPane = new JScrollPane(tableButton);
		getContentPane().add(scrollPane);

		//  Erzeuge JButton für Spalte 0 (Achtung - gilt für die komplette Spalte!)
		ButtonColumn buttonColumn = new ButtonColumn(tableButton, 0);

	}

	public static void main(String[] args) {
		MyGame frame = new MyGame();
		frame.setSize(800, 300);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
		//frame.pack();
		frame.setVisible(true);
	}

	class ButtonColumn extends AbstractCellEditor implements TableCellRenderer,
			TableCellEditor, ActionListener {
		JTable table;

		JButton renderButton;

		JButton editButton;

		String text;

		public ButtonColumn(JTable table, int column) {
			super();
			this.table = table;
			renderButton = new JButton();

			editButton = new JButton();
			editButton.setFocusPainted(false);
			editButton.addActionListener(this);

			TableColumnModel columnModel = table.getColumnModel();
			columnModel.getColumn(column).setCellRenderer(this);
			columnModel.getColumn(column).setCellEditor(this);
		}

		public Component getTableCellRendererComponent(JTable table,
				Object value, boolean isSelected, boolean hasFocus, int row,
				int column) {
			if (isSelected) {
				renderButton.setForeground(table.getSelectionForeground());
				renderButton.setBackground(table.getSelectionBackground());
			} else {
				renderButton.setForeground(table.getForeground());
				renderButton.setBackground(UIManager
						.getColor("Button.background"));
			}

			renderButton.setText((value == null) ? "" : value.toString());
			return renderButton;
		}

		public Component getTableCellEditorComponent(JTable table,
				Object value, boolean isSelected, int row, int column) {
			text = (value == null) ? "" : value.toString();
			editButton.setText(text);
			return editButton;
		}

		// Gibt Text für JButton zurück
		public Object getCellEditorValue() {
			return text;
		}

		// Was soll auf Knopfdruck passieren?
		public void actionPerformed(ActionEvent e) {
			fireEditingStopped();
			// Schreibt Text auf Konsole
			System.out
					.println("Führe Aktion durch für " + e.getActionCommand());
		}
	}
	//

	//
}
```


----------



## prob12 (2. Mrz 2005)

Hi abollm, vielen Dank für dieses supertolleGrundgerüst, ich hab es gerade mal getestet, sieht klasse aus. Und auch, glaub ich zumindest, ganz gut verstanden. Wegen der Summenspalte schau ich gleich mal rum und melde meinen Erfolg oder Misserfolg. 
Eine Frage zu deinem Code hab ich allerdings noch. Ich hab gerade versucht an den Button "Spieler 1" nen Listener anzumelden. Nur leider tritt da das Problem auf, dass er den Button nicht kennt, da diesem ja kein richtiger Name zugeordnet wird.... ich hab es bis jetzt so probiert


```
Spieler1.addCellEditorListener( this ); 

//bzw.

Spieler1.addActionListener( this );
```
 --> nehm ich da den völlig falschen Listener bzw. völlig falschen Buttonnamen?

Wäre nett, wenn du mir da nochmals etwas unter die Arme greifen könntest. Vielen Dank für die geopferte Zeit.


----------



## Gäst (3. Mrz 2005)

ich würds einfach so machen:

button.addActionListener(new ActionListener() { 
         public void actionPerformed(ActionEvent e) 
       {
         //
         // do something
        }
kann mich aber auch täuschen )


----------



## abollm (3. Mrz 2005)

prob12 hat gesagt.:
			
		

> [..]
> Eine Frage zu deinem Code hab ich allerdings noch. Ich hab gerade versucht an den Button "Spieler 1" nen Listener anzumelden. Nur leider tritt da das Problem auf, dass er den Button nicht kennt, da diesem ja kein richtiger Name zugeordnet wird.... ich hab es bis jetzt so probiert
> 
> [..]
> ...



Ehrlich gesagt, verstehe ich dein Problem nicht genau. Denn du kannst mit den gelieferten "Bordmitteln" bereits eine ganze Menge machen (siehe Methode "public void actionPerformed(ActionEvent e) .."). Es hängt also davon ab, was genau du bei Knopfdruck erreichen willst.

Das kann im Einzelfall schon etwas komplexer werden, aber beschreibe doch einfach einmal etwas detaillierter, was genau du bei Druck auf einen bestimmten Knopf machen möchtest. Dann kann ich dir auch besser helfen.


----------



## prob12 (3. Mrz 2005)

Okay, dann drück ich mich mal etwas besser aus,  mit einem Beispiel. 

Der Button Spieler 1 soll die Aktion zugewiesen bekommen, dann in das Feld 1 der columnNames, also Name der Spalte: "Spieler 1", an die Position, in der Zeile in der  auch der Button "Spieler 1" ist ,einen neuen Wert zu setzen. In deinem Beispiel steht dort 11. Eine neue Zahl wird bei mir durch einen Zufallsgenerator erzeugt, also nehm ich für das Beispiel einfah mal die 20, diese 20 soll durch Buttonklick die 11 ersetzen. 

So und nun zu den ActionEvents, ich hab mich da etwas umständlich ausgerdückt, bei mir sind schon Actionevents vorhanden, ich geb mal nen kurzen Codeauszug daraus:


```
public void actionPerformed(ActionEvent e)
    {
       if( e.getActionCommand().equals("MenuBeenden")  )
       {
         dialogMenuBeenden();
         return;
       }
     if (e.getActionCommand().equals("Würfeln")) 
      { 
    	erzeugeZahl();
       }
     ....
```

so, wie soll ich da jetzt dieses neue ActionEvent von dir integrieren?




```
fireEditingStopped();
         // Schreibt Text auf Konsole
         System.out.println("Führe Aktion durch für " + e.getActionCommand());
```

soll ich daraus machen ?

```
public void actionPerformed(ActionEvent e)
    {
         fireEditingStopped();
         // Schreibt Text auf Konsole
         System.out.println("Führe Aktion durch für " + e.getActionCommand());
       if (e.getActionCommand().equals("Spieler1")) 
		 {
                  // void setValueAt( Object aValue, int rowIndex, int columnIndex )
         	  setValueAt(playerData, 1, 1 )
		 }
        
       if( e.getActionCommand().equals("MenueExit")  )
       {
         dialogMenueExit();
         return;
       }
     if (e.getActionCommand().equals("Würfeln")) 
      { 
    	erzeugeZahl();
       }
     ....
```
Wenn ich es so mache, bekomme ich 1. ne Fehlermeldung, dass er die Methode fireEditingStopped() nicht kennt und 2. das Problem, dass ich keinen Schreibzugriff auf das gewünschte Feld bekomme, da ich auch noch irgendetwas mit diesem void setValueAt falsch mache, denk ich mal :roll:


----------



## Guest (4. Mrz 2005)

Hi, danke für deine Beschreibung, die ist ja nun eindeutig und klar.

Ich habe einmal ein wenig mit dem Code herumgespielt und dabei festgestellt, dass das Aktualisieren der Datenspalten grundsätzlich problemlos funktioniert. Die Schwierigkeit entsteht dadurch, dass bei einer Aktualisierung des Objekts ja auch Button sowie Cell Renderer überschrieben werden und damit die Buttons verschwinden.

Ich habe schon einen Lösungsansatz, muss aber noch den Code erzeugen. Mach ich spätestens am Sonntag, zumal es mich selbst auch interessiert. Ich melde mich dann hier.


----------



## abollm (4. Mrz 2005)

Anonymous hat gesagt.:
			
		

> Hi, danke für deine Beschreibung, die ist ja nun eindeutig und klar.
> [..]



Zur Klarstellung, das war ich (leider ausgeloggt).


----------



## prob12 (4. Mrz 2005)

Ja okay, das ist nett.


----------



## abollm (6. Mrz 2005)

Hi,

ich habe das Gerüst jetzt so erweitert, dass auf Knopfdruck auf einen 
bestimmten JButton Berechnungen in der betreffenden Zeile durchgeführt 
werden.

Eine jeweils aktualisierte Summnenzeile ist ebenfalls integriert. 
Leider ist der Code jetzt etwas länger als gedacht geworden (>250 Z.). 
Das Ganze ist natürlich nicht perfekt, aber man kann das Gewünschte 
damit durchführen. So fehlen z.B. noch Sperrungen für die 
Zellenbearbeitung etc.

Ich poste hier u.a. aus Gründen der Länge den Code nicht. Sende mir 
einfach eine PN mit Angabe deiner E-Mail. Dann sende ich dir den Code 
zu.

Gruß


----------



## Guest (18. Mai 2006)

abollm hat gesagt.:
			
		

> Ja, so ist das mit Beispielen. Die sind meistens für einen bestimmten Anwendungszweck geschrieben.
> Ich schau mir dein Teil einmal heute oder spätestens morgen an. Wenn ich eine Lösung und/oder Frage dazu habe, poste ich hier.


----------



## André Uhres (24. Mai 2006)

prob12 hat gesagt.:
			
		

> ```
> -------------------------------------------
> | Wurf	       |Spieler 1    |	Spieler 2  |
> -------------------------------------------
> ...


Dies ist zwar keine JTable aber ich denke sonst ist alles dran:

```
//package schnipsel2; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import javax.swing.*; 
public class Wuerfelspiel2 extends JFrame { 
    public Wuerfelspiel2() { 
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
        setResizable(false); 
        setSize(400,400); 
        setLocationRelativeTo(null); 
        tablePanel = new JPanel(); 
        for (int i = 0; i < 8; i++) tablePanel.add(new RowPanel(i)); 
        add(tablePanel); 
        random = new Random(); 
        summeRechnen(); 
    } 
    private void txActionPerformed(ActionEvent e){ 
        summeRechnen(); 
    } 
    private void btActionPerformed(ActionEvent e){ 
        JButton bt = (JButton)e.getSource(); 
        int action = Integer.parseInt(bt.getActionCommand().substring(0,1)); 
        int x = random.nextInt(6) +1; 
        JPanel tableRow = (JPanel)tablePanel.getComponent(action); 
        JLabel lb = (JLabel)(tableRow.getComponent(1)); 
        lb.setText(""+x); 
        summeRechnen(); 
    } 
    private void summeRechnen(){ 
        int sum1 = 0, sum2 = 0, a = 0, b = 0; 
        JPanel tableRow = null; 
        JLabel lb = null, lb2 = null; 
        JTextField tx = null; 
        for (int i = 1; i < tablePanel.getComponentCount()-1; i++) { 
            tableRow = (JPanel)tablePanel.getComponent(i); 
            lb = (JLabel)(tableRow.getComponent(1)); 
            tx = (JTextField)(tableRow.getComponent(2)); 
            a = Integer.parseInt(lb.getText()); 
            b = 0; 
            try{b = Integer.parseInt(tx.getText());}catch(NumberFormatException e){ 
                JOptionPane.showMessageDialog(this, "Bitte Zahl eingeben."); 
            } 
            if(b < 0 || b > 6){
                JOptionPane.showMessageDialog(this, "Bitte nur Zahlen von 0 bis 6."); 
            }
            sum1 += a; sum2 += b; 
        } 
        tableRow = (JPanel)tablePanel.getComponent(7);  //Trailer 
        lb = (JLabel)(tableRow.getComponent(1)); 
        lb2 = (JLabel)(tableRow.getComponent(2)); 
        lb.setText(""+sum1); lb2.setText(""+sum2); 
    } 
    public static void main(String args[]) {new Wuerfelspiel2().setVisible(true);} 
    private JPanel tablePanel; 
    private Random random; 
    class RowPanel extends JPanel{ 
        public RowPanel(int row){ 
            ((FlowLayout)getLayout()).setAlignment(FlowLayout.LEFT); 
            setPreferredSize(new Dimension(300, 30)); 
            if(row == 0){   //Header 
                lbHeader1 = new JLabel("Wurf"); 
                lbHeader1.setPreferredSize(size); 
                lbHeader1.setHorizontalAlignment(JLabel.CENTER); 
                lbHeader2 = new JLabel("Spieler 1"); 
                lbHeader2.setPreferredSize(size); 
                lbHeader2.setHorizontalAlignment(JLabel.CENTER); 
                lbHeader3 = new JLabel("Spieler 2"); 
                lbHeader3.setPreferredSize(size); 
                lbHeader3.setHorizontalAlignment(JLabel.CENTER); 
                add(lbHeader1); 
                add(lbHeader2); 
                add(lbHeader3); 
            }else if(row == 7){     //Trailer 
                lbSumme = new JLabel("Summe"); 
                lbSumme.setHorizontalAlignment(JLabel.CENTER); 
                lbSumme.setPreferredSize(size); 
                lbSumme.setBorder(BorderFactory.createLineBorder(Color.black)); 
                lbSpieler1 = new JLabel("0"); 
                lbSpieler1.setBorder(BorderFactory.createLineBorder(Color.black)); 
                lbSpieler1.setHorizontalAlignment(JLabel.RIGHT); 
                lbSpieler1.setPreferredSize(size); 
                lbSpieler2 = new JLabel("0"); 
                lbSpieler2.setBorder(BorderFactory.createLineBorder(Color.black)); 
                lbSpieler2.setHorizontalAlignment(JLabel.RIGHT); 
                lbSpieler2.setPreferredSize(size); 
                add(lbSumme); 
                add(lbSpieler1); 
                add(lbSpieler2); 
            }else{  //Data 
                bt = new JButton(row+"er"); 
                bt.setPreferredSize(size); 
                lbSpieler1 = new JLabel("0"); 
                lbSpieler1.setBorder(BorderFactory.createLineBorder(Color.black)); 
                lbSpieler1.setHorizontalAlignment(JLabel.RIGHT); 
                lbSpieler1.setPreferredSize(size); 
                txSpieler2 = new JTextField("0"); 
                txSpieler2.setHorizontalAlignment(JTextField.RIGHT); 
                txSpieler2.setPreferredSize(size); 
                add(bt); 
                add(lbSpieler1); 
                add(txSpieler2); 
                bt.addActionListener(new ActionListener(){ 
                    public void actionPerformed(ActionEvent e) { 
                        btActionPerformed(e); 
                    } 
                }); 
                txSpieler2.addActionListener(new ActionListener(){ 
                    public void actionPerformed(ActionEvent e) { 
                        txActionPerformed(e); 
                    } 
                }); 
            } 
        } 
        private JButton bt; 
        private JLabel lbSpieler1, lbSpieler2, lbSumme, lbHeader1, lbHeader2, lbHeader3; 
        private JTextField txSpieler2; 
        private final Dimension size = new Dimension(90, 25); 
    } 
}
```


----------

