2

カスタムデータクラスのデータを保持するカスタムコンポーネントがあります。extends JComponentデータが完全にカスタムである間の私のコンポーネント。

データクラスがコンポーネントに変更を通知できる従来のパターンとは何ですか?データクラス内にイベントを実装し、データが設定されたときにコンポーネントにサブスクライブさせる必要がありますか?または、Swingライブラリの事前定義されたパターンがありますか?

ListModel<E>たとえば、私はインターフェースを探していますが、それはちょうど持っているaddListDataListener(ListDataListener l)removeListDataListener(ListDataListener l)です。これはメカニズムモデルが通知するものListですか?

4

2 に答える 2

4

記録として、これは主に私の個人的な意見です (これはより意見の質問であるため)。

通常、Swing アプリケーションでは、コードをモデル/ビュー/コントロール (MVC) に分離するのが最善です。これは、実際の Swing コンポーネントが Viow であり、リスナーが Control であり、実際に処理を行うコードが Model であることを意味します。この場合、View と Model の両方が Control のみを認識します (Control は View と Model の両方を認識します)。

したがって、モデルが更新されると、コントロールに通知され、ビューが更新されます。ビューでも同じです(ビューのリスナーが実行し、モデルを更新するコントロールに通知します)。

これの利点は、ビューとモデルを疎結合することです (ビューはユーザーに何かを表示することだけを気にし、モデルはデータだけを気にします。正しい情報を入手してください)。

以下に例を示します (簡単にするために、それらはすべて 1 つのファイルに含まれていますが、通常は、少なくとも MVC をそれぞれ独自のファイルに格納します)。

import java.awt.event.*;
import java.util.ArrayList;
import javax.swing.*;

public class MVCSeparation {

    // Model:  (Number crunching math-y) or (data processing) stuff
    public static class Model{
        ArrayList<String> data = new ArrayList<String>();
        public void addData(String value){
            data.add(value);
        }

        public int getCount(){
            return data.size();
        }

        public String randomValue(){
            String result = "";
            if(data.size() > 0){
                int index = (int)(Math.random() * data.size());
                System.out.println(index);
                result = data.get(index);
            }
            System.out.println("Getting Value: " + result);
            return result;
        }
    }

    // View:  Pretty graphics and visuals
    public static class View extends Box{
        JLabel text = new JLabel("Random Value:");
        JTextField newItem = new JTextField(10);
        JButton submit = new JButton("Submit");

        public View(){
            super(BoxLayout.Y_AXIS);
            add(text);
            add(newItem);
            add(submit);
        }

        public void setSubmitAction(ActionListener submitAction){
            submit.addActionListener(submitAction);
        }

        public void setDisplayText(String value){
            text.setText("Random Value: " + value);
        }

        public String getText(){
            String result = newItem.getText();
            newItem.setText("");
            return result;
        }

        public void startupApp(){
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setContentPane(this);
            frame.validate();
            frame.pack();
            frame.setVisible(true);
        }
    }

    // Processing User Interactions and Data Updates (links two above together)
    public static class Control{
        Model m = new Model();
        View v = new View();

        public Control(){
            SwingUtilities.invokeLater(new Runnable(){

                @Override
                public void run() {
                    v.setSubmitAction(new SubmitText());
                    v.startupApp();
                }});

            //Randomly update label
            while(true){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                SwingUtilities.invokeLater(new Runnable(){
                    @Override
                    public void run() {
                        v.setDisplayText(m.randomValue());
                    }});
            }
        }

        // Listener to notify us of user interactions on the View
        public class SubmitText implements ActionListener{
            @Override
            public void actionPerformed(ActionEvent e) {
                m.addData(v.getText());
            }
        }
    }


    public static void main(String[] args) {
        new Control();
    }
}
于 2012-12-19T19:15:03.267 に答える
2

Observableまたはを使用できますPropertyChangeListener

于 2012-12-19T13:39:13.613 に答える