JPanel Update - Problem

fuxreid

Grünschnabel
Hallo Leute,

ich suche nun schon seit mehreren Tagen nach einer Lösung, da ich aber bis jetzt nichts gefunden habe, was funktioniert hat, bitte ich euch dringend um Hilfe.

Ich möchte gerne ein Panel im stateChange neu füllen. Es handelt sich um einen Farbverlauf von der aktuell ausgewählten Farbe zu rot, grün und blau.

Ich hoffe anhand des Screenshots kann man grob erkennen um was es gehen soll.
bsp.png
Der folgende Code erstellt das neue Panel, wenn sich die aktuell ausgewählte Farbe geändert hat.

Code:
	private JPanel PaintGradientRed()
	{
		return PaintGradient(new Color(0, this.g, this.b), new Color(255, this.g, this.b), 135, GuiPositions.row1Y, 190, 18);	
	}
	
	private JPanel PaintGradientGreen()
	{
		return PaintGradient(new Color(this.r, 0, this.b), new Color(this.r, 255, this.b), 135, GuiPositions.row1Y + GuiPositions.gapY, 190, 18);	
	}
	
	private JPanel PaintGradientBlue()
	{
		return PaintGradient(new Color(this.r, this.g, 0), new Color(this.r, this.g, 255), 135, GuiPositions.row1Y + GuiPositions.gapY * 2, 190, 18);	
	}
	
	private JPanel PaintGradient(Color startColor, Color aimColor, int posX, int posY, int width, int height)
	{
		JPanel gradient;
		JLabel label;
		double changesPerStep_r = (double)(aimColor.getRed() - startColor.getRed()) / width;
		double changesPerStep_g = (double)(aimColor.getGreen() - startColor.getGreen()) / width;
		double changesPerStep_b = (double)(aimColor.getBlue() - startColor.getBlue()) / width;
		
		int r, g, b;
		
		gradient = new JPanel(null);
		gradient.setBounds(posX, posY, width, height);
		
		for (int temp = 0; temp < width; temp++)
		{
			label = new JLabel();
			r = startColor.getRed() + (int) (temp * changesPerStep_r);
			g = startColor.getGreen() + (int) (temp * changesPerStep_g);
			b = startColor.getBlue() + (int) (temp * changesPerStep_b);
			
			label.setBackground(new Color(r, g, b));
			label.setBounds(temp, 0, 1, height);
			label.setOpaque(true);
			gradient.add(label);
		}
		
		return gradient;
	}

Im stateChanged-EventsDings wird es wie folgt aufgerufen:
Code:
...

if (activateChangeListener == true)
		{
		// Spinner
			// Rot
			if (arg0.getSource() == spinner_r)
			{
				this.r =  (int) spinner_r.getValue();
				slider_r.setValue( this.r);
				SetNewHsv();
				gradient_g = PaintGradientGreen();
				gradient_b = PaintGradientBlue();
			}

...

So, nachdem ich das Panel "gradient_g" neu befüllt habe möchte ich die Änderung auch gerne Anzeigen. Nur hier scheiter ich.
Ich habe es schon mit gradient_g.revalidate(); und oder gradient_g.repaint(); versucht, leider ohne Erfolg.

Was mache ich falsch?

Grüße, Florian
 

takidoso

Erfahrenes Mitglied
Hi fuxreid,
kanst Du zu Deinem "stateChanged-EventsDings" mehr beschreiben?
Ich meine damit den vollständigen Code.
Normalerweise ist es so, dass man ein Objekt, welches sich anhand von Ereignissen, wie z.B. drehen eines Drehkopfes etc. ändern soll, als Listener and den Ereignisereuger anmeldet.
Tust Du sowas?
Wenn ja wie?

Beste Grüße

Takidoso


PS: bitte lasse Mehthodennamen mit einem kleinen Buchstaben beginnen, dies entspräche der "stillen" Javanamenskonvention
 
Zuletzt bearbeitet: