JPanel in JTable einfügen

pausch

Aktives Mitglied
Hallo,

Ich bin dabei ein MediaManagement Programm zu bauen und bin jetzt bei einer Übersichtsliste angegekommen. Da die gelisteten Inhalte auch bewertet werden können sollen, macht es Sinn in diese Tabelle ein JPanel hinzuzufügen in dem ich dann 5 Sternchen hinzufügen kann, die ich mit einem MouseListener belege, die dann halt die Bewertung des Inhaltes setzen.
Problem: Wie bekomme ich jetzt ein JPanel in ein JTable?!

Danke für eure Mühe...

pausch
 

Michael...

Top Contributor
Wie bekomme ich jetzt ein JPanel in ein JTable?!
Ein JPanel in eine JTable bzw. deren Model zu stecken macht eigentlich keinen Sinn und untergräbt das bei der JTable verwendete Rendering Konzept:
Die Zellen einer JTable werden mit einigen wenigen Rendererkomponenten (default nur ein einziges JLabel) dargestellt.
bERt0r hat ja bereits einen Link zu dem Thema gepostet. Hier in den FAQs gibt's es auch ein umfangreiches Tutorial zur JTable - finde allerdings grad den Link nicht. Vielleicht hat ja jemand anderes diesen zur Hand.

#EDIT:
gefunden:http://www.java-forum.org/bilder-gui-damit-zusammenhaengt/4841-jtable-ubersicht-teil-1-teil-8-a.html#post23457
 
Zuletzt bearbeitet:

pausch

Aktives Mitglied

Danke für den Link, aber ganz untätig war ich ja auch nicht und habe das Tutorial auch schon gefunden... Aber explizit für mein Problem habe ich da nichts passendes gefunden bisher. Vielleich war ich auch zu voreilig und habe es übersehen...
Ich sitze jetzt gerade an einem [japi]TableCellRenderer[/japi]. Die Methode
Java:
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
muss hier ja überschrieben werden. Als [japi]Component[/japi] der da zurückgegeben wird benutze ich halt ein JPanel mit meinen Bewertungs-Sternchen drin.

Oder hast du eine Bessere Idee?

Danke nochmal für eure Mühe...
 

hdi

Top Contributor
Ist schon richtig, wie du das machst. Beachte allerdings, was Michael gesagt hat: Die JTable ist eigentlich nicht dafür entworfen, komplexere Komponenten als Zellen zu haben. Es kann da schnell zu Performance-Problemen kommen, da die Zellen u.U. sehr oft gezeichnet werden. Ich weiß das weil ich genau das selbe auch mal gemacht hab (selbe Software, nur waren's bei mir keine Sterchnen sondern eine bunte Bar).

Es gibt dafür allerdings eine Lösung, und zwar musst du gewisse Methoden für das Repaint überschreiben, und dabei leer implementieren - sie sind nicht immer nötig und boosten die Performance in so einem Fall.

D.h. am besten du machst deinen TableRenderer gleich mal extends JPanel. D.h. du returnest in der Methode "this". Ansonsten müsstest du in der Methode halt eine anonyme Klasse verwenden. Auf jeden Fall musst du die Methoden überschreiben.. Wenn ich jetzt wüsste welche genau das waren.. Ich such mal ein bisschen in meinen alten Threads, vllt finde ich es.

Aber wie gesagt, vom Prinzip schon korrekt was du tust.
 

hdi

Top Contributor
Here you go:

Java:
// The following methods override the defaults for performance reasons
    public void validate() {}
    public void revalidate() {}
    protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {}
    public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}

Und hier findest du noch meine App. Ist leider kein Source Code drin, und ich hab den auch nicht mehr. Ist auch nich unbedingt professionell gemacht.. Aber wenn du etwas ähnliches implementieren willst und nicht weißt wie, schick mir einfach ne PN, vllt kann ich helfen

PS: Beim Start legt das Programm eine Datei oder einen Ordner in deinem Home-Verzeichnis an. Glaubi ch zumindest :D Oder in dem Verzeichnis, in dem die jar liegt. Dort werden die Filme gespeichert. Also lösch das am besten auch wieder wenn du die Software in den Mülleimer schiebst.
 
Zuletzt bearbeitet:

pausch

Aktives Mitglied
...wie füge ich denn jetzt meinen TableCellRenderer meiner Tabelle hinzu???

Java:
try {
			DVD[] dvds = DAOFactory.getDVDDao().readAllDVD();
			String[][] rowData = new String[dvds.length][4];
			for(int i=0; i<rowData.length; i++){
				rowData[i][0] = dvds[i].getTitle();
				rowData[i][1] = new Integer(dvds[i].getDauer()).toString();
				rowData[i][2] = new Integer(dvds[i].getJahr()).toString();
			}
			String[] columns = {"Titel", "Bewertung", "Dauer", "Jahr"};
			uebersichtTable = new JTable(rowData, columns);
			TableColumn bewertungsColumn = uebersichtTable.getColumn(1);
			for(int i=0; i<rowData.length; i++){
				bewertungsColumn.setCellRenderer(new BewertungTableCellRenderer());
			}
			add(new JScrollPane(uebersichtTable), gbc);
		} catch (SQLException e) {
			logger.error(e);
			RootController.setException(e);
		}

Der bewirft mich mit einer [japi]IllegalArgumentException [/japi]in der Zeile wo ich mir die TableColumn hole... Da die Methode ein [japi]Object[/japi] erwartet, habe ich das auch schon mit "Bewertung" versuche, aber dann kommt (berechtigter weise) eine ClassCastException: java.lang.String cannot be cast to java.lang.Integer.

Ich glaube ich bin zu doof für JTables^^

Aber danke für eure Unterstützung
 

hdi

Top Contributor
Also erstmal macht man das nicht in einer Schleife. Du setzt den Renderer nur ein mal. Du machst ja bei jedem Schleifendurchlauf das selbe ;)

Der bewirft mich mit einer IllegalArgumentException in der Zeile wo ich mir die TableColumn hole...
Hm kann ich grad nicht glauben.. Die Table hat 4 Spalten, getColumn(1) dürfte keine IAE werfen.. Sicher, dass das die richtige Zeile ist? Poste mal den Stack-Trace
 

andiv

Bekanntes Mitglied
Ich verwende normalerweise nicht setCellRenderer sondern direkt auf der JTable setDefaultRenderer und übergebe die Klasse, die die Objekte in der gewünschten Spalte haben.
 

pausch

Aktives Mitglied
*Hust* die schleife war unüberlegt^^
Danke für den Hinweis... Jetzt der StackTrace:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Identifier not found
	at javax.swing.table.DefaultTableColumnModel.getColumnIndex(DefaultTableColumnModel.java:282)
	at javax.swing.JTable.getColumn(JTable.java:2553)
	at de.schaefer.mediaManagement.ui.general.UebersichtView.<init>(UebersichtView.java:52)
	at de.schaefer.mediaManagement.control.viewcontroller.UebersichtController.<init>(UebersichtController.java:14)
	at de.schaefer.mediaManagement.control.viewcontroller.HomeController.uebersicht(HomeController.java:31)
	at de.schaefer.mediaManagement.ui.general.HomeView$1.actionPerformed(HomeView.java:79)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2012)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2335)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:404)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:253)
	at java.awt.Component.processMouseEvent(Component.java:6268)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
	at java.awt.Component.processEvent(Component.java:6033)
	at java.awt.Container.processEvent(Container.java:2045)
	at java.awt.Component.dispatchEventImpl(Component.java:4629)
	at java.awt.Container.dispatchEventImpl(Container.java:2103)
	at java.awt.Component.dispatchEvent(Component.java:4455)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4633)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4297)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4227)
	at java.awt.Container.dispatchEventImpl(Container.java:2089)
	at java.awt.Window.dispatchEventImpl(Window.java:2517)
	at java.awt.Component.dispatchEvent(Component.java:4455)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:649)
	at java.awt.EventQueue.access$000(EventQueue.java:96)
	at java.awt.EventQueue$1.run(EventQueue.java:608)
	at java.awt.EventQueue$1.run(EventQueue.java:606)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:116)
	at java.awt.EventQueue$2.run(EventQueue.java:622)
	at java.awt.EventQueue$2.run(EventQueue.java:620)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:619)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)
 

pausch

Aktives Mitglied
Ich verwende normalerweise nicht setCellRenderer sondern direkt auf der JTable setDefaultRenderer und übergebe die Klasse, die die Objekte in der gewünschten Spalte haben.

Aber dann würde ja der CellRenderer für alle Zellen angewandt werden. Ich möchte den aber doch nur auf eine Spalte anwenden, um in den anderen Spalten meine anderen Werte anzeigen zu lassen, wie den Titel der DVD oder die Länge, das Jahr etc.

Warum einfach wenn es auch kompliziert geht :(^^
 

hdi

Top Contributor
Ach ok, die Methode erwartet gar keinen Index, sondern einen Identifiert:
JTable (Java Platform SE 7 ))

Wahrscheinlich ist der Identifiert der Spalten-Name.

Ansonten mach es über
Code:
getColumnModel().getColumn(1);
 

pausch

Aktives Mitglied
Auch das habe ich versucht, aber wie vorhin geschrieben fliegt dann eine:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
	at de.schaefer.mediaManagement.ui.general.BewertungTableCellRenderer.getTableCellRendererComponent(BewertungTableCellRenderer.java:69)
	at javax.swing.JTable.prepareRenderer(JTable.java:5736)
	at javax.swing.plaf.synth.SynthTableUI.paintCell(SynthTableUI.java:636)
	at javax.swing.plaf.synth.SynthTableUI.paintCells(SynthTableUI.java:533)
	at javax.swing.plaf.synth.SynthTableUI.paint(SynthTableUI.java:322)
	at javax.swing.plaf.synth.SynthTableUI.update(SynthTableUI.java:251)
	at javax.swing.JComponent.paintComponent(JComponent.java:765)
	at javax.swing.JComponent.paint(JComponent.java:1029)
	at javax.swing.JComponent.paintChildren(JComponent.java:866)
	at javax.swing.JComponent.paint(JComponent.java:1038)
	at javax.swing.JViewport.paint(JViewport.java:764)
	at javax.swing.JComponent.paintChildren(JComponent.java:866)
	at javax.swing.JComponent.paint(JComponent.java:1038)
	at javax.swing.JComponent.paintChildren(JComponent.java:866)
	at javax.swing.JComponent.paint(JComponent.java:1038)
	at javax.swing.JComponent.paintToOffscreen(JComponent.java:5138)
	at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:302)
	at javax.swing.RepaintManager.paint(RepaintManager.java:1188)
	at javax.swing.JComponent._paintImmediately(JComponent.java:5086)
	at javax.swing.JComponent.paintImmediately(JComponent.java:4896)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:783)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:735)
	at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:677)
	at javax.swing.RepaintManager.access$700(RepaintManager.java:58)
	at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1593)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:226)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:647)
	at java.awt.EventQueue.access$000(EventQueue.java:96)
	at java.awt.EventQueue$1.run(EventQueue.java:608)
	at java.awt.EventQueue$1.run(EventQueue.java:606)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:617)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
	at de.schaefer.mediaManagement.ui.general.BewertungTableCellRenderer.getTableCellRendererComponent(BewertungTableCellRenderer.java:69)
	at javax.swing.JTable.prepareRenderer(JTable.java:5736)
	at javax.swing.plaf.synth.SynthTableUI.paintCell(SynthTableUI.java:636)
	at javax.swing.plaf.synth.SynthTableUI.paintCells(SynthTableUI.java:533)
	at javax.swing.plaf.synth.SynthTableUI.paint(SynthTableUI.java:322)
	at javax.swing.plaf.synth.SynthTableUI.update(SynthTableUI.java:251)
	at javax.swing.JComponent.paintComponent(JComponent.java:765)
	at javax.swing.JComponent.paint(JComponent.java:1029)
	at javax.swing.JComponent.paintChildren(JComponent.java:866)
	at javax.swing.JComponent.paint(JComponent.java:1038)
	at javax.swing.JViewport.paint(JViewport.java:764)
	at javax.swing.JComponent.paintChildren(JComponent.java:866)
	at javax.swing.JComponent.paint(JComponent.java:1038)
	at javax.swing.JComponent.paintChildren(JComponent.java:866)
	at javax.swing.JComponent.paint(JComponent.java:1038)
	at javax.swing.JComponent.paintChildren(JComponent.java:866)
	at javax.swing.JComponent.paint(JComponent.java:1038)
	at javax.swing.JComponent.paintChildren(JComponent.java:866)
	at javax.swing.JComponent.paint(JComponent.java:1038)
	at javax.swing.JLayeredPane.paint(JLayeredPane.java:581)
	at javax.swing.JComponent.paintChildren(JComponent.java:866)
	at javax.swing.JComponent.paintToOffscreen(JComponent.java:5145)
	at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:302)
	at javax.swing.RepaintManager.paint(RepaintManager.java:1188)
	at javax.swing.JComponent.paint(JComponent.java:1015)
	at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39)
	at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:78)
	at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:115)
	at java.awt.Container.paint(Container.java:1784)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:794)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:735)
	at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:677)
	at javax.swing.RepaintManager.access$700(RepaintManager.java:58)
	at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1593)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:226)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:647)
	at java.awt.EventQueue.access$000(EventQueue.java:96)
	at java.awt.EventQueue$1.run(EventQueue.java:608)
	at java.awt.EventQueue$1.run(EventQueue.java:606)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:617)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)

