JFrame之间的交互

时间:2018-08-05 10:42:45

标签: java swing jframe

我有3个JFrame,其中第一个打开了其他两个。然后,这两个JFrame应该相互交互。其中一个要显示图片,另一个要使用JSliders来更改该图片的某些值,等等。

如何为我的JSliders实现一个ActionListener来更新另一个JFrame中的图片?创建其他JFrame的对象将调用其构造函数,但我不想第二次打开该JFrame。也许我的方法是完全错误的?

我正在尝试做的简化版本:

public class JFrame1 extends JFrame {
...
}
    public JFrame1 () { // Constructor
    ...
    button.addActionListener(new ActionListener() { //when button is pressed
        public void actionPerformed(ActionEvent e) {

        JFrame2 obj2 = new JFrame2(); // open JFrame2
        JFrame3 obj3 = new JFrame3(); // open JFrame3
        }
    });
    }

public class JFrame2 extends JFrame {
...
}
    public JFrame2 () { //Constructor
    ...
    ActionListener for JSliders from JFrame3 to update values whenever they're changed??
    label.setIcon(new ImageIcon (image)); //display image
    }

public class JFrame3 extends JFrame{
...
private JSlider slider1;
private JSlider slider2;
}

    public JFrame3 () { //Constructor
    ...
    some JSlider settings
    }

2 个答案:

答案 0 :(得分:1)

您将想成为model-view-controller设计模式的宠儿。

您要做的一件事是减少任何一个班级的责任量。

在您的情况下,您有一个窗口正在显示图像,而另一个窗口正在显示控件(尽管我考虑使用单个窗口来显示两个窗口,但概念仍然相同)。

两个类都不真正负责根据输入“更改”图像,实际上应该属于另一个类-模型。

这将从“控件”窗口中获取输入,修改其状态并生成事件,相关方可以响应(也称为observer pattern)。

通过这种方式,您可以更改模型的实现而不会对依赖该模型的其他类产生不利影响(这依赖于另一个概念-Code to interface not implementation),因为它们不依赖于实现,但是合同通过模型的界面定义了

在建立“控件”和“图像”窗口时,您还将同时将它们传递给“模型”的相同实例,通过这两个窗口将能够进行通信-在何种程度上定义模型的合同,但我想这几乎是一种方式(控件视图->模型->图片视图)

答案 1 :(得分:0)

在第2帧和第3帧中添加类型为JFrame3的另一个私有成员,如下所示:

public class JFrame2 extends JFrame {
    public JFrame2(JFrame3 frame) {
        this.frame = frame;
        // Now you add your listeners, you have access to the sliders of your JFrame3
        ...
    }
    private JFrame3 frame;
    ...
}

现在,在JFrame3类中,需要公开所有JSliders,以便可以从JFrame2访问它们,否则编译器会抱怨。

之后,在JFrame1构造函数中,将JFrame3的实例传递给JFrame2的构造函数,如下所示:

public JFrame1 () { // Constructor
    ...
    button.addActionListener(new ActionListener() { //when button is pressed
        public void actionPerformed(ActionEvent e) {
        JFrame3 obj3 = new JFrame3(); // open JFrame3
        JFrame2 obj2 = new JFrame2(obj3); // open JFrame2
        }
    });
}

请注意,我已经改变了构建JFrame的顺序,以便可以将obj3传递给JFrame2的构造函数