Связь между двумя разными JFrames? - PullRequest
5 голосов
/ 26 февраля 2011

Здравствуйте, возможно, вы слышали о GIMP или о чем-то подобном, использующем разные кадры. В качестве полного интерфейса, поэтому мне было интересно, как осуществлять связь таких кадров, когда оба (может быть, несколько) кадра загружены в память и видны.*

Я просмотрел некоторые статьи, но они не были настолько удовлетворительными, если у кого-то есть хороший пример или учебник, пожалуйста, поделитесь.

С уважением, Алок Шарма

Ответы [ 4 ]

7 голосов
/ 26 февраля 2011

По сути, это просто вопрос наличия ссылки на кадр A в кадре B и ссылки на кадр B в кадре A:

public class FrameA extends JFrame {
    private FrameB frameB;

    public void setFrameB(FrameB frameB) {
        this.frameB = frameB;
    }

    public void foo() {
        // change things in this frame
        frameB.doSomethingBecauseFrameAHasChanged();
    }
}

public class FrameB extends JFrame {
    private FrameA frameA;

    public void setFrameA(FrameA frameA) {
        this.frameA = frameA;
    }

    public void bar() {
        // change things in this frame
        frameA.doSomethingBecauseFrameBHasChanged();
    }
}

public class Main {
    public static void main(String[] args) {
        FrameA frameA = new FrameA();
        FrameB frameB = new FrameB();
        frameA.setFrameB(frameB);
        frameB.setFrameA(frameA);
        // make both frames visible
    }
}

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

1 голос
/ 26 февраля 2011

Рассмотрите возможность создания приложения на платформе NetBeans (RCP на основе Swing), которая поставляется с оконной системой. Вы можете отключить TopComponets, если предпочитаете несколько окон.

Вы можете общаться между TopComponents и модулями через экземпляр Lookup.

1 голос
/ 26 февраля 2011

Если вы отделяете свою логику «Control» от своей логики «View» в шаблоне типа MVC, это должно быть так же просто, как просто ссылаться на другой компонент.

Так же, как JFrame может иметь несколько панелей, так и ваше приложение может вносить изменения в несколько панелей на основе действий в одной панели. Ваше приложение может иметь несколько кадров, на которые могут влиять действия в одном кадре.

0 голосов
/ 28 октября 2018

Я опоздал на 7 лет, но, возможно, это все еще интересно для вас;) Я решил эту проблему с помощью шаблона Observer.

В моем примере есть обзорный вид (=observer; таблица из БД) и подробный вид (=observable; содержит строку из обзорного вида). Теперь я хочу отредактировать (в обзорном виде) выбранную строку в подробном виде, нажать кнопку сохранения, закрыть подробный вид и notify изменения (всех) наблюдателей.

public interface Observer { 
    public void notifyUpdate(Contact contact); 
}

public interface Observable {   
    public void addObserver(Observer observer);
}

public class Detail extends JFrame implements Observable {
    /* multiple observers possible */
    private ArrayList<Observer> observers;
    /* contact will be modified in detail-view and reported to overview-view */
    private Contact contact;
    public Detail() {
        this.observers = new ArrayList<>();
    }
    @Override
    public void addObserver(Observer observer) {
        this.observers.add(observer);
    }
    /* trigger this methode e.g. by save-button, after modifiing contact */ 
    protected void notifyObservers() {
        /* multiple observers possible */
        Iterator<Observer> observerIterator = this.observers.iterator();
        while(observerIterator.hasNext()) {
            /* report observer: constact has modified */
            observerIterator.next().notifyUpdate(contact);
        }       
    }
}

public class Contacts extends JFrame implements Observer {
    private Detail detail;
    public Contacts() {
        detail = new Detail();
        detail.setVisible(true);
        detail.addObserver(this);
    }
    @Override
    public void notifyUpdate(Contact contact) {
        /* notifyUpdate was called from Observable */           
        /* process contact, DB update, update JTable */
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...