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
}

您将希望成为具有模型-视图-控制器设计模式的farmilar。

你想做的一件事是减少任何一个类的责任。

在您的情况下,您有一个显示图像的窗口和另一个显示控件的窗口(尽管我会考虑使用一个窗口来显示两者,但概念保持不变(。

这两个类都没有真正的责任根据输入"更改"图像,相反,这实际上应该属于另一个类——一个模型。

这将从"控制"窗口获取输入,修改其状态,并生成相关方可以响应的事件(也称为观察者模式(。

通过这种方式,您可以更改模型的实现,而不会对依赖它的其他类产生不利影响(这依赖于另一个概念-代码到接口而非实现(,因为它们不依赖于实现,而是依赖于模型接口定义的契约。

当你建立"控件"one_answers"图像"窗口时,你也会将"模型"的同一实例传递给它们,通过这一点,两个窗口将能够通信-在多大程度上由模型的合同定义,但我想这主要是一种方式(控件视图->模型->图像视图(

在第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的构造函数

最新更新