# Eigenes Event



## Clip (18. Nov 2005)

Hallo!

Ich habe eine Swing Klasse "MyEntryField" geschrieben. Dabei handelt es sich um ein Eingabefeld mit bestimmen Eigenschaften. U.a. einem Titelfeld mit Bild, und der Funktion das Eingabefeld zu vergrößern und zu verkleinern. Jetzt möchte ich in meiner Hauptapplikation ein Event auslösen wenn der Benutzer auf den Header meines Eingabefeldes klickt. In "MyEntryField" wird ein KLick auf den Header druch "mouseClicked()" Events auf drei Labeln abgefangen. Jetzt könnte ich natürlich in meiner Hauptapplikation einfach ebenfalls die Events anmelden und diese auswerten. Das finde ich aber reichlich unpraktisch, der Vorteil der Kapselung ginge klar verloren. Praktisch wäre, wenn ich jedesmal in der Klasse "MyEntryField" ein eigenes Event werfen könnte wenn jemand auf eines der drei Labels klickt, und dieses Event in der Hauptapplikation auswerten könnte.
Wie geht das?
Wie kann ich ein eigenes Event programmieren?

Vielen Dank!


----------



## nero (18. Nov 2005)

weiß nicht ob ich dich richtig verstanden hab, aber warum machst du nicht zur Hauptapplikation eine Methode hinzu, die du dann im Event einfach aufrufst


----------



## André Uhres (18. Nov 2005)

Du machst im Hauptprogramm einen Mouselistener für MyEntryField:

```
MyEntryField entryField = new MyEntryField();
       entryField.addMouseListener(new MouseAdapter(){
           public void mouseClicked(MouseEvent e){
               System.out.println("MyEntryField:  mouseClicked");
           }
        });
```
In der Klasse MyEntryField machst du in der Methode mouseClicked() einen "dispatchEvent(..)":

```
label.addMouseListener(new MouseAdapter(){
           public void mouseClicked(MouseEvent e){
               dispatchEvent(e);
           }
        });
```


----------



## Clip (18. Nov 2005)

Super, vielen Dank!

Ich habe das ganze noch durch ein 

```
e.setSource("headerclick");
		dispatchEvent(e);
```

erweitert, was ich dann in der Hauptapplikation abfragen kann. So kann ich unterscheiden, ob jemand in das Feld klickt, oder nur auf den Titel.


----------



## André Uhres (19. Nov 2005)

> So kann ich unterscheiden, ob jemand in das Feld klickt, oder nur auf den Titel.


Dies dürfte eigentlich nicht nötig sein, es sei denn du hast den MouseListener auch beim Feld angemeldet.


----------



## Clip (21. Nov 2005)

Ja, es gibt zwei unterschieldlche aktionen, je nach dem ob der Benutzer auf den Titel, oder das Feld klickt. Daher dachte ich auch zunächst daran einen wirklich eigenen Event zu schriebe. Also z.B. onHeaderCLick und onFieldClick oder etwas in der Art.


----------



## Jörg (24. Nov 2005)

ums noch sauberer zu machen kannst du eigene listener und events definieren:

```
public interface MyEntryFieldListener {
    public void handleTitleClick(MyEntryFieldEvent e);
    public void handleFieldClick(MyEntryFieldEvent e);
{

public MyEntryFieldEvent extends EventObject {
    public MyEntryFieldEvent(Object source){
        super(source);
    }
}
```

welche du dann ungefaehr so benutzen kannst:


```
...
mouseClicked(Event e){
   fireMyNewEvent(new MyEntryFieldEvent(e.getSource));
}
...
```


----------



## Clip (3. Feb 2006)

@Jörg:

Ich versuche gerade Deine Lösung zu verwirklichen. Leider hapert es (wohl) an meiner Unwissenheit. Wo/wie genau muss ich meine eigenen Events denn definieren?

Mein Klasse:
Im wesentlichen geht es darum, dass ich die blöde Implementierung von "headerclick" wegbekommen möchte.

```
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class TiteledEntryField extends JPanel {

	public JPanel Header = null;
	public JPanel Body = null;
	public JLabel TitelText = null;
	public JLabel TitelIcon = null;
	public JLabel iconField = null;
	private Dimension activeSize = this.getSize();
	private boolean isActive = true; 
	private ImageIcon icon = null;
	



	/**
	 * This is the default constructor
	 */
	public TiteledEntryField() {
		super();
		initialize();
	}
	
	public TiteledEntryField(ImageIcon icon) {
		super();		
		initialize();
		setIcon(icon);
	}	

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setLayout(null);		
		this.setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.gray,1));
		this.setComponentOrientation(java.awt.ComponentOrientation.LEFT_TO_RIGHT);
		this.add(getHeader(), null);
		this.add(getBody(), null);
		this.setSize(200, 120);
	}

	
	public void setIcon(ImageIcon icon) {
		this.icon = icon;
		if (Header != null)
			Header.add(getIconField(), java.awt.BorderLayout.WEST);
	}	
	
	/**
	 * This method initializes Header	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getHeader() {
		if (Header == null) {			
			Header = new JPanel();
			Header.setLayout(new BorderLayout());
			Header.setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.gray,1));
			Header.setPreferredSize(new java.awt.Dimension(14,20));
			Header.setToolTipText("Titel");
			Header.setBackground(new java.awt.Color(153,204,255));
			Header.setComponentOrientation(java.awt.ComponentOrientation.LEFT_TO_RIGHT);
			Header.setBounds(new java.awt.Rectangle(2,2,196,20));
			Header.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));											
			Header.add(getTitelText(), java.awt.BorderLayout.CENTER);
			Header.add(getTitelIcon(), java.awt.BorderLayout.EAST);
			
		}
		return Header;
	}

	/**
	 * This method initializes Body	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getBody() {
		if (Body == null) {
			FlowLayout flowLayout = new FlowLayout();
			flowLayout.setAlignment(java.awt.FlowLayout.LEFT);
			Body = new JPanel();
			Body.setBackground(java.awt.Color.white);
			Body.setBounds(new java.awt.Rectangle(2,22,196,96));
			Body.setLayout(flowLayout);
			Body.setComponentOrientation(java.awt.ComponentOrientation.LEFT_TO_RIGHT);
		}
		return Body;
	}
	
	private JLabel getTitelText(){
		if (TitelText == null){
			TitelText = new JLabel();
			TitelText.setText("Der Titel");
			TitelText.setFont(new java.awt.Font("Tahoma", java.awt.Font.BOLD, 11));			
			TitelText.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
			TitelText.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
			TitelText.setVerticalAlignment(javax.swing.SwingConstants.CENTER);
			TitelText.setVerticalTextPosition(javax.swing.SwingConstants.CENTER);
			TitelText.setComponentOrientation(java.awt.ComponentOrientation.LEFT_TO_RIGHT);			
			TitelText.addMouseListener(new java.awt.event.MouseAdapter() {
				public void mouseClicked(java.awt.event.MouseEvent e) {
					headerClick(e);
				}
			});
		}		
		return TitelText;
	}

	public JLabel getIconField() {
		if (iconField == null && this.icon != null){
			iconField = new JLabel();
			iconField.setIcon(this.icon);
			iconField.addMouseListener(new java.awt.event.MouseAdapter(){
				public void mouseClicked(java.awt.event.MouseEvent e){
					headerClick(e);
				}
			});
		}
		return iconField;
	}	
	
	private JLabel getTitelIcon(){
		if (TitelIcon == null){
			TitelIcon = new JLabel(new ImageIcon("pic/window_fullscreen.png"));
			TitelIcon.setFont(new java.awt.Font("Tahoma", java.awt.Font.BOLD, 11));			
			TitelIcon.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
			TitelIcon.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
			TitelIcon.setVerticalAlignment(javax.swing.SwingConstants.CENTER);
			TitelIcon.setVerticalTextPosition(javax.swing.SwingConstants.CENTER);
			TitelIcon.setToolTipText("Eingabefeld einklappen");
			TitelIcon.setComponentOrientation(java.awt.ComponentOrientation.LEFT_TO_RIGHT);

			TitelIcon.addMouseListener(new java.awt.event.MouseAdapter() {
				public void mouseClicked(java.awt.event.MouseEvent e) {
					headerClick(e);
				}
			});
		}		
		return TitelIcon;
	}	
	
	
	protected void setActive(){
		if (!isActive()){
			isActive = true;		
			this.Body.setBackground(java.awt.Color.white);		
			this.setPreferredSize(activeSize);
			this.setSize(activeSize);
			this.Body.setVisible(true);		
			this.TitelIcon.setIcon(new ImageIcon("pic/window_fullscreen.png"));
			this.TitelIcon.setToolTipText("Eingabefeld einklappen");
		}
	}
	
	protected void setInactive(){		
		if (isActive()){			
			isActive = false;
			this.Body.setBackground(new java.awt.Color(245, 245, 245));
			this.Body.setVisible(false);
			activeSize = this.getSize();
			this.setPreferredSize(new Dimension(this.Header.getSize().width + 4, this.Header.getSize().height + 4));
			this.setSize(new Dimension(this.Header.getSize().width + 4, this.Header.getSize().height + 4));		
			this.TitelIcon.setIcon(new ImageIcon("pic/window_nofullscreen.png"));
			this.TitelIcon.setToolTipText("Eingabefeld ausklappen");
			
		}
	}

	public void setSize(Dimension d){
		setSize(d.width, d.width);		
	}	
	
	public void setSize(int width, int height){
		super.setSize(width, height);	
		
		this.Body.setSize(width, (height - 20));		
		this.Body.setBounds(new java.awt.Rectangle(2,22,(width - 4),(height - 24)));
		
	}
	
	public void headerClick(java.awt.event.MouseEvent e){
		if (isActive()) this.setInactive();
		else this.setActive();
		e.setSource("headerclick");
		dispatchEvent(e);
	}
	
	public boolean isActive() {
		return isActive;
	}	
		
}
```


