Re[3]: синхронизацию UI
От: Аноним  
Дата: 06.09.04 13:57
Оценка:
Здравствуйте, achmed, Вы писали:

A>Здравствуйте, Lucker, Вы писали:


L>>javax.swing.Action и для твоей задачи setEnabled(boolean b) рулит!


A>вот проблема в том тои была, что я не мог понять как это сделать при помощи Action,

A>и сейчас не понимаю, если надо навесить на кнопку или элемент меню какое-то действие,
A>то с Action все понятно (это воплощение паттерна command).
A>Но я же написал, что кнопки у меня JToggleButton JCheckBoxMenu, у них есть состояния
A>(видимые для пользователя) нажатая и не нажатая, setEnabled(boolean b) просто отключает
A>событие, и выключаются соотв. элементы управления, а мне не нужна синхронизация состояния
A>нажатия (checked). setEnabled(boolean b) в данной ситуации не подходит

A>Здравствуйте, Аноним, Вы писали:


А>>Правильно, что не нравится

А>>Смотри в сторону javax.swing.Action ,
А>>а самое главное в сторону паттерна Mediator

A>паттерны это конечно корошо, некоторые реализованы в swing, но

A>неужели придется руками прописывать зависимости между элементами
A>управления, а я то наивно надеялся ,что в swing это элегантно
A>реализовано, помнится даже в MFC это автоматом делалось (в частности
A>между тулбапром и меню, надо было только иднтификаторы одинаковые поставить)

Извини, если под вечер не совсем правильно тебя понял, но ...проще код в студию




StateAction action = ...

JCheckBoxMenuItem cbm_item = new JCheckBoxMenuItem (action);
new StateActionAbstractButtonMediator (action, cbm_item);
 
JToggleButton tb_item = new JToggleButton (aAction);
new StateActionAbstractButtonMediator (action, tb_item);


То есть: Создаешь шаримый экшн, и два медиатора на виз.элемент.
При смене состояния
action.setSelected (...)

будет файрится евент о смене значения проперти, и его поймает соответсвующий медиатр, который и сменит состояние виз.элемента

Конечно трудно сразу понять, но нарисуй сиквенс-диаграммку и все поймешь

ЗЫ: А вообще, лучше сразу ActionFramework писать (или юзать чужой)




/*
 * StateAction.java
 *
 * Created on 21 Апрель 2004 г., 20:00
 */
package com.rsn.swing.action;

/**
 *
 * @author  SergeyRy
 */

import javax.swing.*;
import java.awt.event.ActionEvent;


public class StateAction extends AbstractAction {

    public static final String SELECTED = "selected";
    boolean selected = false;

    public StateAction () {
        this (null);
    }

    public StateAction (String aName) {
        this (aName, null);
    }

    public StateAction (String aName, Icon aIcon) {
        super (aName, aIcon);
    }

    public StateAction (boolean aSelected) {
        this (null, aSelected);
    }

    public StateAction (String name, boolean aSelected) {
        this (name, null, aSelected);
    }

    public StateAction (String name, Icon icon, boolean aSelected) {
        super (name, icon);
        setSelected (aSelected);
    }


    public boolean isSelected () {
        return selected;
    }


    public void setSelected (boolean aSelected) {
        if (selected != aSelected) {
            boolean old = selected;
            selected = aSelected;
            firePropertyChange (SELECTED, Boolean.valueOf (old), Boolean.valueOf (selected));
        }
    }

    /**
     * Invoked when an action occurs.
     */
    public void actionPerformed (ActionEvent e) {
        setSelected (!isSelected ());
    }


}






package com.rsn.swing.action;

import javax.swing.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.lang.ref.SoftReference;

/**
 * Created by IntelliJ IDEA.
 * User: SergeyRy
 * Date: 27.04.2004
 * Time: 19:53:36
 * To change this template use File | Settings | File Templates.
 */
public class StateActionAbstractButtonMediator implements PropertyChangeListener {

    private SoftReference button;

    /**
     * Creates a new instance of StateActionAbstractButtonMediator.
     *
     * @param aAction the <code>StateAction</code> to be connected
     * @param aButton the <code>AbstractButten</code> to be connected
     */
    public StateActionAbstractButtonMediator (StateAction aAction, AbstractButton aButton) {
        button = new SoftReference (aButton);
        aAction.addPropertyChangeListener (this);
        aButton.setSelected (aAction.isSelected ());
    }

    /**
     * Implementation of <code>propertyChange()</code> in
     * <code>PropertyChangeListener</code>
     *
     * @param pce the PropertyChangeEvent to be processed
     */
    public void propertyChange (PropertyChangeEvent pce) {
        if (StateAction.SELECTED.equals (pce.getPropertyName ())) {
            Boolean newValue = (Boolean) pce.getNewValue ();
            ((AbstractButton) button.get ()).setSelected (newValue.booleanValue ());
        }
    }

}



WBR,
Сергей Рыжков
Digital Design
(rijkov на mail.ru)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.