【问题标题】:JAVA algorithm in the background during GUIGUI期间后台的JAVA算法
【发布时间】:2012-12-16 09:03:30
【问题描述】:

我有一个问题,我不能突然出现。我必须制作一个狂野的图形界面,在某个事件或特定算法的某个动作(如有限状态机)之后启用按钮。

我决定创建两个类,一个用于 GUI,另一个是创建框架后运行的线程。

现在必须等到消息到达套接字,之后他们必须启用一个按钮,然后必须等待您按下此按钮并随后启用两个,依此类推。

然后我在 Frame 类中创建了静态按钮,用于启用/禁用相应的线程。

这是不是一个正确的解决方案?

有没有办法使用 GUI 创建“类似有限状态机”?

--编辑--

我有一个创建 GUI 的控制器类。创建之后,我调用应该运行算法的“类过程”。

在 I 类 CONTROLLER 中的按钮和图形对象静态

静态 JButton btn1; 静态 JPanel panel1 静态 JButton btn2;

在 PROCEDURES 类中,将调用上面列出的各项的方法。

例子:当你可以看到Frame时我需要检查一个特定的变量,只需更改,我需要启用btn1 ..按下btn1后,我可以使用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;
    }
}

【问题讨论】:

  • 需要先看看你的代码
  • 您的问题相当主观。这取决于你是如何编码的。没有更多信息,我们无法判断一个“正确”的解决方案。

标签: java multithreading user-interface background


【解决方案1】:

制作一个数据模型FiniteStateModel,带有事件监听器。 Maka 一​​个视图 ViewFrame,带有普通的非静态按钮,如果需要动态添加按钮左右。 然后控制器 Controller 可以将事件连接到视图并进行更改。

您需要EventQueue.invokeLater(new Runnable() { }); 做出响应并切换到 AWT 事件队列。


示意图:

对于创建 JFrame 和 JPanel 的简单 GUI 编辑器,您可以尝试 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 的优点是所有的业务逻辑/控制流都简洁地写在控制器类中。

【讨论】:

    猜你喜欢
    • 2022-11-17
    • 2011-11-07
    • 2012-06-02
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多