event weiterleitung an übergeordnete klasse

Status
Nicht offen für weitere Antworten.

vidi

Aktives Mitglied
hi leute!
habe ein kleines problem mit meinen events.
ich habe mir eine combobox nachgebaut, die klasse erbt von jcomponent und ihr inhalt bestehend aus einem jtextfield und einer jlist (befindet sich in einem jsrollpane).
das eventhandling innerhalb dieser klasse funktioniert auch. sprich man klickt auf einen eintrag in der list und der wandert dann hoch ins textfeld.

da ich in meinem programm gui und "verarbeitung" (die zurzeit nur aus eventlistenern besteht) getrennt habe, sie die konstellation wie folgt aus:

SteuerungsKlasse -> erzeugt eine instanz der "verarbeitungsklasse(diese implementiert die listener) und danach erzeugt sie eine instanz der gui klasse und übergibt dem konstruktor die eventlistener.

in der gui klasse befindet sich meine "combobox".

was muss ich jetzt machen damit meine verarbeitungsklasse mitbekommt das in der "combobox" z.b. jemand auf das textfeld meiner "combobox" geklickt hat?? mit der standart combobox geht das ja schließlich auch 🙂. ich müsste doch jetzt eigendlich die events die bei dem textfeld der "combobox" auftreten an die events der "combobox" umleiten oder? ich steh mir grade selber ziemlich auf dem schlauch..bin über jede hilfe dankbar!

greetz

ben
 
Das versteh' ich jetzt nicht: Wenn die "Verarbeitungsklasse" die Listener implementiert, dann sollte die bei den entsprechenden Komponenten, welche die Ereignisse werfen, angemeldet werden und über neue Events vom Subjekt (-->Observer Pattern) benachrichtigt werden. Das isses doch was du willst, oder?
 
hmm..sry das es vieleicht nicht ganz eindeutig ist..was genau meinst du mit anmelden bei der componente..? oberflächen geschichten sind noch relative neuland für mich.. danke für deine hilfe..
 
meinst du das ich die listener im konstruktor der komponente mit übergeben soll..? weil da hab ich auch schon dran gedacht..aber das brauch ich ja z.b. bei ner normalen combobox auch nicht..also kann das doch nicht der richtige weg sein oder..?
 
Kein Problem 🙂

Mit anmelden meine ich sowas in der Art:
Code:
this.fSolveButton.addActionListener(new SolveListener());
Wobei die Klasse SolveListener das Interface ActionListener implementiert. Das bedeutet, dass bei jedem Klick auf fSolveButton die Methode actionPerformed(...) von SolveListener aufgerufen wird. SolveListener meldet sozusagen ihr Interesse an auftretenden Events beim fSolveButton an 🙂.
 
hmm..funktioniert so wie ich das hier hab mal nicht..
wieso verhält sich meine componente denn nicht so wie jede andere..? das "registrieren" muss ich doch bei nem textfeld oder so auch nicht machen..?!? da sag ich doch einfach addactionlistene(meinlistener) und dann lüppt das..
 
das "registrieren" muss ich doch bei nem textfeld oder so auch nicht machen..?!? da sag ich doch einfach addactionlistene(meinlistener) und dann lüppt das..
addActionListener() mein ich ja mit registrieren...

Zeig bidde mal Ausschnitte aus den relevanten Klassen.
 
Die ComboBox
Code:
public class myComboBox extends JComponent implements MouseListener
{
    JTextField textfield = new JTextField();
    DefaultListModel listModel = new DefaultListModel();
    JList list = new JList(listModel);
    JScrollPane dropdown = new JScrollPane(list);
       
    public myComboBox(int columns)
    { 	
    	setVisible(true);
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        setOpaque(false);
        
        textfield.setColumns(columns);
        textfield.addActionListener(new dialog_steuerung());
        
        list.setVisibleRowCount(4);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        list.addMouseListener(this);    
        
        dropdown.setVisible(false);
        
        add(textfield);
        add(dropdown);
        
    } 

    ...

    public synchronized void addActionListener(ActionListener al) 
    {
        listenerList.add(ActionListener.class, al);
    }
    
    public synchronized void addMouseListener(MouseListener ml) 
    {
        listenerList.add(MouseListener.class, ml);
    }

    public synchronized void addKeyListener(KeyListener kl) 
    {
        listenerList.add(KeyListener.class,kl);
    }
    

    ...

Die Event Steuerung

Code:
public class dialog_steuerung implements KeyListener, ActionListener, MouseListener
{	
public void actionPerformed(ActionEvent evt)
    {
	System.out.println("ACTION-EVENT!!!!!");			
    }
	
    public void keyPressed(KeyEvent evt)
    {
    	System.out.println("KEY-EVENT!!!!!!");
    }

    ...

Die GUI Klasse

Code:
public class gui extends JFrame
{

	JPanel masterPanel = new JPanel();
		
	myComboBox mycom = new myComboBox(14);
		
	public gui(KeyListener kl, ActionListener al, MouseListener ml)
	{

		super("Dialog");
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
	
		...

                mycom.setDocument(new SetTextFieldProperty(4, false, true));
    		mycom.addKeyListener(kl);
    	    
                ...
    			
         }  

}

Die Hauptklasse

Code:
public class meinprog
{
   public static void main(String[] args)
   {
      dialog_steuerung  ds = new dialog_steuerung();
      gui mygui = new gui(cmd, cmd, cmd);
   }
}

Hoffe dir reichen die auszüge..
und wenn das völliger mumpiz ist was ich da mach, sags bitte 🙂 ich wills ja lernen wies richtig geht, hab halt bishher nie was mit oo zutun gehabt ;-)
 
wohoow! jop, da haste einige Konzepte vermischt 😉.

1. (nur so am Rande) In Java ist es Konvention, Klassen mit einem Grossbuchstaben zu beginnen.

2. Wenn du GUI und Eventhandling trennen willst, dann sollte MyComboBox keinen MouseListener implementieren und die add-Methoden müssen in diesem Fall auch nicht überschrieben werden.
Wenn du nun nur DialogSteuerung für die Behandlung einsetzten willst und diese beispielsweise auf Mouse-Events kommend von list aus MyComboBox reagieren soll, dann musst du DialogSteuerung folgendermassen bei der list anmelden:
Code:
list.addMouseListener(new DialogSteuerung());
Fürs Verständnis: Wenn ich nun in die Liste klicke, dann wird list den dadurch gefeuerten MouseEvent an die Instanz von DialogSteuerung leiten, genauer an eine der Methoden vom Interface MouseListener (mousePressed(), mouseClicked() usw.).

Bevor ich fortfahre: Schreibe bitte, welche GUI-Komponente auf welche Ereignisse (Key, Mouse etc) reagieren soll.
 
zu 1. das hab ich auch, hab das nur umgeändert fürs verständnis.. 🙂

zu 2. habe den mouse listener nur implementiert weil das etwas ist was die combobox immer machen soll(in der liste was auswählen und im textfeld dann anzeigen)
das event um das es sich bei mir dreht ist z.b. ein keyevent im textfeld meiner combobox(ich möchte dann die liste aufgrund der eingabe verkleinern). dieses event soll dann zur steuerungs klasse gefeuert werden.. nochmal zusammengefasst, (die steuerungsklase soll mitbekommen wenn sich im textfield meiner combobox was tut.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben