1

問題が発生しました。特定のイベントまたは特定のアルゴリズム (有限状態マシンなど) の特定のアクションの後にボタンが有効になるワイルドなグラフィカル インターフェイスを作成する必要があります。

2 つのクラスを作成することにしました。1 つは GUI 用で、もう 1 つはフレームの作成後に実行されるスレッドです。

メッセージがソケットに到着するまで待つ必要があります。その後、ボタンを有効にし、このボタンを押して 2 つ有効にするまで待つ必要があります。

次に、適切なスレッドを有効/無効にするための静的ボタンを Frame クラスに作成しました。

これは正しい解決策ですか?

GUIで「有限状態マシンのような」ものを作成する方法はありますか?

- 編集 -

GUI を作成するクラス Controller があります。それが作成されたら、アルゴリズムを実行する「クラス プロシージャ」を呼び出します。

クラス I CONTROLLER のボタンとグラフィック オブジェクト static

static JButton btn1; static JPanel panel1 static JButton btn2;

クラス PROCEDURES では、上記の項目のメソッドを呼び出します。

例: Frame I need to check a specific variable, just change, I need to enable btn1 .. btn1 を押した後、I abiliare btn2 など..

解決策として正しいですか?

--- 編集 2 ---

public class Controller extends JFrame {

    static JButton btn1;
    static JPanel panel1;
    static JButton btn2;

    public Controller() {       

        JPanel panel = new JPanel();
        getContentPane().add(panel, BorderLayout.CENTER);
        panel.setLayout(new GridLayout(7, 1, 0, 0));

        //PANEL
        panel1 = new JPanel();      
        FlowLayout flowLayout_1 = (FlowLayout) panel_1.getLayout();
        flowLayout_1.setAlignment(FlowLayout.LEFT);
        panel_chkCom0.add(panel_1);
        btn1 = new JButton("BUTTON 1");     
        btnChk.setEnabled(false);
        btnChk.setPreferredSize(new Dimension(300, 50));
        panel_1.add(btn1);
        panel.add(panel1);

        //TODO

        //When I finish init myself, call my manager thread
        Thread t = new Thread(new SetupProcedure());
        t.start();
    }   
}



public class SetupProcedure implements Runnable {
    protected boolean btnChkIsPress = false;

    public void run(){ 
         SetupManager();
    }

    public void SetupManager() {

        final long POLLING_TIME = 600000;
        boolean isOff = true;

        long pollingTime = 0;
        //Check if it's on

        while(isOff){
            //SIMULATE READING FROM REGISTER
            try {
                Thread.sleep(3000);
                PWisOff = false;
                Controller.btn1.setEnabled(true);               
            } catch (InterruptedException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }           
        }

        SetupController.btn1.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent arg0) {
                btnChkIsPress  = true;
            }
        });
        while(!btnChkIsPress){
            System.out.println("..wait..");
        }

        SetupController.btn2.setEnabled(true);

    ...OTHER...

    public String getResponseFromKernel(String request){
        String s = "Response";
        return s;
    }
}
4

1 に答える 1

1

イベントのリスナーを使用して、データ モデルFiniteStateModelを作成します。必要に応じて動的に追加されたボタンなど、通常の非静的ボタンを使用してビューViewFrameを作成します。コントローラControllerは、イベントをビューに接続し、そのように変更できます。

EventQueue.invokeLater(new Runnable() { });応答性が高く、AWT イベント キューに切り替える必要があります。


概略的に:

簡単な GUI エディタで JFrame と JPanels を作成するには、NetBeans IDE を試すことができます。(これは本当に役に立ちます - 配管の代わりに手元のビジネスに集中できます。)

/** Model. */
public class MessagesModel {
    ... controller.onMessageArrived(messageInfo); // Or via a more generic listener pattern.
}

/** View. */
public class ViewFrame extends JFrame {
    private App controller;
    private JButton btn1;

    public ViewFrame(App controller) {
        this.controller = controller;
        ...
    }

    ... controller.markMessageRead(messageInfo);
}

/** Controller. */
public class App {
    private MessagesModel model;
    private ViewFrame view;

    public static void main(String[] args) {
        new App().start();
    }

    public void start() {
        model = new MessagesModel();
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                view = new ViewFrame(this);
                view.setVisible(true);
            });
    }

    /** Called by the model. */
    public void onMessageArrived(MessageInfo info) {
        view.setSomeAlert(info.title);
    }

    /** Called by the view. */
    public void markMessageRead(MessageInfo info) {
        model.markMessageRead(info);
    }
}

モデルはコントローラーに変更を通知し、コントローラーは対応するビュー メソッドを呼び出します。これは、イベント リスナーによって行うことも、簡単にするためにコントローラーをモデルのコンストラクターに渡すことによって行うこともできます。

MVC の利点は、すべてのビジネス ロジック/制御フローがコントローラー クラスに簡潔に記述されていることです。

于 2012-12-16T14:35:11.440 に答える