Здравствуйте!
Вот наталкнулся на такую проблему, есть у меня в UI пара кнопок, одна тулбаре (JToggleButton), другая
в меню (JCheckBoxMenu), они соответствуют одному и тому же свойству фрейма (например статусбар — неважно),
что бы их синхронизировать я для обекта типа JToggleButton присвоил модель обекта типа JCheckBoxMenu
(tb.setModel(cb.getModel())), это работает, но этот подход мне не нравиться, как сделать лучше, быть может есть
общий подход к этому делу в книгах по свингу я не нашел ответ на этот вопрос.
Здравствуйте, achmed, Вы писали:
A>Здравствуйте! A>Вот наталкнулся на такую проблему, есть у меня в UI пара кнопок, одна тулбаре (JToggleButton), другая A>в меню (JCheckBoxMenu), они соответствуют одному и тому же свойству фрейма (например статусбар — неважно), A>что бы их синхронизировать я для обекта типа JToggleButton присвоил модель обекта типа JCheckBoxMenu A>(tb.setModel(cb.getModel())), это работает, но этот подход мне не нравиться, как сделать лучше, быть может есть A>общий подход к этому делу в книгах по свингу я не нашел ответ на этот вопрос.
javax.swing.Action и для твоей задачи setEnabled(boolean b) рулит!
Здравствуйте, achmed, Вы писали:
A>Здравствуйте! A>Вот наталкнулся на такую проблему, есть у меня в UI пара кнопок, одна тулбаре (JToggleButton), другая A>в меню (JCheckBoxMenu), они соответствуют одному и тому же свойству фрейма (например статусбар — неважно), A>что бы их синхронизировать я для обекта типа JToggleButton присвоил модель обекта типа JCheckBoxMenu A>(tb.setModel(cb.getModel())), это работает, но этот подход мне не нравиться, как сделать лучше, быть может есть A>общий подход к этому делу в книгах по свингу я не нашел ответ на этот вопрос.
Правильно, что не нравится
Смотри в сторону javax.swing.Action ,
а самое главное в сторону паттерна Mediator
Здравствуйте, 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)
Здравствуйте, Аноним, Вы писали:
А>Извини, если под вечер не совсем правильно тебя понял, но ...проще код в студию
[...]
Спасибо, вот теперь понятно, хотя я надеялся что это уже есть
что за библиотека ?
Здравствуйте, achmed, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>Извини, если под вечер не совсем правильно тебя понял, но ...проще код в студию A>[...] A>Спасибо, вот теперь понятно, хотя я надеялся что это уже есть
Вообще-то этого и не должно быть, ИМХО, так как setSelected и прочие методы,свойственные UI уже не имеют отношения к Command pattern и соответсвенно к Action. Да и вообще всего не затолкаешь
A>что за библиотека ?
Да вот когда есть время набрасываю Конечно код я привел из фреймворка, в данном твоем случае можно и проще (и понятнее) сделать, но уж сам решай
Надеюсь, помог. Если есть вопросы, то лучше уже мылом.
WBR,
Сергей Рыжков,
Digital Design,
(rijkov на mail.ru)