Mal wieder JTable

pausch

Aktives Mitglied
Hallo Java-Gemeinde,
Ich habe (mal wieder) ein (kleines) Problem(chen) mit der JTable. Ich habe einen eigenen CellRenderer und einen eigenen CellEditor geschrieben. Um in einer DVD-Liste die Bewertung der DVDs anzugeben, füge ich 5 Buttons auf ein Panel hinzu, was ich dann in der Tabelle anzeigen lasse.
Mein Problem ist jetzt, dass sich die Tabelle vollständig aufhängt, wenn ich in der Spalte mit dem JPanel nicht auf die Buttons (die in Form von sternchen angezeigt werden) sondern daneben in das leere JPanel klicke.
Hier meine Sources:

Java:
package de.schaefer.mediaManagement.ui.dvd.tabelle;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.EventObject;

import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.table.TableCellEditor;

import org.apache.log4j.Logger;

import de.schaefer.mediaManagement.control.viewcontroller.UebersichtController;
import de.schaefer.mediaManagement.entity.DVD;
import de.schaefer.mediaManagement.ui.general.SternButton;

public class BewertungCellEditor extends JPanel implements TableCellEditor {

	/**
	 * 
	 */
	private static final long serialVersionUID = -544094778335209879L;
	private CellEditorListener cel;
	private SternButton[] sterne = new SternButton[5];
	private int bewertung;
	private UebersichtController ue;
	private static final Logger logger = Logger
			.getLogger(BewertungCellEditor.class);

	public BewertungCellEditor(UebersichtController ue) {
		this.ue = ue;
	}

	@Override
	public void addCellEditorListener(CellEditorListener arg0) {
		cel = arg0;
	}

	@Override
	public void cancelCellEditing() {
		cel.editingCanceled(new ChangeEvent(""));
	}

	@Override
	public Object getCellEditorValue() {
		return bewertung;
	}

	@Override
	public boolean isCellEditable(EventObject arg0) {
		return true;
	}

	@Override
	public void removeCellEditorListener(CellEditorListener arg0) {

	}

	@Override
	public boolean shouldSelectCell(EventObject arg0) {
		return false;
	}

	@Override
	public boolean stopCellEditing() {
		return false;
	}

	@Override
	public Component getTableCellEditorComponent(final JTable table,
			Object value, final boolean isSelected, final int row,
			final int column) {
		final int val;
		if (value instanceof String) {
			val = Integer.parseInt(value.toString());
			logger.debug("String inputted, Integer parsed");
		} else if (value instanceof Integer) {
			val = (Integer) value;
			logger.debug("Integer " + val + " inputted");
		} else {
			val = -1;
			logger.debug("Wrong value!");
		}
		if (val <= 5 && val > 0) {
			removeAll();
			setBackground(Color.white);
			setAlignmentY(CENTER_ALIGNMENT);
			bewertung = val;
			for (int i = 0; i < 5; i++) {
				if (i < val)
					sterne[i] = new SternButton(i + 1, true);
				else
					sterne[i] = new SternButton(i + 1, false);
				final int tmp = i;
				sterne[i].addActionListener(new ActionListener() {

					@Override
					public void actionPerformed(ActionEvent e) {
						getTableCellEditorComponent(table, sterne[tmp].getNr(),
								isSelected, row, column);
						bewertung = sterne[tmp].getNr();
						DVD dvd = ue.getDVDArray()[row];
						dvd.setBewertung(sterne[tmp].getNr());
						ue.updateDVD(dvd);
						cel.editingStopped(new ChangeEvent(sterne[tmp].getNr()));
					}
				});
				sterne[i].setPreferredSize(new Dimension(20, 20));
				this.add(sterne[i]);
			}
			return this;
		}
		return this;
	}
}

Java:
package de.schaefer.mediaManagement.ui.dvd.tabelle;

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

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

import de.schaefer.mediaManagement.ui.general.SternButton;

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();
			setBackground(Color.white);
			setAlignmentY(CENTER_ALIGNMENT);
			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, 20));
				this.add(sterne[i]);
			}

		} if(isSelected || hasFocus){
			setBackground(Color.LIGHT_GRAY);
		}
		return this;
	}
}

