Re[5]: синхронизацию UI
От: SergeyRizhkov Россия  
Дата: 06.09.04 14:48
Оценка: 2 (1)
Здравствуйте, achmed, Вы писали:

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


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

A>[...]
A>Спасибо, вот теперь понятно, хотя я надеялся что это уже есть

Вообще-то этого и не должно быть, ИМХО, так как setSelected и прочие методы,свойственные UI уже не имеют отношения к Command pattern и соответсвенно к Action. Да и вообще всего не затолкаешь

A>что за библиотека ?


Да вот когда есть время набрасываю Конечно код я привел из фреймворка, в данном твоем случае можно и проще (и понятнее) сделать, но уж сам решай

Надеюсь, помог. Если есть вопросы, то лучше уже мылом.


WBR,
Сергей Рыжков,
Digital Design,
(rijkov на mail.ru)
синхронизацию UI
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 06.09.04 11:48
Оценка:
Здравствуйте!
Вот наталкнулся на такую проблему, есть у меня в UI пара кнопок, одна тулбаре (JToggleButton), другая
в меню (JCheckBoxMenu), они соответствуют одному и тому же свойству фрейма (например статусбар — неважно),
что бы их синхронизировать я для обекта типа JToggleButton присвоил модель обекта типа JCheckBoxMenu
(tb.setModel(cb.getModel())), это работает, но этот подход мне не нравиться, как сделать лучше, быть может есть
общий подход к этому делу в книгах по свингу я не нашел ответ на этот вопрос.
Re: синхронизацию UI
От: Lucker Беларусь http://lucker.intervelopers.com/
Дата: 06.09.04 11:55
Оценка:
Здравствуйте, achmed, Вы писали:

A>Здравствуйте!

A>Вот наталкнулся на такую проблему, есть у меня в UI пара кнопок, одна тулбаре (JToggleButton), другая
A>в меню (JCheckBoxMenu), они соответствуют одному и тому же свойству фрейма (например статусбар — неважно),
A>что бы их синхронизировать я для обекта типа JToggleButton присвоил модель обекта типа JCheckBoxMenu
A>(tb.setModel(cb.getModel())), это работает, но этот подход мне не нравиться, как сделать лучше, быть может есть
A>общий подход к этому делу в книгах по свингу я не нашел ответ на этот вопрос.

javax.swing.Action и для твоей задачи setEnabled(boolean b) рулит!
ICQ #333355130
Re: синхронизацию UI
От: Аноним  
Дата: 06.09.04 13:03
Оценка:
Здравствуйте, achmed, Вы писали:

A>Здравствуйте!

A>Вот наталкнулся на такую проблему, есть у меня в UI пара кнопок, одна тулбаре (JToggleButton), другая
A>в меню (JCheckBoxMenu), они соответствуют одному и тому же свойству фрейма (например статусбар — неважно),
A>что бы их синхронизировать я для обекта типа JToggleButton присвоил модель обекта типа JCheckBoxMenu
A>(tb.setModel(cb.getModel())), это работает, но этот подход мне не нравиться, как сделать лучше, быть может есть
A>общий подход к этому делу в книгах по свингу я не нашел ответ на этот вопрос.

Правильно, что не нравится
Смотри в сторону javax.swing.Action ,
а самое главное в сторону паттерна Mediator

WBR,
Сергей Рыжков,
Digital Design
Re[2]: синхронизацию UI
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 06.09.04 13:34
Оценка:
Здравствуйте, Lucker, Вы писали:

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


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

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

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

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

паттерны это конечно корошо, некоторые реализованы в swing, но
неужели придется руками прописывать зависимости между элементами
управления, а я то наивно надеялся ,что в swing это элегантно
реализовано, помнится даже в MFC это автоматом делалось (в частности
между тулбапром и меню, надо было только иднтификаторы одинаковые поставить)
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)
Re[4]: синхронизацию UI
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 06.09.04 14:30
Оценка:
Здравствуйте, Аноним, Вы писали:

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

[...]
Спасибо, вот теперь понятно, хотя я надеялся что это уже есть
что за библиотека ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.