使用Threads在Swing(Java)中实现MVC范例

时间:2015-04-26 08:49:55

标签: java multithreading swing model-view-controller

我正在尝试使用多线程在Java(Swing)中实现MVC范例。目前,我正在使用Observer类和带有Observable类的Model类扩展View类,并且它的工作正常(我的代码是这个例子:http://austintek.com/mvc/)。控制器类只调用相应的模型和视图函数,并且有一个主要的“粘合”程序来设置所有内容。但是,这种方法不使用线程。 有没有办法通过同时使用线程 Observer / Observable类来实现它?

(我的目标是将M,V和C中的每一个作为单独的线程实现)

以下是我的观看代码的一部分:

public class View implements Observer
{ 

/*************************************** View *************************************
        **
    **  This function is the constructor of the View class.
    **
    **      PRE: <nothing>
    **      POST: the GUI is created and the directory is displayed on the screen.
    **      RETURN: <N/A>
    **
    **/
    View(String name)
    {
        threadName = name;

        //frame in constructor and not an attribute as doesn't need to be visible to whole class
        JFrame frame = new JFrame("simple MVC");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        addElements(frame); // this is implemented separately

        // frame.addWindowListener(new CloseListener());    
        frame.setSize(900, 732);
        // frame.setLocation(100,100);

        /** Display the window **/
        //frame.pack();
        frame.setVisible(true);

    }// View

以下是我的模型代码的一部分:

 public class Model extends java.util.Observable
    {
        /****************** variable DECLARATIONS *********************/

    // The hash table in which the directory is stored
    private Hashtable<String, Integer> tel_dir 
                    = new Hashtable<String, Integer>();

    // The path of the telephone directory during runtime
    private URL filePath
            = Model.class.getClassLoader().getResource("directory.txt");

    // the name of the thread
    private String  threadName;
                        /****** private Thread  t; ******/
    // the object in which the message is sent to the view
    private Message message = new Message();

    /** GETTERS and SETTERS **/

    ....


    /*************************************** Model *************************************
    **
    **  This function is the constructor of the model class.
    **
    **      PRE: <nothing>
    **      POST: the telephone directory is input from the file and stored in a hash
    **            table.
    **      RETURN: <N/A>
    **
    **/
    Model(String name)
    {
        int    phone_num;
        String customer_name;
        Scanner scanner = null;
        threadName      = name;

        /** Opening the handle to the file containing the telephone directory **/
        try
        {
            scanner = new Scanner(new File(filePath.getPath()));
        }
        catch (FileNotFoundException e1)
        {
            e1.printStackTrace();
        }

        /** Inputting from the file and storing it in the hash table **/
        while (scanner.hasNextInt())
        {
            phone_num     = scanner.nextInt();
            customer_name = scanner.nextLine();
            customer_name = customer_name.trim();
            tel_dir.put(customer_name, phone_num);
        }

    }// Model

1 个答案:

答案 0 :(得分:3)

  

我的目标是将M,V和C中的每一个实现为一个单独的线程。

这可能不是一个有用的部门。必须在event dispatch thread上构建和操作的Swing视图,并且用户希望Swing控件保持响应,如here所述。

相反,在SwingWorker的后台运行任何耗时的模型,并在process()的实现中更新监听视图。在此example中,视图组件会直接更新,但您也可以按照建议here为已注册的侦听器触发自定义事件。在此example中,chart通过series收听其数据模型SeriesChangeEvent;它响应process()中工人的更新。您可以按照建议herehere通过PropertyChangeEvent显示进度。