Action



  • Hallo leute,

    ich habe ein kleines Problem. Es gibt zwei Komponenten, die das gleiche zu tun haben - nämlich ein Fenster schließen. Daher erzeuge ich diese mit dem Konstruktor "Konstruktor(Action a)", somit soll beim auslösen eines actionevents die gleiche actionPerformed()-Methode ausgeführt werden. Es schaut zwar komisch aus, habe vorläufig aber keine andere Idee als die zu behandelnde Komponente im Konstruktor zu übergeben (siehe unten). Außerdem sollen die registrierenden Komponenten (also JCheckBoxMenuItem und Closer) nicht nur das gleiche tun, sonder sich einander beeinflussen. Das Problem: wenn die Instanz der Klasse Closer angeklickt wird, muss sich der Status vom Objekt der Klasse JCheckBoxMenuItem ändern (ich meine aber nicht setStatus(false) der Klasse AbstractAction!) --> nämlich das Häckchen verschwinden. Ich habe leider keine Methode gefunden, die mir alle die AbstractAction-registrierende Objekte zurückliefert. Ich möchte aber gerne das Verhalten auf diese Weise zentralisieren (also nicht wie auf übliche Weise Interfaces implementieren -->Redundanz).
    Hier ist die Actionklasse:

    class JMenuItemAction extends AbstractAction {
    	private JComponent comp;   /*die zu behandelnde Komponente*/
    
    	public JMenuItemAction(String text, JComponent comp) {
    		super(text);
    		this.comp = comp;
    
    		/*Verhalten hinzufügen*/
    		putValue(SHORT_DESCRIPTION, "Statusfenster schließen");
    		putValue(MNEMONIC_KEY, new Integer(KeyEvent.VK_S));
    	}
    
    	public void actionPerformed(ActionEvent ae) {
    		String className = ae.getSource().getClass().getName();
    
    		if(className.equals("javax.swing.JCheckBoxMenuItem")) {
    			JCheckBoxMenuItem obj = (JCheckBoxMenuItem) ae.getSource();
    			onOffSwitch(obj.isSelected() ? true : false);
    		} else
    		if(className.equals("gui.Closer")) {
    			onOffSwitch(false);
                               /*
    
                               hier sollte noch am JCheckBoxMenuItem-Objekt was geändert werden !!!
                               */
    
    		}
    
    		System.out.println("actionPerformed: " + ae.getSource().getClass().getName());
    	}
    
    	public void onOffSwitch(boolean visible) {
      	    JComponent jc = comp;
    		while(jc != null) {
    			jc = (JComponent) jc.getParent();
    			if(jc.getClass().getName().equals("gui.Content4PopUpWindow")) {
    				jc.setVisible(visible);
    			  	break;
    		  	}
    		}
    	}
    }
    

    danke kati



  • Hmm da werden wohl Anforderungen ausgeschlossen? Auf der einen Seite frägst du ab, ob die Komponente eine JCheckBoxMenuItem ist und machst etwas. Der else-Zweig (der ja nur aufgerufen wird, wenn das übergebene Objekt nicht vom Typ JCheckBoxMenuItem ist) soll aber nun doch auf ein JCheckBoxMenuItem zugreifen? Ich frage mich auf welches?



  • CengizS schrieb:

    Der else-Zweig (der ja nur aufgerufen wird, wenn das übergebene Objekt nicht vom Typ JCheckBoxMenuItem ist) soll aber nun doch auf ein JCheckBoxMenuItem zugreifen? Ich frage mich auf welches?

    neeeeein es steht doch dort:

    else if(className.equals("gui.Closer")) { 
                onOffSwitch(false); 
                               /* 
    
                               hier sollte noch am JCheckBoxMenuItem-Objekt was geändert werden !!! 
                               */ 
            }
    

    Der 2. mögliche Auslöser ist doch eine Instanz von gui.Closer ! Und hier sollte es auf die Instanz JCheckBoxMenuItem zugegriffen werden... aber wie am besten ? Darum gehts...
    Also nochmal:
    1. ) die zu behandelnde Komponente (d.h. wenn ein Event ausgelöst wird, soll irgendetwas mit dieser angestellt werden) ist vom Typ gui.Closer
    2. ) die behandelnde (und daher jene, die Action registriert, z.B. per setAcion()) Komponente ist AUCH vom Typ gui.Closer
    3. ) die 2. behandelnde Komponente ist vom Typ JCheckBoxListItem.

    Die Komponenten im Punkt 2. und 3. tun das gleiche. Sie sollen ein Parentfenster (nämlich ein JPanel) ausblenden, wenn 1. angeklickt wird.

    Ich hoffe es halbwegs klar formuliert zu haben. ... Es geht mir hauptsächlich darum, dass der Ansatz für diese Problemstellung gut ist...


Log in to reply