Java 两个不同JFrame之间的通信?
您好,您可能听说过GIMP或类似的东西,它使用不同的框架作为一个完整的gui,所以我想知道当两个(可能多个)框架都加载到内存中并且可见时,如何进行这样的框架通信 我已经阅读了一些文章,但它们不是那么令人满意,如果有人有一个好的例子或教程,然后请分享 问候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
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还有许多其他优点。