Eigenes Event

Status
Nicht offen für weitere Antworten.

Clip

Bekanntes Mitglied
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

Mitglied
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

Top Contributor
Du machst im Hauptprogramm einen Mouselistener für MyEntryField:
Code:
      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(..)":
Code:
       label.addMouseListener(new MouseAdapter(){
           public void mouseClicked(MouseEvent e){
               dispatchEvent(e);
           }
        });
 

Clip

Bekanntes Mitglied
Super, vielen Dank!

Ich habe das ganze noch durch ein
Code:
		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.
 

Clip

Bekanntes Mitglied
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

Bekanntes Mitglied
ums noch sauberer zu machen kannst du eigene listener und events definieren:
Code:
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:

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

Clip

Bekanntes Mitglied
@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.
Code:
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

Bekanntes Mitglied
wie folgt habe ich es hinbekommen (jeweils in einer Datei):
Code:
import java.util.EventListener;

public interface TiteledEntryFieldListener extends EventListener
{
  public void headerClick( TiteledEntryFieldEvent e );
}
Code:
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"

Code:
  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":
Code:
			TitelText.addMouseListener(new java.awt.event.MouseAdapter() {
				public void mouseClicked(java.awt.event.MouseEvent e) {
					notifyHeaderClick(new TiteledEntryFieldEvent(this, getName()));
				}
			});

in der Applikation:
Code:
tableEntrys.addHeaderClickListener(mainController);