----------



## Clip (6. Feb 2006)

wie folgt habe ich es hinbekommen (jeweils in einer Datei):

```
import java.util.EventListener;

public interface TiteledEntryFieldListener extends EventListener
{
  public void headerClick( TiteledEntryFieldEvent e );
}
```


```
import java.util.EventListener;
import java.util.EventObject;

public class TiteledEntryFieldEvent extends EventObject
{
  String name;
  public TiteledEntryFieldEvent( Object source, String name){
    super( source );
    this.name = name;
  }
  
  public String getName(){
	  return name;
  }
}
```

in der Klasse "TiteledEntryField"


```
public void addHeaderClickListener( TiteledEntryFieldListener listener ) {
	    listeners.add( TiteledEntryFieldListener.class, listener );
	  }
	  public void removeHeaderClickListener( TiteledEntryFieldListener listener ) {
	    listeners.remove( TiteledEntryFieldListener.class, listener );
	  }
	  protected synchronized void notifyHeaderClick( TiteledEntryFieldEvent e )
	  {
	    for ( TiteledEntryFieldListener l : listeners.getListeners(TiteledEntryFieldListener.class) )
	      l.headerClick(e);
	  }
```

aufruf in der Klasse "TiteledEntryField":

```
TitelText.addMouseListener(new java.awt.event.MouseAdapter() {
				public void mouseClicked(java.awt.event.MouseEvent e) {
					notifyHeaderClick(new TiteledEntryFieldEvent(this, getName()));
				}
			});
```

in der Applikation:

```
tableEntrys.addHeaderClickListener(mainController);
```

vielen Dank für eure Hilfe!


----------