Fall es noch wen interessiert: die Tabelle selbst:
Java:
package de.schaefer.mediaManagement.ui.general;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

import org.apache.log4j.Logger;

import de.schaefer.mediaManagement.control.viewcontroller.UebersichtController;
import de.schaefer.mediaManagement.entity.DVD;
import de.schaefer.mediaManagement.ui.dvd.tabelle.BewertungCellEditor;
import de.schaefer.mediaManagement.ui.dvd.tabelle.BewertungTableCellRenderer;
import de.schaefer.mediaManagement.ui.dvd.tabelle.DVDTableCellRenderer;
import de.schaefer.mediaManagement.ui.dvd.tabelle.DefaultListCellRenderer;
import de.schaefer.mediaManagement.ui.dvd.tabelle.IntegerTableCellEditor;
import de.schaefer.mediaManagement.ui.dvd.tabelle.StaticTextFieldCellEditor;

public class UebersichtView extends GeneralPanel {

	/**
	 * 
	 */
	private static final long serialVersionUID = -254332573885369969L;
	private static final Logger logger = Logger.getLogger(UebersichtView.class);
	private JTable uebersichtTable;
	private DefaultTableModel model;
	private TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>();
	UebersichtController uc;

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

		GridBagConstraints gbc = new GridBagConstraints();
		gbc.gridx = 0;
		gbc.gridy = 0;
		gbc.insets = new Insets(10, 0, 10, 0);
		gbc.fill = GridBagConstraints.BOTH;
		uebersichtTable = new JTable();
		uebersichtTable.setModel(getFilledTableModel());
		uebersichtTable.setRowHeight(40);
		uebersichtTable.setRowSorter(sorter);
		sorter.setModel(model);
		setBewertungsColumnUtils();
		setTitelColumnUtils();
		setDauerColumnUtils();
		setJahrColumnUtils();
		gbc.fill = GridBagConstraints.BOTH;
		gbc.weightx = 2;
		gbc.weighty = 2;
		gbc.insets = new Insets(50, 50, 50, 50);
		add(new JScrollPane(uebersichtTable), gbc);
		repaint();
	}

	private DefaultTableModel getFilledTableModel() {
		DVD[] dvds = uc.getDVDArray();
		Object[][] rowData = new Object[dvds.length][4];
		for (int i = 0; i < rowData.length; i++) {
			rowData[i][0] = dvds[i];
			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" };
		return model = new DefaultTableModel(rowData, columns);
	}

	private void setTitelColumnUtils() {
		TableColumn titelColumn = uebersichtTable.getColumn("Titel");
		titelColumn.setCellRenderer(new DVDTableCellRenderer());
		titelColumn.setCellEditor(new StaticTextFieldCellEditor(new JTextField()));
	}

	private void setBewertungsColumnUtils() {
		TableColumn bewertungsColumn = uebersichtTable.getColumn("Bewertung");
		BewertungCellEditor dvdBewertungEditor = new BewertungCellEditor(uc);
		bewertungsColumn.setCellEditor(dvdBewertungEditor);
		bewertungsColumn.setCellRenderer(new BewertungTableCellRenderer());
		bewertungsColumn.setWidth(90);
	}
	
	private void setDauerColumnUtils() {
		TableColumn dauerColumn = uebersichtTable.getColumn("Dauer");
		dauerColumn.setCellRenderer(new DefaultListCellRenderer());
		dauerColumn.setCellEditor(new IntegerTableCellEditor());
	}
	
	private void setJahrColumnUtils() {
		TableColumn jahrColumn = uebersichtTable.getColumn("Jahr");
		jahrColumn.setCellRenderer(new DefaultListCellRenderer());
		jahrColumn.setCellEditor(new StaticTextFieldCellEditor(new JTextField()));
	}

	@Override
	public GeneralPanel getParentView() {
		return uc.getParentView();
	}

}

Vielen Dank noch an die Leute, die wirklich versuchen mit zu helfen und sich das ganze durchlesen. Ich bin euch was schuldig ;)

Erwartungsvoll,
pausch
 

jgh

Top Contributor
als kleinen Tipp, wenn du versuchen würdest, dass Problem zu extrahieren und uns ein KSKB zur Verfügung stellen würdest, in dem nichts weiteres ist als eine JTable in einem JFrame und deine SternButton angezeigt werden, würdest -so behaupte ich- wahrscheinlich selbst deinen Fehler erkennen.

Ob es evtl. an deinen SternButton und falsch überschriebener paintComponent-Methode liegt, oder woran auch immer....lässt sich so imho nicht feststellen.
Was allerdings etwas merkwürdig ist, in der
[java=70] public Component getTableCellEditorComponent(final JTable table,
Object value, final boolean isSelected, final int row,
final int column) {[/code]
das in der Zeile 90 ein
Code:
removeAll()
aufrufst, finde ich grundsätzlich erstmal merkwürdig.
genauso auch dein [c]repaint()[/c] im Konstruktor der UebersichtView-Klasse, finde ich zumindest sehr fragwürdig.

Klar kann man sich daraus ein eigenes Bsp basteln, aber nur um nachher festzustellen, dass der Fehler nicht hier im geposteten Code liegt...dann lass ich es lieber. Poste den Fehler in einem KSKB und ich garantiere dir, dass die allerspätestens in 24 Std geholfen worden ist...bzw. du deinen Fehler selbst erkennst.
 

pausch

Aktives Mitglied
Tut mir leid, ich dachte die Klassen würden reichen, nach weiterer Überlegung sehe ich das jetzt auch anders ;)
Auch nach schreiben eines KSKB tritt das gleiche Problem wieder auf: wenn ich nicht auf die Buttons selbst klicke, hängt sich die JTable auf. Ich finde leider keinen Fehler mehr :(

Ich hoffe ihr könnt mir helfen...?

Hier mein KSKB:

Zunächst die Klasst mit Main-Methode:
Java:
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

public class TableFrame extends JFrame {

	private JTable tabelle;
	private DefaultTableModel model;
	
	public TableFrame() {
		setLayout(new GridBagLayout());
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.fill = GridBagConstraints.BOTH;
		gbc.gridx = 0;
		gbc.gridy = 0;
		gbc.weightx = 1;
		gbc.weighty = 1;
		tabelle = new JTable();
		String[] columns = new String[3];
		columns[0] = "Titel";
		columns[1] = "Bewertung";
		columns[2] = "Beschreibung";
		Object[][] tableData = new Object[3][5];
		for (int i=0; i<tableData.length; i++){
			tableData[i][0] = new String("Titel" + i);
			tableData[i][1] = 3;
			tableData[i][2] = new String("Beschreibung blabla" + i);
		}
		tabelle.setModel(model = new DefaultTableModel(tableData, columns));
		tabelle.setRowHeight(50);
		TableColumn bewertung = tabelle.getColumn("Bewertung");
		BewertungCellUtils cell = new BewertungCellUtils(this);
		bewertung.setCellEditor(cell);
		bewertung.setCellRenderer(cell);
		add(new JScrollPane(tabelle), gbc);
		setSize(300,300);
		setVisible(true);
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new TableFrame();

	}

	public void clicked(int row, int nr) {
		System.out.println("Do something!");
		
	}

}

Dann der CellEditor/CellRenderer
Java:
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.EventObject;

import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;

public class BewertungCellUtils extends JPanel implements TableCellRenderer,
		TableCellEditor {

	SternButton[] sterne = new SternButton[5];
	TableFrame tf;
	int bewertung;

	public BewertungCellUtils(TableFrame tf) {
		this.tf = tf;
	}

	// CellRender-Methode:

	@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();
			setBackground(Color.white);
			setAlignmentY(CENTER_ALIGNMENT);
			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, 20));
				this.add(sterne[i]);
			}

		}
		if (isSelected || hasFocus) {
			setBackground(Color.LIGHT_GRAY);
		}
		return this;
	}

	// CellEditor-Methoden:
	CellEditorListener cel;

	@Override
	public void addCellEditorListener(CellEditorListener arg0) {
		cel = arg0;
	}

	@Override
	public void cancelCellEditing() {
		cel.editingCanceled(new ChangeEvent(""));
	}

	@Override
	public Object getCellEditorValue() {
		return bewertung;
	}

	@Override
	public boolean isCellEditable(EventObject arg0) {
		return true;
	}

	@Override
	public void removeCellEditorListener(CellEditorListener arg0) {

	}

	@Override
	public boolean shouldSelectCell(EventObject arg0) {
		return false;
	}

	@Override
	public boolean stopCellEditing() {
		return false;
	}

	@Override
	public Component getTableCellEditorComponent(final JTable table,
			Object value, final boolean isSelected, 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();
			setBackground(Color.white);
			setAlignmentY(CENTER_ALIGNMENT);
			bewertung = val;
			for (int i = 0; i < 5; i++) {
				if (i < val)
					sterne[i] = new SternButton(i + 1, true);
				else
					sterne[i] = new SternButton(i + 1, false);
				final int tmp = i;
				sterne[i].addActionListener(new ActionListener() {

					@Override
					public void actionPerformed(ActionEvent e) {
						getTableCellEditorComponent(table, sterne[tmp].getNr(),
								isSelected, row, column);
						bewertung = sterne[tmp].getNr();
						tf.clicked(row, sterne[tmp].getNr());
						cel.editingStopped(new ChangeEvent(sterne[tmp].getNr()));
					}
				});
				sterne[i].setPreferredSize(new Dimension(20, 20));
				this.add(sterne[i]);
			}
			return this;
		}
		return this;
	}

}