vielen Dank für eure Hilfe!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Minimalestopuhr: JLabel.setText() durch eigenes Event ändern AWT, Swing, JavaFX & SWT 6
H LayoutManager RPG Programmieren, eigenes Spielfeld grafisch generieren aus Tileset AWT, Swing, JavaFX & SWT 18
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
M Swing JComboBox eigenes Design AWT, Swing, JavaFX & SWT 3
L LookAndFeel Eigenes Design für die Applikation AWT, Swing, JavaFX & SWT 4
L JavaFX als eigenes Objekt AWT, Swing, JavaFX & SWT 3
M Plugin oder eigenes Tool mit zB SWING AWT, Swing, JavaFX & SWT 2
E Eigenes TableModel für ArrayList<String[]> AWT, Swing, JavaFX & SWT 5
N LookAndFeel Wie kann ich mein eigenes LookAndFeel machen? AWT, Swing, JavaFX & SWT 6
1 Eigenes Layout schreiben AWT, Swing, JavaFX & SWT 4
J Eigenes Gui/ Look and Feel AWT, Swing, JavaFX & SWT 14
D Eigenes Textfeld AWT, Swing, JavaFX & SWT 8
C Eigenes Hintergrundbild einfügen AWT, Swing, JavaFX & SWT 6
M Eigenes Panel aus Component? AWT, Swing, JavaFX & SWT 5
3 Eigenes Frame/Window programmieren AWT, Swing, JavaFX & SWT 2
F LayoutManager Eigenes Layout die Lösung?! AWT, Swing, JavaFX & SWT 4
P Eigenes Textverarbeitungsprogramm AWT, Swing, JavaFX & SWT 4
R [JTree/DefaultTreeCellRenderer] eigenes Renderer-Panel, so breit wie der JTree AWT, Swing, JavaFX & SWT 2
Developer_X LookAndFeel Eigenes Look And Feel erstellen AWT, Swing, JavaFX & SWT 33
B SWT Eigenes Icon für CheckboxTreeViewer AWT, Swing, JavaFX & SWT 3
KrokoDiehl Swing Design-Frage: eigenes Line-Wrapping AWT, Swing, JavaFX & SWT 5
M Swing eigenes StyledDocument AWT, Swing, JavaFX & SWT 2
D eigenes Tablemodel, Zeile löschen ArrayindexOOB excp AWT, Swing, JavaFX & SWT 4
S JTree mit Daten aus Model füllen, eigenes TreeModel (gute Dokumentation des Problems) AWT, Swing, JavaFX & SWT 2
P Eigenes TableModel abgeleitet von AbstractTableModel (neue rows nicht sichtbar) AWT, Swing, JavaFX & SWT 6
M Eigenes ActionEvent / Eigener Listener AWT, Swing, JavaFX & SWT 2
A JTable, eigenes TableModel und dessen Objekte AWT, Swing, JavaFX & SWT 4
G JToolbar gleich als eigenes Fenster öffnen AWT, Swing, JavaFX & SWT 2
G Eigenes ComboBoxModel AWT, Swing, JavaFX & SWT 2
M eigenes DialogFenster AWT, Swing, JavaFX & SWT 4
L Button ändert eigenes Bild und Progressbar-Value nicht AWT, Swing, JavaFX & SWT 6
J eigenes JOptionPane ? AWT, Swing, JavaFX & SWT 2
D Eigenes Tooltip AWT, Swing, JavaFX & SWT 5
G eigenes option pane AWT, Swing, JavaFX & SWT 5
S Eigenes Package für die GUI? AWT, Swing, JavaFX & SWT 6
P Eigenes Look&Feel schreiben (Tutorials?) AWT, Swing, JavaFX & SWT 6
B Eigenes Events AWT, Swing, JavaFX & SWT 3
G für showInputDialog kein eigenes Icon auswählen AWT, Swing, JavaFX & SWT 6
M JDialog und eigenes Icon AWT, Swing, JavaFX & SWT 10
Juelin in javafx Event auslösen AWT, Swing, JavaFX & SWT 4
G Mouse Event in anderemm Event auslösen AWT, Swing, JavaFX & SWT 50
schoel27 Mehrere JButtons sollen das gleiche Event auslösen AWT, Swing, JavaFX & SWT 2
K Warum genau hat man einen Listener, dann ein Event und was ist ein Adapter AWT, Swing, JavaFX & SWT 2
izoards Java FX Window Event SHOWING AWT, Swing, JavaFX & SWT 17
Fridolin111 Der KeyListener Löst kein event aus AWT, Swing, JavaFX & SWT 6
B JavaFX Von welcher Klasse und zu welchem Zeitpunkt werden Event-Objekte erstellt? AWT, Swing, JavaFX & SWT 3
L JavaFX Ich suche das passende Textfield Event AWT, Swing, JavaFX & SWT 1
J CheckBoxListCell auf click event in listView reagieren AWT, Swing, JavaFX & SWT 1
W JavaFX Etwas Tabellenartiges + Cell-Content-Changed-Event (o.ä.) AWT, Swing, JavaFX & SWT 30
O Swing Event Dispatch Thread AWT, Swing, JavaFX & SWT 1
B Swing Windowbuilder Rückgabewert im Event AWT, Swing, JavaFX & SWT 3
Z Befehl Action Event Verlassen AWT, Swing, JavaFX & SWT 4
F Event wenn Maus eine JList verlässt AWT, Swing, JavaFX & SWT 13
M JavaFX Absoluter Fokus während drag Event AWT, Swing, JavaFX & SWT 10
Pr0m3theus Animation nach Event AWT, Swing, JavaFX & SWT 6
K Event Handling ComboBox Event Handler AWT, Swing, JavaFX & SWT 7
Sugan Swipe Event? AWT, Swing, JavaFX & SWT 8
Tausendsassa Text changed event handler jTextField AWT, Swing, JavaFX & SWT 3
H Event Handling JavaFx - auf Event warten AWT, Swing, JavaFX & SWT 4
G Event Handling Event Handling in eigene Klasse AWT, Swing, JavaFX & SWT 4
M Mouse Click Event ohne ein JComponent Objekt AWT, Swing, JavaFX & SWT 3
L JDialog - Event wenn Parent größe ändert AWT, Swing, JavaFX & SWT 2
T Internes Event-handling in TextField/JTextField AWT, Swing, JavaFX & SWT 2
M Swing OnLoad-Event o. Ä. AWT, Swing, JavaFX & SWT 3
D Event Handling in Komplexen Anwendungen AWT, Swing, JavaFX & SWT 9
D Event Handling "Plötzlich" kein mouseMoved-Event AWT, Swing, JavaFX & SWT 2
J Swing JMenuItem-Event?? AWT, Swing, JavaFX & SWT 3
J Swing JTable-Event für einen Select?? AWT, Swing, JavaFX & SWT 3
A Mouse event und exit on close AWT, Swing, JavaFX & SWT 11
V Swing Custom JToggleButton in JTable - Click-Event geht erst beim zweiten Mal AWT, Swing, JavaFX & SWT 7
F Event Handling AWT, Swing, JavaFX & SWT 7
J Button Event nur einmal ausführen AWT, Swing, JavaFX & SWT 3
S SWT Shell durch Event in der Größe verändern AWT, Swing, JavaFX & SWT 7
J Speichern, Event, Hintergrund getAppletContext AWT, Swing, JavaFX & SWT 2
T Callback vs. Event listener AWT, Swing, JavaFX & SWT 7
F Frage zu Event KeyTyped bei jPanel AWT, Swing, JavaFX & SWT 4
S MenuBar ActionListener Event ... AWT, Swing, JavaFX & SWT 6
T Anzahl Event Listeners AWT, Swing, JavaFX & SWT 4
A Swing JButton int im Event AWT, Swing, JavaFX & SWT 9
G Swing Onkeyup Event AWT, Swing, JavaFX & SWT 3
P Action Event abfangen etwas anders? AWT, Swing, JavaFX & SWT 2
3 Swing NullPointerException in AW Event-0? AWT, Swing, JavaFX & SWT 5
F Swing Auf JComboBox-Event erst NACH Auswahl reagieren AWT, Swing, JavaFX & SWT 8
P Swing Event das ausgelöst wird, sobald Änderung der Größe Abgeschlossen ist AWT, Swing, JavaFX & SWT 4
A Shift-Tab-Event auslösen AWT, Swing, JavaFX & SWT 5
T Event Dispatch Thread und noch ein Thread AWT, Swing, JavaFX & SWT 7
W Swing Event bei Schließen des Fensters AWT, Swing, JavaFX & SWT 6
A Probleme mit dem KeyReleased-event AWT, Swing, JavaFX & SWT 3
J Doppelklick Event AWT, Swing, JavaFX & SWT 32
jueki Event bei Änderung der Spaltenbreite in einem JTable AWT, Swing, JavaFX & SWT 15
D jtabbedpane Event VOR tab-Wechsel AWT, Swing, JavaFX & SWT 3
N Swing JComboBox Event Problem AWT, Swing, JavaFX & SWT 5
M JTree => Event Dispatching Error AWT, Swing, JavaFX & SWT 2
D Event in Fenster ausgeben + Observer + kein Plan AWT, Swing, JavaFX & SWT 2
H warum kann ich das focus event nicht abfangen ? AWT, Swing, JavaFX & SWT 5
X Den Wert von JSpinner setzen ohne Event AWT, Swing, JavaFX & SWT 3
H KeyUp-Event/Ereignis AWT, Swing, JavaFX & SWT 6
C Event Frage AWT, Swing, JavaFX & SWT 7
M Swing WindowListener -> Event abbrechen? AWT, Swing, JavaFX & SWT 2
K JToggleButton deaktivieren (komplettes event nehmen) AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben