синхронизацию 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
Оценка:
Здравствуйте, Аноним, Вы писали:

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

[...]
Спасибо, вот теперь понятно, хотя я надеялся что это уже есть
что за библиотека ?
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)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.