EDIT:
Mit dem Umweg über das Model läufts, jetzt hat nur noch mein CellRenderer Feher, aber die sind morgen dran :)
Danke für deine Hilfe, ich schreib dir mal PNs bei Problemen :)

jetzt siehts folgendermaßen aus:
Java:
try {
			DVD[] dvds = DAOFactory.getDVDDao().readAllDVD();
			String[][] rowData = new String[dvds.length][4];
			for (int i = 0; i < rowData.length; i++) {
				rowData[i][0] = dvds[i].getTitle();
				rowData[i][1] = new Integer(dvds[i].getDauer()).toString();
				rowData[i][2] = new Integer(dvds[i].getJahr()).toString();
			}
			String[] columns = { "Titel", "Bewertung", "Dauer", "Jahr" };
			uebersichtTable = new JTable(rowData, columns);
			TableColumn bewertungsColumn = uebersichtTable
					.getColumnModel().getColumn(1);
			bewertungsColumn.setCellRenderer(new BewertungTableCellRenderer());
			add(new JScrollPane(uebersichtTable), gbc);
		} catch (SQLException e) {
			logger.error("DVDs konnten nicht abgefragt werden", e);
			RootController.setException(e);
		}

damit auch andere aus meinen Fehlern lernen können.

Grüße
pausch
 
Zuletzt bearbeitet:

hdi

Top Contributor
Das liegt jetzt aber an deinem Renderer: BewertungTableCellRenderer.java:69

Anscheinend castest du da irgendwas falsch.. Zeig mal die Methode getTableCellRendererComponent
 

pausch

Aktives Mitglied
CellRenderer ist jetzt geschrieben aber tut nicht das was er soll :(

...hier der Code:
Java:
 package de.schaefer.mediaManagement.ui.general;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class BewertungTableCellRenderer extends JPanel implements
		TableCellRenderer {

	/**
	 * 
	 */
	private static final long serialVersionUID = -7417093007447000853L;

	@Override
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		int val = 0;
		if (value instanceof String) {
			val = Integer.parseInt(value.toString());
		} else if (value instanceof Integer) {
			val = (Integer) value;
		}
		if (val <= 5 && val > 0) {
			JButton[] grau = new JButton[5-val];
			JButton[] farbig = new JButton[val];
			for(int i=0; i<farbig.length; i++){
				farbig[i] = new JButton(new ImageIcon("sternFarbig.png"));
				farbig[i].setPreferredSize(new Dimension(20, 30));
				this.add(farbig[i]);
			}
			for(int i=0; i<grau.length; i++){
				grau[i] = new JButton(new ImageIcon("sternGrau.png"));
				grau[i].setPreferredSize(new Dimension(20, 30));
				this.add(grau[i]);
			}
			return this;
		}
		return new JPanel();
	}
}

Und das was dabei rauskommt seht ihr im Anhang. Es werden alle JPanels in jeder (!!) zeile angezeigt :(

Achja: folgendermaßen füge ich den TableCellRenderer der Tabelle hinzu:

Java:
 public UebersichtView(UebersichtController uc) {
		super();
		this.uc = uc;
		setLayout(new GridBagLayout());

		GridBagConstraints gbc = new GridBagConstraints();
		gbc.gridx = 0;
		gbc.gridy = 0;
		gbc.anchor = GridBagConstraints.CENTER;
		gbc.insets = new Insets(10, 0, 10, 0);
		try {
			DVD[] dvds = DAOFactory.getDVDDao().readAllDVD();
			Object[][] rowData = new Object[dvds.length][4];
			for (int i = 0; i < rowData.length; i++) {
				rowData[i][0] = dvds[i].getTitle();
				rowData[i][1] = new Integer(dvds[i].getBewertung());
				rowData[i][2] = new Integer(dvds[i].getDauer());
				rowData[i][3] = new Integer(dvds[i].getJahr());
			}
			String[] columns = { "Titel", "Bewertung", "Dauer", "Jahr" };
			uebersichtTable = new JTable(rowData, columns);
			uebersichtTable.setRowHeight(40);
			TableColumn bewertungsColumn = uebersichtTable.getColumn("Bewertung");
			bewertungsColumn.setCellRenderer(new BewertungTableCellRenderer());
			add(new JScrollPane(uebersichtTable), gbc);
		} catch (SQLException e) {
			logger.error("DVDs konnten nicht abgefragt werden", e);
			RootController.setException(e);
		}

		repaint();
	}


EDIT:
Zum allgemeinen Verständnis: Die erste DVD hat 3 Sterne und alle folgenden nur einen, deshalb meine Vermutung, dass alle JPanels hintereinander gehängt werden.
 

Anhänge

  • ListCellRenderer.png
    ListCellRenderer.png
    39,8 KB · Aufrufe: 40
Zuletzt bearbeitet:

pausch

Aktives Mitglied
Nächste Frage, die ich mir jetzt wirklich nicht selbst beantworten kann:

Wie bekomme ich die folgenden ActionListener auf den Buttons ausgeführt? Wenn ich in die Tabelle klicke, passiert gar nichts :(

Java:
package de.schaefer.mediaManagement.ui.general;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class BewertungTableCellRenderer extends JPanel implements
		TableCellRenderer {

	/**
	 * 
	 */
	private static final long serialVersionUID = -7417093007447000853L;

	@Override
	public Component getTableCellRendererComponent(final JTable table, Object value,
			final boolean isSelected, final boolean hasFocus, final int row, final int column) {
		this.removeAll();
		final int val;
		if (value instanceof String) {
			val = Integer.parseInt(value.toString());
		} else if (value instanceof Integer) {
			val = (Integer) value;
		} else {
			val = -1;
		}
		if (val <= 5 && val > 0) {
			JButton[] grau = new JButton[5-val];
			JButton[] farbig = new JButton[val];
			for(int i=0; i<farbig.length; i++){
				farbig[i] = new JButton(new ImageIcon("sternFarbig.png"));
				farbig[i].setPreferredSize(new Dimension(20, 30));
				farbig[i].addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent ae){
						getTableCellRendererComponent(table, val-1, isSelected, hasFocus, row, column);
					}
				});
				this.add(farbig[i]);
			}
			for(int i=0; i<grau.length; i++){
				grau[i] = new JButton(new ImageIcon("sternGrau.png"));
				grau[i].setPreferredSize(new Dimension(20, 30));
				grau[i].addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent ae){
						getTableCellRendererComponent(table, val+1, isSelected, hasFocus, row, column);
					}
				});
				this.add(grau[i]);
			}
			return this;
		}
		return new JPanel();
	}
}

Anbindung an die JTable wie oben schon gepostet...

Nebenbei wäre es für den CellEditor noch relativ Sinnvoll zu wissen, um welche DVD er sich grade kümmert um die Bewertungs-Änderungen auch in die Datenbank übermitteln zu können. Sonst kann man ja froh editieren und nichts geschieht im backend...
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Tipp: Ein Renderer rendert nur ;-)
Zum Editieren verwendet JTable TableCellEditor der prinzipiell ähnlich funktioniert wie ein Renderer nur ein paar Methoden hat.

Um sich nicht mit dem Editor rumschlagen zu müssen, könnte man auch einfach mit einem MouseListener an der JTable arbeiten - man hätte halt nicht diesen Button gerückt und rollover Effekt.
 

pausch

Aktives Mitglied
Hättest du ein Beispiel für "nur mit dem Mouselistener am Table arbeiten"? Ich kann mir da grade nciht viel drunter vorstellen...
 

Michael...

Top Contributor
beispiel gerade nicht zur Hand, sollten sich aber sicher hier oder im Netz ein paar finden lassen.
Einfach MouseListener an der JTable registrieren, in der mouseClicked(...) anhand des Points des MouseEvents Zeilen- und Spaltenindex bestimmen (JTable bietet dazu jeweils eine Methode an row/columnAtPoint oder so ähnlich) und schon ist man genauso weit wie im CellEditor.
 

pausch

Aktives Mitglied
Das letzte problem(chen?) was mich noch plagt ist, dass der BewertungCellEditor jetzt noch wissen muss welche DVD er editert.

Wie lässt sich das jetzt lösen? Ich füge ja einer ganzen Spalte diesen Editor an...

Java:
try {
			DVD[] dvds = DAOFactory.getDVDDao().readAllDVD();
			Object[][] rowData = new Object[dvds.length][4];
			for (int i = 0; i < rowData.length; i++) {
				rowData[i][0] = dvds[i].getTitle();
				rowData[i][1] = new Integer(dvds[i].getBewertung());
				rowData[i][2] = new Integer(dvds[i].getDauer());
				rowData[i][3] = new Integer(dvds[i].getJahr());
			}
			String[] columns = { "Titel", "Bewertung", "Dauer", "Jahr" };
			uebersichtTable = new JTable(rowData, columns);
			uebersichtTable.setRowHeight(40);
			TableColumn bewertungsColumn = uebersichtTable.getColumn("Bewertung");
			bewertungsColumn.setCellEditor(new BewertungCellEditor());
			bewertungsColumn.setCellRenderer(new BewertungTableCellRenderer());
			add(new JScrollPane(uebersichtTable), gbc);
		} catch (SQLException e) {
			logger.error("DVDs konnten nicht abgefragt werden", e);
			RootController.setException(e);
		}

		repaint();

Java:
package de.schaefer.mediaManagement.ui.general;

import java.awt.Component;
import java.awt.Dimension;

import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class BewertungTableCellRenderer extends JPanel implements
		TableCellRenderer {

	/**
	 * 
	 */
	private static final long serialVersionUID = -7417093007447000853L;
	SternButton[] sterne = new SternButton[5];

	@Override
	public Component getTableCellRendererComponent(final JTable table,
			Object value, final boolean isSelected, final boolean hasFocus,
			final int row, final int column) {
		final int val;
		if (value instanceof String) {
			val = Integer.parseInt(value.toString());
		} else if (value instanceof Integer) {
			val = (Integer) value;
		} else {
			val = -1;
		}
		if (val <= 5 && val > 0) {
			removeAll();
			int i = 0;
			for (; i < 5; i++) {
				if (i < val)
					sterne[i] = new SternButton(i + 1, true);
				else
					sterne[i] = new SternButton(i + 1, false);
				sterne[i].setPreferredSize(new Dimension(20, 30));
				this.add(sterne[i]);
			}

		}
		return this;
	}
}

Java:
package de.schaefer.mediaManagement.ui.general;

import javax.swing.ImageIcon;
import javax.swing.JButton;

public class SternButton extends JButton {

	/**
	 * 
	 */
	private static final long serialVersionUID = -2526897634970878854L;
	int nr;
	boolean farbig;
	
	public SternButton(int zahl, boolean farbig){
		if(farbig){
			setIcon(new ImageIcon("sternFarbig.png"));
		} else {
			setIcon(new ImageIcon("sternGrau.png"));
		}
		nr = zahl;
	}
	
	public int getNr(){
		return nr;
	}
}
 

Michael...

Top Contributor
Das letzte problem(chen?) was mich noch plagt ist, dass der BewertungCellEditor jetzt noch wissen muss welche DVD er editert.
Das gleiche Problem wird hier in dem Post diskutiert:
http://www.java-forum.org/awt-swing-swt/123976-komplette-objekte-jtable-einfuegen.html#post802628
Man könnte ein eigenes TableModel schreiben in dem man nur eine Liste mit den DVDs hält und entsprechend die set/getValueAt(...) entsprechend überschreibt. In einer oder der benötigten Spalte gibt man das komplette DVD Objekt zurück - war wohl ein eher pragmatischer Ansatz und man müsste den CellRenderer der Spalte entsprechend anpassen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B JPanel -JTable Java Basics - Anfänger-Themen 2
Kenan89 JPanel mit JTable Java Basics - Anfänger-Themen 9
X JTable in JPanel in JTabbedPane mouseevent von jtable kommt nicht durch Java Basics - Anfänger-Themen 3
richis-fragen Optisch JPanel BorderLayout vertikaler Rand dicker als horizontaler Rand Java Basics - Anfänger-Themen 4
N Klassen Hintergrundfarbe in JPanel ändert sich nicht Java Basics - Anfänger-Themen 3
J JSON mit einem JPanel Java Basics - Anfänger-Themen 3
J Ein mit UI-Designer erstelltes JPanel einblenden Java Basics - Anfänger-Themen 0
J Eine theoretische Frage zur Praxis - JPanel oder Canvas Java Basics - Anfänger-Themen 5
J Beim Start des Programms zB. eine Linie in JPanel ausgeben Java Basics - Anfänger-Themen 4
C mehrere JPanel in ein JFrame bringen Java Basics - Anfänger-Themen 9
M HILFE JPanel - Graphics Java Basics - Anfänger-Themen 1
B Scrollbares Fenster (JScrollPane) mit JPanel scrollt nicht Java Basics - Anfänger-Themen 3
Zeppi JPanel responsive Grid Java Basics - Anfänger-Themen 0
J JPanel in JScrollPanel Java Basics - Anfänger-Themen 4
Elyt JPanel als HintergrundBild Java Basics - Anfänger-Themen 7
W 2 JPanel in einem JFrame Java Basics - Anfänger-Themen 4
B Wie kann man an ein JPanel eine Scrollbar anheften? Java Basics - Anfänger-Themen 8
O Swing JPanel Java Basics - Anfänger-Themen 4
CptK Klassen JPanel nach Ablauf der Spielzeit neuladen Java Basics - Anfänger-Themen 2
S JPanel wird nicht angezeigt Java Basics - Anfänger-Themen 1
D Animation JPanel Java Basics - Anfänger-Themen 1
M JLabels "verrutschen" beim übergeben von JPanel Java Basics - Anfänger-Themen 2
D Auf angeklicktes JPanel zugreifen Java Basics - Anfänger-Themen 5
D JPanel mehrere Formen zeichnen Java Basics - Anfänger-Themen 5
D JPanel passt die Größe nicht an Java Basics - Anfänger-Themen 22
Y Webinhalt JPanel Java Basics - Anfänger-Themen 6
D Erste Schritte JPanel verschiebt Fenster via setVisible Java Basics - Anfänger-Themen 5
Dechasa Interface JFrame mit mehreren Übereinander liegenden JPanel Java Basics - Anfänger-Themen 5
S JPanel variablenabhängig erstellen Java Basics - Anfänger-Themen 13
J Methoden Dinge auf einem JPanel paltzieren Java Basics - Anfänger-Themen 1
Z JPanel wird zweimal hinterinander gezeichnet.. Wieso? Java Basics - Anfänger-Themen 4
F JFrame resize verschiebt JPanel Java Basics - Anfänger-Themen 3
A altes JPanel entfernen und neues öffnen Java Basics - Anfänger-Themen 5
I A0-Format in jpanel anzeigen Java Basics - Anfänger-Themen 1
R NullPointerException wegen JPanel oder doch nicht ? Java Basics - Anfänger-Themen 7
J Probleme mit eigenem JPanel (IDE Eclipse) Java Basics - Anfänger-Themen 4
S JPanel wird versetzt auf JFrame gelegt Java Basics - Anfänger-Themen 2
V jab ich eclipse verrückt gemacht :D ? array Jpanel, Jlabel Grafik Fehler / Frage Java Basics - Anfänger-Themen 5
R Focus auf JPanel im Thread Java Basics - Anfänger-Themen 9
I Problem mit JPanel Java Basics - Anfänger-Themen 0
B JPanel ändert die Hintergrundfarbe nicht Java Basics - Anfänger-Themen 2
F Threads funktionieren auf JPanel nicht Java Basics - Anfänger-Themen 1
C JPanel in MessageDialog Java Basics - Anfänger-Themen 1
B JPanel/JFrame in ein Applet umwandeln (Webfähig) Java Basics - Anfänger-Themen 7
S Inhalt von JPanel erst nach Resize sichtbar Java Basics - Anfänger-Themen 2
M Listener einerm JPanel hinzufuegen Java Basics - Anfänger-Themen 3
gamebreiti Methoden JPanel nach clearAll() und add neu zeichnen Java Basics - Anfänger-Themen 1
S vom JPanel aus durch Mouselistener Internet aufrufen Java Basics - Anfänger-Themen 6
Z JPanel bleibt leer Java Basics - Anfänger-Themen 2
E Bild per Verzeichnis/JFileChooser auf JPanel laden Java Basics - Anfänger-Themen 13
Q JPanel Java Basics - Anfänger-Themen 2
K Erste Schritte jpanel in einer klasse auslagern Java Basics - Anfänger-Themen 3
I Anfängerfrage JPanel repaint() Java Basics - Anfänger-Themen 6
N String auf JPanel bewegen Java Basics - Anfänger-Themen 6
K Erste Schritte Jframe Im Jpanel Java Basics - Anfänger-Themen 4
S Layout mit JPanel in JScrollPanel funktioniert nicht Java Basics - Anfänger-Themen 3
S JPanel drucken -> PrinterException Java Basics - Anfänger-Themen 2
H JPanel Hintergrund transparent setzen? Java Basics - Anfänger-Themen 10
A Input/Output Hashmap in einem JPanel via JList anzeigen Java Basics - Anfänger-Themen 8
L zoomen aus jpanel Java Basics - Anfänger-Themen 7
P Bekomme in meinen JPanel nur eine JComponente angezeigt Java Basics - Anfänger-Themen 7
A Methoden repaint() zeichnet JPanel falsch Java Basics - Anfänger-Themen 3
R JFrame über einen JPanel Java Basics - Anfänger-Themen 5
I Veränderungen am JPanel vom JDialog aus Java Basics - Anfänger-Themen 6
F JPanel zu klein Java Basics - Anfänger-Themen 5
D GUI - Objekte in JPanel nach oben schieben Java Basics - Anfänger-Themen 2
S JPanel wird nicht eingefügt Java Basics - Anfänger-Themen 3
P Netbeans Platform - JLabel und JPanel setLocation Problem Java Basics - Anfänger-Themen 2
I JPanel in JPanel Java Basics - Anfänger-Themen 2
A Zugriff auf Komponente innerhalb einer JPanel Java Basics - Anfänger-Themen 8
J Auf einem JPanel ein JFrame platzieren Java Basics - Anfänger-Themen 10
S JPanel anzeige Java Basics - Anfänger-Themen 2
propra Wie mache ich einem JPanel mein bereits instanziertes Model bekannt Java Basics - Anfänger-Themen 9
T Zugreifen auf JPanel Java Basics - Anfänger-Themen 4
K JPanel auslagern Java Basics - Anfänger-Themen 9
J Paint Methode von JPanel aufrufen Java Basics - Anfänger-Themen 15
T Tastendruck simulieren in JPanel Java Basics - Anfänger-Themen 3
E Erste Schritte Objekte werden in JPanel angedockt und maximiert Java Basics - Anfänger-Themen 7
M Componenten auf JPanel anzeigen Java Basics - Anfänger-Themen 2
F JPanel als JPG - weisse Fläche Java Basics - Anfänger-Themen 9
L Image laden und auf jPanel ausgeben Java Basics - Anfänger-Themen 7
M JLabel auf JPanel positionieren Java Basics - Anfänger-Themen 8
M Verständnisfrage zu JPanel Java Basics - Anfänger-Themen 3
M MouseListener funkioniert auf JPanel nicht Java Basics - Anfänger-Themen 8
D JPanel + ein JLabel Java Basics - Anfänger-Themen 8
B JPanel-Oberfläche speichern Java Basics - Anfänger-Themen 9
P GUI, JPanel Java Basics - Anfänger-Themen 7
H JPanel in andere Klasse übergeben Java Basics - Anfänger-Themen 7
D Grösse eines JPanel hinsichtlich LayoutManager festlegen Java Basics - Anfänger-Themen 4
B JPanel über anderem JPanel Java Basics - Anfänger-Themen 6
F zeichnen in JPanel Java Basics - Anfänger-Themen 7
F Unterschied JPanel und JFrame Java Basics - Anfänger-Themen 5
U JPanel dynamisch gestalten Java Basics - Anfänger-Themen 7
H Zeichnen in JPanel Java Basics - Anfänger-Themen 8
K Auf JPanel Zeichnen Java Basics - Anfänger-Themen 8
C jPanel im jPanel verändern Java Basics - Anfänger-Themen 15
B JPanel nachträglich verändern Java Basics - Anfänger-Themen 20
C JPanel erhält sporadisch keinen Fokus Java Basics - Anfänger-Themen 3
I repaint bei jpanel Java Basics - Anfänger-Themen 10
L JPanel vergrößern bis JScrollPane nicht mehr zu sehen Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben