# addChangeListener



## DarkNight (8. Okt 2008)

Hallo Leute!

Ich komm gerade überhaupt nicht weiter.

Ich hab mal ein JPanel DrawSquare das mir ein Rechteck mit einer bestimmten Farbe zeichnet!
DrawSquare füge ich dann an das PixelGrapPanel hinzu!

So mein Problem ist es, ich möchte einen ChangeListener zum instanzierten DrawSquare hinzufügen und dann sollte das Rechteck immer wieder mit einer anderen Farbe upgedated werden sobald sich die Farbe ändert. Hab schon unzählige Varianten ausprobier aber das funktioniert nicht so wirklich.


Hier mal die 2 Klassen!


```
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JPanel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class DrawSquare extends JPanel implements ChangeListener {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1038294787887332353L;
	private Color color = null; //default Color
	
	public DrawSquare(Color c) {
		this.color = c;
		this.setPreferredSize(new Dimension(60,60));
	}
	public void updateColor(Color c) {
		if(c.equals(this.color)) {
			this.color = c;	
		}
		
	}
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.drawRect(5, 5, 50, 50);
		g.setColor(color);
		g.fillRect(6, 6, 49, 49);
		
	}
	@Override
	public void stateChanged(ChangeEvent e) {
		this.repaint();
	}
}
```


```
package ck.pixelgrap;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.image.BufferedImage;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.border.TitledBorder;
import javax.swing.event.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import ck.pixelgrap.widgets.square.DrawSquare;

/*
 * This class represents the panel in the GUI
 */
public class PixelGrapPanel extends JPanel implements MouseMotionListener {
	
	
	/**
	 * Variable declaration
	 */
	private static final long serialVersionUID = -1548909448747888595L;
	
	private DrawSquare colorSquare = null;
	private PixelThread pixelColor = null; 
	
	private JPanel labelPanel = null;
	private JLabel rgbValue = null;
	private JLabel hexValue = null;
	private JLabel cmykValue = null;
	
    private Color lastcolor = null;
	
	
	
	public PixelGrapPanel()  {
		
		
		this.setLayout(new BorderLayout());		
		this.setPreferredSize(new Dimension(200, 100));
		//this.setSize(200, 100);
		//this.addMouseMotionListener(this);
		
		//add Titel and Border
		TitledBorder title;
		title = BorderFactory.createTitledBorder("PixelGrap");
		this.setBorder(title);
		
		pixelColor = new PixelThread();
		
		colorSquare = new DrawSquare(pixelColor.getColor());
		colorSquare.updateColor(pixelColor.getColor());
		
		colorSquare.addChangeListener(this); //erkennt addChangeListener nicht!!!
		
		this.add(colorSquare, BorderLayout.WEST);
		
		System.out.println(pixelColor.getColor().getBlue() + " " + pixelColor.getColor().getGreen());

		
		//Add Color Labels
		labelPanel = new JPanel();
		labelPanel.setLayout(new BoxLayout(labelPanel, BoxLayout.Y_AXIS));
		rgbValue = new JLabel( "RGB  : ");
		hexValue = new JLabel( "HEX  : #");
		cmykValue = new JLabel("CMYK :");
		labelPanel.add(rgbValue);
		labelPanel.add(hexValue);
		labelPanel.add(cmykValue);
		this.add(labelPanel, BorderLayout.CENTER);
			
	}
	
	//Setter & Getter Methods
	public void setColor(Color c) {
		this.lastcolor = c;
	}
	public Color getColor() {
		return this.lastcolor;
	}

	@Override
	public void mouseDragged(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseMoved(MouseEvent arg0) {

		if(arg0 != null) {
			System.out.println("Hello here Iam");
		}	
	}

}
```

Ich hoffe jemand kann mir damit weiterhelfen.

Gruß
Christian


----------



## Marco13 (8. Okt 2008)

Offenbar ein grundlegendes Mißverständnis: Einen ChangeListener hängt man z.B. an einen JSLider - und wenn der Slider dann bewegt wird, werden alle ChangeListener benachrichtigt.

Du hast jetzt dafür gesorgt, dass dein DrawSquare ein ChangeListener IST. Du könntest als dein DrawSquare jetzt als ChangeListener an einen Slider hängen. Aber es gibt keinen Grund, warum man deinem DrawSquare einen ChangeListener hinzufügen (können) sollte.

_colorSquare.addChangeListener(this); //erkennt addChangeListener nicht!!! _

Das heißt so viel wie "Füge dem colorSquare einen ChangeListener hinzu - und zwar 'this'". Hm. Beschreib' ggf. mal was du erreichen wolltest.


----------



## DarkNight (8. Okt 2008)

Aha! Jetzt bin ich schon schlauer! Da war ich wohl am falschen Weg!

Ich bastle gerade eine kleine Anwendung die mir die aktuelle Farbe unter dem Mousezeiger zeigen soll. Die aktuelle Farbe sollte in diesem genannten DrawSquare dargestellt werden. 

Ich habe mir auch schon überlegt einen MouseMotionListener and das DrawSquare Objekt colorSquare anzuhängen, jedoch ist da das Problem, dass das Programm nur dann eine Mousebewegung erkennt wenn sie innerhalb des Anwendungsfensters sich bewegt. Da ich aber am gesamten Desktop (2 Screens) die Farben haben will, auch ausserhalb der Anwendung, funktioniert das mit MousMotionListener nicht.

Wie kann ich dieses colorSquare updaten, sodass es mir immer die aktuelle Farbe unter dem Mousezeiger darstellt?

Ich hoffe das war so halbwegs verständlich  


Gruß
Christian


----------



## Marco13 (8. Okt 2008)

Naja, das ist ja ein etwas fundamentaleres Problem. WENN du erstmal "irgendwoher" (magisch) an die Farbe rangekommen bist, rufst du einfach von DORT aus sowas wie 
colorSquare.setCurrentColor(color);
auf, die halt einfach sowas macht wie

```
public void setCurrentColor(Color c) {
    this.color = c;   
    repaint();
}
```

Das Problem ist, dass man nicht mitbekommt, was außerhalb des Fenster passiert. Also, egal wo du deinen MouseMotionListener dranhängst: Er wird nicht mehr über Mausbewegungen informiert, sobald die Maus den JFrame deiner Anwendung verlassen hat. Die einzige Möglichkeit, die mir jetzt einfallen würde, wäre, in einem eigenen Thread ständig mit http://java.sun.com/j2se/1.5.0/docs/api/java/awt/PointerInfo.html die aktuelle Mausposition abzufragen, und mit http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Robot.html#getPixelColor(int,%20int) die Farbe an dieser Stelle zu bestimmen - das würde vermutlich gehen.... würde ein bißchen krampfig wirken :? ...  aber eine Alternative wüßte ich spontan garnicht....


----------



## DarkNight (8. Okt 2008)

Also die Farben bekomm ich! So wie du es beschrieben hast. Mein Problem ist nur dieses Update des Rechtecks.

Ich glaube für heute ist genug... ich werds morgen noch mal probieren..

Gruß
Christian


----------

