Передача классов Swing (ссылки) по сети? - PullRequest
2 голосов
/ 30 апреля 2011

Я хочу знать, что можно отправлять основные классы Swing событий / actionlisteners, Events, компонентов через RMI.

Возможный сценарий : Если один клиент нажимает кнопку или перемещает ползунок, каждое нажатие кнопки или ползунка клиента и т. Д. Также и для других элементов свинга.

Я ожидаю ответа в контексте RMI и архитектуры Swing MVC, я хочу вызвать модели компонента Swing, например, ButtonModel, и хочу отправить свинг ActionEvent по проводам и зарегистрировать PropertyChangeListener / PropertyChangeSupport в качестве удаленных объектов для получения обновлений на сайте клиента.

Типичные примеры: сервер должен вызывать этот метод для каждого клиента, когда в модели происходят какие-либо изменения

 public void propertyChange(PropertyChangeEvent evt) {
        for (AbstractViewPanel view: registeredViews) {
            view.modelPropertyChange(evt);
        }
    }

в случае события на одном клиенте каждый клиент actionPerformed должен вызываться с сервера:

@Override
public void actionPerformed(ActionEvent e)  {
}

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

РЕДАКТИРОВАТЬ: здесь вы видите, что я вызываю Java Swing defaultbuttonmodel default Swing, единственное, что остается, когда некоторые его свойства или метод изменяют обновления get другого клиента, лучше всего будет следовать Swing propertychangelistener, если кто-то может мне просто помочь, осознав это, было бы здорово:

public class RemoteButtonModel extends UnicastRemoteObject implements Model {

    private ButtonModel model = new DefaultButtonModel() ;

    protected myModel() throws RemoteException {
        super();
    }


    @Override
    public void setEnabled(boolean b) throws RemoteException {
        if (isEnabled())
            model.setEnabled(false);
        else{
            model.setEnabled(true);   
           }
    }

    @Override
    public boolean isEnabled() throws RemoteException {
        return model.isEnabled();

    }
}

Ответы [ 2 ]

2 голосов
/ 30 апреля 2011

Я думаю, что было бы более эффективно отправлять что-то вроде сообщения «прокрутка» или «нажатие кнопки», используя шаблон команды. Это позволило бы различным клиентам правильно работать с разными реализациями.

редактирует:

способ, которым я делаю это в своих клиент-серверных приложениях (которые легко адаптируются к этой одноранговой архитектуре, которую вы делаете), выглядит примерно так (скопируйте и вставьте из моего производственного кода, обратите внимание).

abstract public class UserRequest implements Serializable {

    public final String username;
    private transient ServersideThread thread;

    protected UserRequest(String username) {
        this.username = username;
        this.thread = null;
    }

    abstract public EngineMessage engineCallback(GenericEngine engine);

    public void setThread(ServersideThread thread) {
        if(this.thread == null) {
            this.thread = thread;
            return;
        }
        throw new IllegalStateException("Cannot set thread when already set:" + thread.getName());
    }

    public ServersideThread getThread() {
        return this.thread;
    }

}

Итак, при таком подходе я бы сделал что-то вроде ...

public class SliderMoveNotification extends UserRequest {

    // need some way to say what slider moved
    public final int sliderId;
    public final int slideDistance;

    public SliderMoveNotification(String username) {
        super(username);
        sliderId = 0;
        sliderDistance = 0;
        throw new UnsupportedOperationException("Must supply a slider and a distance");
    }

    public SliderMoveNotification(String username, int sliderID, int slideDistance) {
        super(username);
        this.sliderId = sliderId;
        this.slideDistance = slideDistance;
    }

    public EngineMessage engineCallback(GenericEngine engine) {
        if(engine instanceof WindowEngine) {
            WindowEngine manager = (WindowEngine)engine;
            manager.slideWindow(sliderId,slideDistance);
            // you wouldn't need engine messages like I do in my client/server
            // relationship, but the idea stands.
        }

    }

}
0 голосов
/ 04 мая 2011

Javadoc для каждого класса Swing говорит, что его не следует сериализовать.

Скорее всего, вам следует передавать связанные классы Модели.

А прослушивание событий через RMI - это анти-паттерн. Слишком много трафика, слишком много точек отказа.

...