Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 两个不同JFrame之间的通信?_Java_Swing_Jframe - Fatal编程技术网

Java 两个不同JFrame之间的通信?

Java 两个不同JFrame之间的通信?,java,swing,jframe,Java,Swing,Jframe,您好,您可能听说过GIMP或类似的东西,它使用不同的框架作为一个完整的gui,所以我想知道当两个(可能多个)框架都加载到内存中并且可见时,如何进行这样的框架通信 我已经阅读了一些文章,但它们不是那么令人满意,如果有人有一个好的例子或教程,然后请分享 问候 Alok sharma基本上,这只是在帧B中引用帧a,在帧a中引用帧B的问题: public class FrameA extends JFrame { private FrameB frameB; public void s

您好,您可能听说过GIMP或类似的东西,它使用不同的框架作为一个完整的gui,所以我想知道当两个(可能多个)框架都加载到内存中并且可见时,如何进行这样的框架通信

我已经阅读了一些文章,但它们不是那么令人满意,如果有人有一个好的例子或教程,然后请分享

问候
Alok sharma

基本上,这只是在帧B中引用帧a,在帧a中引用帧B的问题:

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
    }
}

大多数情况下,引入接口是为了解耦帧(侦听器等),或者使用中介来避免所有帧之间的链接过多,但您应该明白这一点。

如果要将“控制”逻辑与“视图”分离开来MVC类型模式中的逻辑这应该像引用不同组件一样简单


就像JFrame可能有多个面板一样,您的应用程序可以基于单个面板中的操作对多个面板进行更改。您的应用程序可以有多个帧,这些帧可能受单个帧中的操作影响。

请考虑在随窗口系统提供的NetBeans平台(Swing bsed RCP)上构建您的应用程序。如果您喜欢多个窗口,可以分离TopComponets


您可以通过查找实例在TopComponents和模块之间进行通信。

我迟到了7年,但这可能对您来说仍然很有趣;) 我通过实现Observer模式解决了这个问题

在我的示例中,有一个概览视图(
=observer
;DB中的表)和一个详细视图(
=observable
;包含概览视图中的一行)。现在,我想在“详细信息”视图中编辑(在“概览”视图中)选定的行,单击“保存”按钮,关闭“详细信息”视图,并通知(所有)观察者的更改

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 */
    }
}
公共接口观察者{
公共信息更新(联系方式);
}
可观察的公共接口{
公众观察员(观察员);
}
公共类细节扩展了JFrame实现的可观察性{
/*可能有多个观察员*/
私人ArrayList观察员;
/*联系人将在详细信息视图中修改,并报告到概览视图*/
私人接触;
公开详情(){
this.obsers=new ArrayList();
}
@凌驾
公共观察者(观察者){
this.observer.add(observer);
}
/*修改联系人后,通过保存按钮触发此方法*/
受保护的void notifyObserver(){
/*可能有多个观察员*/
迭代器observer迭代器=this.obsers.Iterator();
while(observerIterator.hasNext()){
/*报告观察员:constact已修改*/
observerIterator.next().notifyUpdate(联系人);
}       
}
}
公共类Contacts扩展了JFrame实现的Observer{
私人细节;
公众接触(){
细节=新细节();
细节。设置可见(真);
详细信息。添加观察者(本);
}
@凌驾
公共void notify更新(联系人){
/*notifyUpdate已从Observable调用*/
/*流程联系人、数据库更新、更新JTable*/
}
}

您指的是框架还是应用程序?同一应用程序中的框架(因此jvm)可以只使用普通的java调用:)同意extraneon的观点,即您将非常希望澄清您的问题。请在此查看如何改进您的问题的建议:@user517051:应该指出的是,Gimp的UI被相当多的人视为严重的失败。。。这来自一个Linux和Gimp用户;)(是的,我非常讨厌Gimp的UI,当你打开了很多应用程序时,它就毫无意义了)Netbeans不是多窗口的——它只是一个带有自己窗口系统的框架。我认为,引入一个框架来向JFrames显示并不是真的必要:)如果您愿意,可以在单独的窗口中显示TopComponents。使用RCP还有许多其他优点。