簡體   English   中英

JFrame之間的交互

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM