[英]Interaction between JFrames
我有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
}
您將要成為模型視圖控制器設計模式的怪胎。
您要做的一件事就是減少任何一個班級的責任感。
在您的情況下,您有一個窗口正在顯示圖像,而另一個窗口正在顯示控件(盡管我考慮使用單個窗口來顯示兩個窗口,但概念仍然相同)。
兩個類都沒有真正負責根據輸入“更改”圖像的責任,實際上,這應該屬於另一個類-模型。
這將從“控件”窗口中獲取輸入,修改其狀態並生成事件,相關方可以響應(也就是觀察者模式 )。
這樣,您可以更改模型的實現,而不會負面影響依賴於該模型的其他類(這依賴於另一個概念- 接口不是實現的代碼 ),因為它們不依賴於實現,但取決於合同y模型的界面。
當您建立“控件”和“圖像”窗口時,您還需要將它們傳遞給“模型”的相同實例,通過這兩個窗口將能夠進行通信-在何種程度上由合同規定模型,但我想這幾乎是一種方式(控件視圖->模型->圖片視圖)
在框架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
構造函數中,將JFrame2
的實例傳遞給JFrame3
的構造函數,如下所示:
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
S,這樣我就可以在通過obj3
到的構造JFrame2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.