我有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帧和第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
的构造函数。