Observer update

yugox

Mitglied
Ich habe ein Mouseoverevent, einmal auf JButtons und einmal auf JTextFields, aber ich weiß nicht genug wie man das anstellt, dass nur das geupdated wird, was auch gerade benötigt wird. Irgendwie passiert beim JTextField nicht.

GUI hier befindet sich der Observer:

Java:
    @Override
    public void update(Observable o, Object arg) {
        if(o instanceof Effects)
        {
            switch((((Effects)arg).getCurrentJButton()).getName())
            {
            case "Eventbutton":
                (((Effects)arg).getCurrentJButton()).setBackground((((Effects)arg).getJButtonBackgroundColor()));
                (((Effects)arg).getCurrentJButton()).setForeground((((Effects)arg).getJButtonForegroundColor()));

                break;
            case "Eventtextfields":   
                (((Effects)arg).getCurrentJTextField()).setBackground((((Effects)arg).getJButtonBackgroundColor()));
                (((Effects)arg).getCurrentJTextField()).setForeground((((Effects)arg).getJButtonForegroundColor()));
                (((Effects)arg).getCurrentJTextField()).setText((((Effects)arg).getPseudoText()));
                System.out.println("Test");
                break;
            }
        }
       
    }

Controller:
Java:
public class Controller implements ActionListener, MouseListener {

    private Model model;
    private Effects effects;
    private GUI view;
   
    public Controller()
    {

/************************************************************************************************************************
* CREATE VIEW.
/************************************************************************************************************************/
        view = new GUI(this);
        view.setVisible(true);

/************************************************************************************************************************
* ADD MODEL VIEW.
/************************************************************************************************************************/
        model = new Model();
        effects = new Effects();
        model.addObserver(this.view);
        effects.addObserver(this.view);
   
   
/************************************************************************************************************************
* SETTINGS ARRAY OBJECTS.
/************************************************************************************************************************/
        for( Object btns : view.getButtons())
        {
            ((JButton) btns).addMouseListener(this);
            ((JButton) btns).addActionListener(this);
            ((JButton) btns).setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
            ((JButton) btns).setBackground(new Color(60,60,60));
            ((JButton) btns).setBorder(null);
            ((JButton) btns).setForeground(Color.WHITE);
            ((JButton) btns).setDefaultCapable(false);
            ((JButton) btns).setFocusPainted(false);
            ((JButton) btns).setBorderPainted(false);
            ((JButton) btns).setFocusTraversalKeysEnabled(false);
            ((JButton) btns).setName("Eventbutton");
        }
               
        for( Object textfields : view.getTextfields())
        {
            ((JTextField) textfields).setName("Eventtextfields");
            ((JTextField) textfields).addMouseListener(this);
            ((JTextField) textfields).addActionListener(this);
        }
           
    }
   
    @Override
    public void mouseClicked(MouseEvent me) {
       
       
    }

    @Override
    public void mouseEntered(MouseEvent me)
    {
        switch(((Component) me.getSource()).getName())
        {
        case "Eventbutton":
            effects.mouseHoverEffect("entered", (JButton) me.getSource());
            break;
        case "Eventtextfields":
            effects.jfieldHoverEffect("entered", (JTextField) me.getSource());
            break;
        }
    }
   
    @Override
    public void mouseExited(MouseEvent me)
    {
        switch(((Component) me.getSource()).getName())
        {
        case "Eventbutton":
            effects.mouseHoverEffect("exited",(JButton) me.getSource());
            break;
        case "Eventtextfields":
            effects.jfieldHoverEffect("exited", (JTextField) me.getSource());
            break;
        }

    }


Das Effectmodel:
Java:
public class Effects extends Observable {

    private Color JButtonBackgroundColor;
    private Color JButtonForegroundColor;
    private Color JTextFieldBackgroundColor;
    private Color JTextFieldForegroundColor;
    private String pseudoText;
    private JButton button = null;
    private JTextField field;
   
    public void mouseHoverEffect(String value, JButton button)
    {
        if(value == "entered")
        {
            this.button = button;
            this.JButtonBackgroundColor = new Color(240,240,240);
            this.JButtonForegroundColor = new Color(60,60,60);
        }
        if(value == "exited")
        {
            this.button = button;
            this.JButtonBackgroundColor = new Color(60,60,60);
            this.JButtonForegroundColor = new Color(255,255,255);
        }
        setChanged();
        notifyObservers(this);   
    }
   
    public void jfieldClickEffect(JTextField field)
    {
            this.field = field;
            this.pseudoText = "";
           
            setChanged();
            notifyObservers(this);   
    }
   
    public void jfieldHoverEffect(String value, JTextField field)
    {
        if(value == "entered")
        {
            this.field = field;
            this.JTextFieldBackgroundColor = new Color(255,255,255);
            this.JTextFieldForegroundColor = new Color(70,70,70);
            System.out.println("TTTT");
        }
        if(value == "exited")
        {
            this.field = field;
            this.JTextFieldBackgroundColor = new Color(70,70,70);
            this.JTextFieldForegroundColor = new Color(255,255,255);
        }
        setChanged();
        notifyObservers(this);   
    }
   
    public Color getJButtonBackgroundColor() {
        return JButtonBackgroundColor;
    }

    public Color getJButtonForegroundColor() {
        return JButtonForegroundColor;
    }
   
    public Color getJTextFieldBackgroundColor() {
        return JButtonBackgroundColor;
    }

    public Color getJTextFieldForegroundColor() {
        return JButtonForegroundColor;
    }
   
    public JButton getCurrentJButton() {
        return button;
    }
   
    public String getPseudoText() {
        return pseudoText;
    }

    public JTextField getCurrentJTextField() {
        return field;
    }
   
}

Was mache ich falsch, bzw. übersehe ich?
 
Hab meinen Fehler gefunden 😱 Würde mich aber dennoch darüber freuen falls jemanden einen Vorschlag hätte wie man das mit den Events besser lösen könnte als das switch case verfahren! 🙂
 
Als erstes solltest du dir unbedingt abgewöhnen strings mit == zu vergleichen. Sonst rennst du irgendwann in einen Fehler den du im Leben nicht debugged bekommst.

Ansonsten ist das mit dem Switch doch in Ordnung. Irgendwo musst du die Unterscheidung ja machen. Du kannst diese natürlich auch in die Effektklasse verlagern und dort eine Methode doEffect(me.getSource()) aufrufen, die dann in der Effektklasse entscheidet was für eine Component das ist und wie du sie behandeln willst.

Der sauberste weg wäre natürlich das komplett ohne Effektklasse zu machen und den Effekt in das Component selber zu verlagern indem du deine eigenen EffektTextField und EffektButton Klassen schreibst die sich dann automatisch wie gewünscht verhalten.

Gruß

Claus
 

Neue Themen


Zurück
Oben