JTable mit Buttons?

Status
Nicht offen für weitere Antworten.
G

Gast

Gast
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:
Code:
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.
 
B

Beni

Gast
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

Top Contributor
Ich habe hier Beispielcode, zunächst für den Button Renderer:
Code:
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):

Code:
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

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

abollm

Top Contributor
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.
 

L-ectron-X

Gesperrter Benutzer
: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

Top Contributor
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).
 
G

Gast

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

prob12

Mitglied
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:

Code:
-------------------------------------------
| 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

Code:
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
Code:
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

Top Contributor
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.
 

abollm

Top Contributor
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.

Code:
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

Mitglied
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

Code:
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

Gäst

Gast
ich würds einfach so machen:

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

abollm

Top Contributor
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

[..]
--> 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.

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

Mitglied
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:

Code:
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?



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

soll ich daraus machen ?
Code:
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:
 
G

Guest

Gast
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

Top Contributor
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ß
 
G

Guest

Gast
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

Top Contributor
prob12 hat gesagt.:
Code:
-------------------------------------------
| 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     |
-------------------------------------------
Dies ist zwar keine JTable aber ich denke sonst ist alles dran:
Code:
//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); 
    } 
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
F JTable soll mit Buttons befüllt werden, aber nicht in jede Zelle einer Spalte AWT, Swing, JavaFX & SWT 3
I Swing JTable zeichnet kein vertical Grid AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2
T Swing JTable auslesen und befüllen AWT, Swing, JavaFX & SWT 8
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
J JTable und Suchlogik AWT, Swing, JavaFX & SWT 4
Viktim Swing JTable mit Tab verlassen AWT, Swing, JavaFX & SWT 1
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
Viktim Swing JTable Mit Tab druch Zeilen Wechseln AWT, Swing, JavaFX & SWT 5
Thallius Warum refrehsed mein JTable nicht? AWT, Swing, JavaFX & SWT 5
Ghostman1711 Hinzufügen ausgewählter Dateinen des Filechoosers zu einem JTable AWT, Swing, JavaFX & SWT 9
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
K JTable getValueAt() klappt nicht immer AWT, Swing, JavaFX & SWT 1
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
P JTable - bei Eingabe Selektion AWT, Swing, JavaFX & SWT 0
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
S Swing Deselektion in JTable verhindern AWT, Swing, JavaFX & SWT 0
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
N Swing Print JTable mit AbstractTableModel AWT, Swing, JavaFX & SWT 1
Ananaskirsche Swing jTable Reihen zuviel eingefügt AWT, Swing, JavaFX & SWT 12
P im JTable die Schriftfarbe ändern AWT, Swing, JavaFX & SWT 19
T Swing JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Dreiecke in bestimmte Zellen einer JTable AWT, Swing, JavaFX & SWT 9
LexeB4F Zelle in JTable gezielt einfärben AWT, Swing, JavaFX & SWT 4
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
D Swing JTable Renderer Grafikfehler AWT, Swing, JavaFX & SWT 0
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
M Swing JTable GroupableHeader Background Color AWT, Swing, JavaFX & SWT 4
K Swing JTable updaten AWT, Swing, JavaFX & SWT 9
thet1983 Swing MySQL >> JTable AWT, Swing, JavaFX & SWT 5
J JTable bounds ändern durch resizing des Fensters AWT, Swing, JavaFX & SWT 9
F JTable Zellen-Hintergrund ändern AWT, Swing, JavaFX & SWT 7
O JTable linksbündig drucken (nicht der Zelleninhalt) AWT, Swing, JavaFX & SWT 2
Crazynet xls Datei in JTable AWT, Swing, JavaFX & SWT 3
O JTable ohne Rahmen printen AWT, Swing, JavaFX & SWT 3
L Swing JTable refresht die Column Namen nicht AWT, Swing, JavaFX & SWT 0
K JTable komplett durch andere ersetzen AWT, Swing, JavaFX & SWT 4
S JTable übernimmt Änderungen nicht AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben