【问题标题】:Implementing MVC paradigm in Swing (Java) using Threads使用线程在 Swing (Java) 中实现 MVC 范例
【发布时间】:2015-04-26 08:49:54
【问题描述】:

我正在尝试使用多线程在 Java (Swing) 中实现 MVC 范例。目前,我正在使用 Observer 类扩展 View 类,使用 Observable 类扩展 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

【问题讨论】:

  • Swing 已经在扮演视图和控制器的角色。你想如何解耦?

标签: java multithreading swing model-view-controller


【解决方案1】:

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

这可能不是一个有用的划分。 Swing 视图必须event dispatch thread 上构建和操作,并且用户希望 Swing 控件保持响应,正如 here 所讨论的那样。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 2015-07-19
    • 1970-01-01
    • 2018-02-25
    相关资源
    最近更新 更多