CellRenderer Probleme bei JList

Spin

Top Contributor
Hallo Java Gemeinde,

ich habe ein Problem mir dem CellRenderer für eine JList.

Ich möchte gerne das man einen Namen und eine Farbe aus einer Combobox asuwählt und dann einer Liste hinzufügt.

Diese Liste soll denn den Namen und als Hintergrundfarbe die gewählte Farbe haben.

Das hinzufügen und entfernen ist sehr einfach , jedoch muss ich den Cellrenderer anpassen um eine Hintergrundfarbe anzeigen zu lassen.

Dazu nehme ich mir ein Panel und male es mit der Farbe an.

Mein Problem ist , dass 1. der name nicht drauf steht und 2. das wenn ich die Farbe in der Combobox ändere , diese auch in der JList geändet wird.

Das rendern wird anscheind ständig aufgerufen.
Habe mir für den Namen ein JLabel gedacht , was ich dann auf das Panel packe ????

Für die farben eine Liste aber wie bekomme ich die zugehörigkeit hin?


Ein renderer für nur farbe und für nur text ist nicht so schwer, aber die kombi , grüße , danke für hilfe



Java:
package lib;

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;

import javax.swing.*;

import view.MainWindow;

public class ColorListRenderer extends JPanel implements ListCellRenderer{

	/**
	 * serial version uid
	 */
	private static final long serialVersionUID = 1L;
	
	/**
	 * main window
	 */
	public MainWindow mainWindow = null;
	
	/**
	 * Defeault Constructor
	 * @param {@code MainWindow}
	 */
	public ColorListRenderer(MainWindow mainWindow) {
		this.mainWindow = mainWindow;
	}
	
	/**
	 * String player name
	 */
	public String playerName = "";
	
	/**
	 * Color
	 */
	public Color color = null;

	@Override
	public Component getListCellRendererComponent(JList list, Object obj,
			int row, boolean sel, boolean hasFocus) {
		
		
		
		if(obj instanceof String){
			playerName = (String)obj;
			System.out.println(obj);
		}
		
		this.color = (Color)this.mainWindow.getGameSettingsPanel().getColorComboBox().getSelectedItem();
		this.mainWindow.getGameSettingsPanel().setAColor(this.color);
					
		
		return this;
	}
	
	/**
	 * paint choosen color to combobox
	 */
	@Override
	public void paint(Graphics g) {
		this.setBackground(this.mainWindow.getGameSettingsPanel().getAColor());
		
		g.drawString(playerName, 0, 0);
		// important to call constructor 
		super.paint(g);
	}

}
 
Hm? Das mit dem Panel habe ich jetzt nicht verstanden, wozu? Wozu paint überschreiben? Wieso nicht einfach bei JLabel bleiben und dort dann
Code:
setBackground
aufrufen (mit setOpaque(true) evtl. noch)? Die Farbe musst du allerdings irgendwo merken, denn
Java:
this.color = (Color)this.mainWindow.getGameSettingsPanel().getColorComboBox().getSelectedItem();
ist genau das von dir angesprochene Problem! So holt er sich ja immer das selektiere Objekt!
Du musst dir die Farbe also wie schon gesagt merken
 
Hallo era, das mit dem JLabel geht soweit und ist vielleicht einfacher 😉 Mit dem Panel gehts auch aber da muss ich halt paintComponent verwenden.


Java:
@Override
	public Component getListCellRendererComponent(JList list, Object obj,
			int row, boolean sel, boolean hasFocus) {
		
		name = (String)obj;
		
		JLabel label = new JLabel(name);
		label.setForeground(Color.GREEN);
		
		Color color = (Color)this.mainWindow.getGameSettingsPanel().getColorComboBox().getSelectedItem();
		label.setBackground(color);
		label.setOpaque(true);
		
		this.mainWindow.getGameSettingsPanel().test.add(label);
		
		return label;
	}


Ich weiss aber nicht wie ich es speichern soll.
Ich brauche eine Map , mit key value oder ?

Denn diese methode wird ständig aufgerufen und ich brauche irgendwie eine beziehung. Der Name muss seine farbe kennen irgendwie so ?


eine idee in was ich das speichern soll?
Wollte das jetzt mit einer Arraylist machen. Das JLabel wegpacken , aber wie kann ich dass denn wieder hinzufügen?

grüße und danke 🙂
 
Aiaiai 😀

obj ist ja bei dir nur ein String, da würde ich halt jetzt ein Objekt erwarten aus dem ich den String + die Farbe erfassen kann.
So etwas in der Art von
Java:
class Player{
	private String name;

	public Player(String name) {
		this.name = name;
	}

	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}
}

class ColorWrapper{
	private Player player;
	private Color color;
	
	public ColorWrapper(Player player, Color color) {
		this.player = player;
		this.color = color;
	}

	/**
	 * @return the player
	 */
	public Player getPlayer() {
		return player;
	}

	/**
	 * @return the color
	 */
	public Color getColor() {
		return color;
	}
}

ColorWrapper -Objekte dann in der JList ablegen anstelle von nur Strings!
(
also z.B,
model.addElement(new ColorWrapper(new Player(deinTextfeld.getText()), (Color) deineCombobox.getSelectedItem()));
)
Dann würde zumindest für die JList der Renderer wie folgt ausreichen
Java:
class ColorListRenderer extends JLabel implements ListCellRenderer{
	{
		this.setOpaque(true);
	}
	public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
		ColorWrapper cw = (ColorWrapper) value;
		this.setText(cw.getPlayer().getName());
		this.setBackground(cw.getColor());
		return this;
	}
}
 
eraaaaaaa du bist so genial 🙂
danke danke danke 🙂😉


sorry jetzt erst zeit gefunden, mein Problem zu fixen. War im Bug Report schon auf High Prio 😉
 

Neue Themen


Zurück
Oben