und zuletzt mein "SternButton"
Java:
import javax.swing.ImageIcon;
import javax.swing.JButton;

public class SternButton extends JButton {

	int nr;
	boolean farbig;
	
	public SternButton(int zahl, boolean farbig){
		this.farbig = farbig;
		if(farbig){
			setBorderPainted(true);
		} else {
			setBorderPainted(false);
		}
		nr = zahl;
	}
	
	public int getNr(){
		return nr;
	}
	
	public boolean isActivated(){
		return farbig;
	}
}


Ich hoffe wirklich, dass ihr mir helfen könnt...

Danke für die Bemühungen schonmal im Vorraus :)
 

Michael...

Top Contributor
Bekommst Du keine Exception ausgegeben? z.B Stackoverflow?
Warum erzeugst Du im Editor immer wieder alles neu (gilt auch für den Renderer) erweitere so SternButton, dass bestehende Objekte angepasst werden. So untergräbst Du ja das Rendering Konzept von Swing.
Warum wird in den ActionListenern die CellEditorMethode aufgerufen
[JAVA=126] getTableCellEditorComponent(table, sterne[tmp].getNr(), isSelected, row, column);[/code]
Statt einzelner SternButtons würde ich ein "SternPanel" mit den fünf Buttons als Basis des Renderers und des Editors nehmen, das man einfach per setRating einstellen kann.
 

pausch

Aktives Mitglied
Also Exceptions fliegen gar keine...
Aber ehrlich gesagt habe ich keine Ahnung wie ich diese Struktur so anpassen kann, sodass "das Rendering Konzept von Swing" nicht untergraben wird. Das Problem ist ja, dass bei einem klick auch abgefragt werden können muss, welcher button gedrückt worden ist, sprich welches "rating" gesetzt wird...

Aber danke für die Mühe ;)

EDIT:
Hab noch was vergessen: die getEditorComponent methode wird aufgerufen, um alles mit den neuen Werten zu initialisieren... aber du hast recht - sehr unschön, aber was habe ich denn für eine Wahl? ???:L
 

pausch

Aktives Mitglied
Nach etwas Überlegen komme ich jetzt auf folgende Lösung:

Die Klasse SternButton besitzt jetzt eine setActivated(boolean val)-Methode um nicht ständig neue Sterne zu erzeugen...
Java:
import javax.swing.ImageIcon;
import javax.swing.JButton;

public class SternButton extends JButton {

	int nr;
	boolean farbig;
	
	public SternButton(int zahl, boolean farbig){
		this.farbig = farbig;
		setBorderPainted(farbig);
		nr = zahl;
	}
	
	public int getNr(){
		return nr;
	}
	
	public void setActivated(boolean val){
		setBorderPainted(val);
	}
	
	public boolean isActivated(){
		return farbig;
	}
}


Und der Renderer/Editor benutzt diese Methode jetzt
Java:
//...Rest wie oben

public BewertungCellUtils(TableFrame tf) {
		this.tf = tf;
		for(int i=0; i<sterne.length; i++){
			sterne[i] = new SternButton(i+1, false);
		}
	}

	// CellRender-Methode:

	@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) {
			setBackground(Color.white);
			setAlignmentY(CENTER_ALIGNMENT);

		}
		if (isSelected || hasFocus) {
			setBackground(Color.LIGHT_GRAY);
		}
		return this;
	}

public Component getTableCellEditorComponent(final JTable table,
			Object value, final boolean isSelected, 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();
			setBackground(Color.white);
			setAlignmentY(CENTER_ALIGNMENT);
			bewertung = val;
			for (int i = 0; i < 5; i++) {
				if (i < val)
					sterne[i].setActivated(true);
				else
					sterne[i].setActivated(false);
				final int tmp = i;
				sterne[i].addActionListener(new ActionListener() {

					@Override
					public void actionPerformed(ActionEvent e) {
						getTableCellEditorComponent(table, sterne[tmp].getNr(),
								isSelected, row, column);
						bewertung = sterne[tmp].getNr();
						tf.clicked(row, sterne[tmp].getNr());
						cel.editingStopped(new ChangeEvent(sterne[tmp].getNr()));
					}
				});
				sterne[i].setPreferredSize(new Dimension(20, 20));
				this.add(sterne[i]);
			}
			return this;
		}
		return this;
	}
 

Michael...

Top Contributor
Auch hier wird immer noch in den ActionListenern die
Code:
getTableCellEditorComponent
des Editor aufgerufen. Warum?

Hier mal ein Beispiel, wenn man das unbedingt mit Buttons machen will. Hab es in 15 min runtergeschrieben, ist daher optisch noch nicht sehr ansprechend und hat noch Optimierungspotential, aber funktioniert und vermittelt hoffentlich ein Gefühl für eine mögliche Implementierung:
Java:
package a_trash;

import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.EventObject;

import javax.swing.AbstractCellEditor;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;

public class RatingDemo extends JFrame {

	public RatingDemo() {
		DefaultTableModel model = new DefaultTableModel(new String[] { "Titel", "Rating" }, 0);
		for (int i = 0; i < 10; i++)
			model.addRow(new Object[] { "Titel " + i, (int) (Math.random() * 6) });
		JTable table = new JTable(model);
		this.add(new JScrollPane(table));

		table.getColumnModel().getColumn(1).setCellRenderer(new RatingRenderer());
		table.getColumnModel().getColumn(1).setCellEditor(new RatingEditor());
	}

	class RatingRenderer implements TableCellRenderer {
		private RatingPanel panel = new RatingPanel();

		public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
			int intValue = 0;
			try {
				intValue = Integer.parseInt(value.toString());
			} catch (NumberFormatException exc) {
				exc.printStackTrace();
			}
			panel.setRating(intValue);
			return panel;
		}

	}

	class RatingEditor extends AbstractCellEditor implements TableCellEditor {
		private RatingPanel panel;

		public RatingEditor() {
			panel = new RatingPanel();
			panel.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent evt) {
					fireEditingStopped();
				}
			});
		}

		public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
			int intValue = 0;
			try {
				intValue = Integer.parseInt(value.toString());
			} catch (NumberFormatException exc) {
				exc.printStackTrace();
			}
			panel.setRating(intValue);
			return panel;
		}

		public Object getCellEditorValue() {
			return panel.getRating();
		}

		public boolean isCellEditable(EventObject anEvent) {
			return true;
		}
	}

	class RatingPanel extends JPanel {
		private int rating;
		private JButton[] button;

		public RatingPanel() {
			this.setLayout(new GridLayout(1, 5));
			button = new JButton[5];
			for (int i = 0; i < button.length; i++)
				this.add(button[i] = new JButton("*"));
		}

		public void addActionListener(ActionListener listener) {
			for (int i = 0; i < button.length; i++) {
				button[i].addActionListener(listener);
				final int value = i + 1;
				button[i].addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent evt) {
						rating = value;
					}
				});
			}
		}

		public void setRating(int rating) {
			this.rating = rating;
			for (int i = 0; i < button.length; i++)
				button[i].setBackground(Color.WHITE);
			for (int i = 0; i < rating; i++)
				button[i].setBackground(Color.ORANGE);
		}

		public int getRating() {
			return rating;
		}
	}

	public static void main(String[] s) {
		JFrame frame = new RatingDemo();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setBounds(0, 0, 500, 300);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}
}

Ergänzung: Hier wird mit einem "ButtonPanel" gearbeitet, dessen Instanzen sowohl vom Renderer als auch vom Editor genutzt werden. Man muss ja nicht alles doppelt implementieren.
 
Zuletzt bearbeitet:

pausch

Aktives Mitglied
Danke dein Programm funktioniert :)
Ich glaub mein Problem war, dass ich dem Panel einfach ein listener hätte hinzufügen müssen, der ein editingStopped() aufruft...
Danke ich schließe das dann mal :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A JTable removed Column wieder anzeigen Java Basics - Anfänger-Themen 3
B JTable. mal wieder Java Basics - Anfänger-Themen 11
DrahtEck Schleife soll wieder da anfangen wo ich es möchte ! Java Basics - Anfänger-Themen 17
G JTree speichern und wieder einlesen Java Basics - Anfänger-Themen 5
W In alten Code zurück- und dort wieder zurechtfinden? Java Basics - Anfänger-Themen 17
I Passwort in Datenbank speichern um später wieder auszulesen Java Basics - Anfänger-Themen 5
Temsky34 Wie bekomme ich dieses Java-Warning wieder weg? Java Basics - Anfänger-Themen 2
T j.u.Scanner(Sys.in).nextLine() wieder schließen? Java Basics - Anfänger-Themen 5
f3mys Objektwerte in Liste speichern und wieder abrufen Java Basics - Anfänger-Themen 23
O Text mit Regex trennen und wieder zusammenbauen Java Basics - Anfänger-Themen 5
Naxon89 Input/Output Ein PDF in einem BLOB umwandeln um ihn dann als PDF wieder anzuzeigen Java Basics - Anfänger-Themen 3
H JavaFX Hintergrundfarbe ändern, warten, Hintergrundfarbe wieder ändern Java Basics - Anfänger-Themen 34
MichelNeedhelp Brauche zu diesem Labyrinth ein Skript? Der Hamster soll im Urzeigersinn das ganze Labyrinth abgehen und wieder an seinem Ursprungsplatz sein. Java Basics - Anfänger-Themen 40
D Codeblöcke, die immer wieder im Programmverlauf benötigt werden Java Basics - Anfänger-Themen 5
TimoN11 Array -> Schleife wieder von vorne durchlaufen lassen Java Basics - Anfänger-Themen 1
JD_1998 Arrays einlesen, zwischenspeichern und wieder ausgeben Java Basics - Anfänger-Themen 8
M Regex Probleme (mal wieder) Java Basics - Anfänger-Themen 3
J Selektiertes Element von jComboBox zwischenspeichern und wieder einsetzen Java Basics - Anfänger-Themen 0
S Nutzereingabe splitten und in string array wieder ausgeben. Java Basics - Anfänger-Themen 1
I wieder mit einer Umwandelung habe ich Problem (diesmal von char Array zu char) Java Basics - Anfänger-Themen 1
N Wie kann ich einen String wieder zusammensetzen und ausgeben lassen? Java Basics - Anfänger-Themen 9
C Array-Eintrag wieder auf Null setzen Java Basics - Anfänger-Themen 3
W Verschachtelte Objekte wieder auspacken Java Basics - Anfänger-Themen 3
M Array immer wieder um ein Element erweitern Java Basics - Anfänger-Themen 6
CptK Methoden Event bei gedrückter Maustaste immer wieder ausführen Java Basics - Anfänger-Themen 1
CptK Klassen Event bei gedrückter Maus immer wieder mit Pause ausführen Java Basics - Anfänger-Themen 2
J Geld speichern und wieder auslesen Java Basics - Anfänger-Themen 10
M JTextField blitzt immer wieder nur auf Java Basics - Anfänger-Themen 12
CptK Datentypen Verdrehte Wörter wieder herstellen Java Basics - Anfänger-Themen 21
J Timer bauen, Main Methode immer wieder neu starten Java Basics - Anfänger-Themen 13
I Methoden Schleife immer wieder durchlaufen lassen Java Basics - Anfänger-Themen 15
F Immer wieder gleiche Zufallszahl? Java Basics - Anfänger-Themen 4
M Schleifenergebnis in selbiger wieder verwenden Java Basics - Anfänger-Themen 7
L Methoden Rekursion gibt alten Wert wieder Java Basics - Anfänger-Themen 37
L jar, class, java und wieder zurück Java Basics - Anfänger-Themen 8
M aus Fenster anderes Fenster öffnen und wieder umgekehrt Java Basics - Anfänger-Themen 5
J Fenster wieder unsichtbar machen Java Basics - Anfänger-Themen 2
J Auslesen/speichern und wieder einlesen Java Basics - Anfänger-Themen 7
S Sound stoppen und nach Pause wieder abspielen Java Basics - Anfänger-Themen 6
T while schleife starten , beeneden und wieder Starten Java Basics - Anfänger-Themen 8
I Zähler, der erst wieder zählt nachdem Pixel wieder andere Farbe hat Java Basics - Anfänger-Themen 2
B javax.ejb.Timer wieder starten? Java Basics - Anfänger-Themen 0
N Methode auslagern mal wieder Java Basics - Anfänger-Themen 8
F Inhalt einer Variable auswerten, die sich immer wieder ändert Java Basics - Anfänger-Themen 1
B ja ja schon wieder einer mit einer public static void main(string[] args) Frage... Java Basics - Anfänger-Themen 8
Bluedaishi for schleife um Dateien wieder zusammen zu fügen Java Basics - Anfänger-Themen 11
I SHA512 verschlüsseln und dann wieder auslesen? Java Basics - Anfänger-Themen 35
F Timer abbrechen und wieder starten Java Basics - Anfänger-Themen 5
J KeyListener - mal wieder... Java Basics - Anfänger-Themen 2
B Listener beim Laden (deserialize) wieder hinzufügen bzw. mitspeichern? Java Basics - Anfänger-Themen 3
GadgetSofa .txt Datei erstellen und gleich wieder Löschen? Java Basics - Anfänger-Themen 12
D Bild für ein paar Sekunden einblenden und wieder ausblenden Java Basics - Anfänger-Themen 1
M Tabelle aktualisieren (mal wieder) Java Basics - Anfänger-Themen 10
M Erste Schritte Tabelle aktualisieren (mal wieder) Java Basics - Anfänger-Themen 7
M Zahlen als Bytes in eine Datei speichern, daraus wieder auslesen Java Basics - Anfänger-Themen 2
D Schon wieder double -.- Java Basics - Anfänger-Themen 4
R Switch: Nach durchlaufen des Case wieder zum Menü Java Basics - Anfänger-Themen 3
K For Each Schleife wieder von Beginn an iterieren Java Basics - Anfänger-Themen 12
L Und schon wieder :=( Java Basics - Anfänger-Themen 3
T Arbeitsspeicher wieder freigeben Java Basics - Anfänger-Themen 21
Ernesto95 BufferedImage Teilbereich wieder transparent setzen Java Basics - Anfänger-Themen 16
J Schon wieder Rekursionsproblem Java Basics - Anfänger-Themen 3
S Erste Schritte Hochgescrolltes Menu nach MouseOut wieder "runter holen" Java Basics - Anfänger-Themen 3
H Datei in kleine Stücke teilen und wieder erkennen Java Basics - Anfänger-Themen 10
B Variable wird einfach so wieder auf "null" gesetzt Java Basics - Anfänger-Themen 12
B Cookies auslesen und wieder schreiben Java Basics - Anfänger-Themen 2
T wieder mal Serialization :-) Java Basics - Anfänger-Themen 10
J Mal wieder ein kleines Toleranzproblem Java Basics - Anfänger-Themen 20
T text von textfeld auslesen und wieder reinschreiben Java Basics - Anfänger-Themen 10
T Benutzereingabe in form von string wieder ausgeben in JOptionPane Java Basics - Anfänger-Themen 14
F Input/Output ArrayList presistent speichern und wieder auslesen Java Basics - Anfänger-Themen 4
D Ausgegebene Worte wieder löschen. Java Basics - Anfänger-Themen 6
B Heap-Speicher wieder freigeben Java Basics - Anfänger-Themen 10
V Schon wieder ein kleines problem...dieses mal mit do-while loop Java Basics - Anfänger-Themen 9
M Mal wieder Probleme mit Date Java Basics - Anfänger-Themen 9
M Threads Thread ist nur kurz interrupted, dann wieder nichtmehr Java Basics - Anfänger-Themen 6
K Mal wieder ein Problem mit If / Else Java Basics - Anfänger-Themen 10
A Wie kann man etwas von Typ Image wieder löschen? Java Basics - Anfänger-Themen 7
J Threads Threads anhalten und wieder fortführen Java Basics - Anfänger-Themen 9
P Dropdownbox nach hinzufügen wieder öffnen Java Basics - Anfänger-Themen 7
A Daten speichern und wieder in ein Array laden Java Basics - Anfänger-Themen 4
B Datentypen Inhalt zum Iterator wieder aufrufen? Java Basics - Anfänger-Themen 10
Os-Programming Checkbox immer wieder überprüfen Java Basics - Anfänger-Themen 13
S Datei einlesen und Ergebnis wieder in Datei schreiben Java Basics - Anfänger-Themen 5
J Datei einlesen teile aus lines ändern und wieder rausschreiben. Java Basics - Anfänger-Themen 4
M String-Array-Element wieder null zuweisen Java Basics - Anfänger-Themen 16
K Wie kann ich aus jar Dateien wieder normale Klassen generieren? Java Basics - Anfänger-Themen 7
F Mal wieder: Cannot make a static reference to the non-static method Java Basics - Anfänger-Themen 9
F Collections Datenbankdaten in einer Map speichern, bearbeiten, sortieren und wieder in Datenbank schreiben Java Basics - Anfänger-Themen 20
B Datentypen Werte in einen Array einlesen und danach die beiden höchsten Werte wieder ausgeben Java Basics - Anfänger-Themen 3
L Datentypen byte[] in String und wieder zurück Java Basics - Anfänger-Themen 3
B Datei in mehrere Ordner splitten und wieder zusammenfuegen... Java Basics - Anfänger-Themen 3
R ARRAY/List die sich immer wieder von vorne neu auffüllt ? Java Basics - Anfänger-Themen 21
F OOP Wieder mal Zugriffsprobleme... (Lösung am Ende) Java Basics - Anfänger-Themen 11
M Dynamisches Casten mal wieder Java Basics - Anfänger-Themen 4
P Zwei Charakter als Paramter übergeben und wieder ausgeben Java Basics - Anfänger-Themen 10
D Array speichern und wieder aufrufen Java Basics - Anfänger-Themen 6
Dit_ Thread stoppen und wieder starten Java Basics - Anfänger-Themen 2
M AudioStream - wiederholen, pausieren und wieder starten Java Basics - Anfänger-Themen 2
U Threads - Beenden/ Wieder starten Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben