# Label umfärben



## Cinimod (28. Aug 2003)

Hallo!

Ich habe ein JLabel, welches mit java.awt.Container c = getContentPane().add(jLabel) in ein JFrame
geaddet ist.  Wenn ich jetzt auf diese JLabel klicke, erscheint ein Popup Menu und ich kann von
einem JMenuItem - hier redItem - eine Farbe auswählen. Das redItem hat dabei einen roten
Hintergrund.
Folgender Code zeigt den wesentlichen Teil:


```
else if(source == greenItem) { actualLabel.setBackground( ((JMenuItem)source).getBackground()); actualLabel.repaint();}
```

Jetzt bleibt das JLabel in seiner gewohnten Farbe bzw. nichts passiert. Es kann eigentlich nur an 
repaint liegen, denke ich, aber ich weiss nicht warum!

Für Hilfe vielen Dank im voraus!


----------



## marsias (28. Aug 2003)

Hi!

Also hoffe ich hab es richtig verstanden.
Das Label ist grün und nach einem klick im
Menu soll es rot werden?

Wenn es so ist, ist doch dein code falsch:

```
else if(source == greenItem) {
    actualLabel.setBackground( ((JMenuItem) source).getBackground());
    actualLabel.repaint();
}
```

Wenn aktuelles grün, dann setzte hintergrund so wie mein aktuelles objekt...
also grün.

ich denke da ist der fehler.  Wenn grün dann rot sollte stimmen.

mfg


----------



## Nobody (29. Aug 2003)

der quelltext ist 2mal genau der selbe nur einmal ist er strukturiert geschrieben.

zum autor des threads: schreib deine quelltext so, ist zwar am anfang etwas schwer, aber es erleichtert die sache doch ungemein.


also wenn die farbe geändert wird, dann wird das objekt doch neu gezeichnet oder liege ich da falsch?
versuchs mal indem du es rausnimmst (zum testen reicht auskommentieren).


----------



## marsias (29. Aug 2003)

Hi!

ja der quelltext ist der selbe, habe nix an ihm geändert.
wollte den nur noch mal vor augen haben.
er muss einfach in der setBackground() methode das richtige
einfügen. wie sein programm weiter aufgebaut ist kann ich ja nicht
sagen. 

mfg


----------



## Cinimod (29. Aug 2003)

Sorry für die falsche Formatierung. Zudem habe ich noch die falsche Zeile reinkopiert und noch etwas vergessen, wodurch etwas Verwirrung aufgekommen ist....nochmal:

Ein JLabel - actualLabel - ist zu einem java.awt.Container geaddet worden. Wenn ich jetzt auf diese JLabel klicke erscheint ein Popup
Menu mit verschiedenen JMenuItems, die mir verschiedene Farben zur Auswahl geben, z.B. greenItem.
Wenn ich jetzt auf dieses greenItem klicke, dessen Hintegrundfarbe grün ist, soll sich das actualLabel grün färben.
Zur Realisierung soll folgender Code dienen:



```
else if(source == greenItem)
    { 
      actualLabel.setBackground( ((JMenuItem) source).getBackground()); 
      actualLabel.repaint(); 
    }
```

Es kommt hinzu, dass die JLabels dynamisch auf die Oberfläche hinzugefügt werden, also noch gar nicht klar ist
wie viele JLabels es sein werden. Um das actualLabel zu bekommen, ist jedes hinzugefügte JLabel mit einem
MouseListener versehen, und wenn ich auf dieses JLabel klicke passiert folgendes:

actualLabel = jLabel; (jLabel, das JLabel auf welches geklickt wurde)

Dabei ist actualLabel global definiert.

Ich hoffe, das reicht für das allgemeine Verständnis aus   

Danke im voraus für Antworten!


----------



## marsias (31. Aug 2003)

Hi!

jede Komponente hat ja eine validate() methode probier es mal damit aus.
Schau dir mal auch die SwingUtilities klasse an. kann vielleicht hilfreich sein.

mfg


----------



## Cinimod (1. Sep 2003)

Irgendwie sitze ich auf dieser Angelegenheit fest. 
Hier eine kleine Testklasse, die das Problem ein wenig stärker verdeutlichen soll. 
Komischerweise lässt sich nicht einmal das JLabel im Konstruktor blau färben. 


```
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class Test extends JFrame implements ActionListener
{
	private JLabel actualLabel;
	private JLabel label1;
	private JPopupMenu popup;
	private JMenuItem redItem;

	public Test()
	 {

	  popup = new JPopupMenu();
          redItem = new JMenuItem("Rot");
         redItem.setBackground(Color.red);  
         redItem.addActionListener(this);
         popup.add(redItem);

	   label1 = new JLabel("Label 1");
	   label1.setBackground(Color.blue); //blau färben!
	   label1.setBorder(BorderFactory.createLineBorder(Color.black));
	   label1.addMouseListener(new MouseAdapter()
	    {
	      public void mouseClicked(MouseEvent me)
	       {
			JLabel source = (JLabel) me.getSource();
	        popup.show(source, me.getX(), me.getY());
	 	   }
	     });

            this.getContentPane().add(label1);
	    setSize(300, 300);
	    setVisible(true);
       }

    public void actionPerformed(ActionEvent ae)
     {
         JMenuItem source = (JMenuItem) ae.getSource();

		if(source == redItem)
		 {
		   JLabel invoker = (JLabel) popup.getInvoker();
		   invoker.setBackground(source.getBackground());
		   invoker.validate(); //hier sollte es sich umfärben.
	     }
	  }

  public static void main(String args[])
   {
	 new Test();
   }
}
```


----------



## mariopetr (2. Sep 2003)

setze das label mal opaque


----------



## Cinimod (2. Sep 2003)

Danke Mario!
Funktioniert jetzt


----------



## mariopetr (2. Sep 2003)

tja, geht halt alles, wenn man es zwingt *g*


----------

