Java Assignment帮助(与MVC一起奋斗)

时间:2014-04-25 21:05:46

标签: java swing model-view-controller

我有一个Java任务,我们必须使用MVC设计模式创建一个足够简单的世界时钟应用程序。

该应用程序涉及允许用户同时在屏幕上多次查看(或时钟)。他们从一系列城市中创建的Jlist中选择这些时钟(它们的相关时差用逗号分隔,例如。" Barcelona,+ 1.0"然后按一个添加按钮显示时钟/时钟对于这些城市。还有一个删除城市按钮,其工作方式与添加按钮相同,但显然不会显示时钟。时钟和城市显示在两侧是Jscroll窗格。

我正在努力解决一些事情。

  • 我无法弄清楚如何将按钮连接到动作侦听器,然后通过MVC连接选择侦听器?
  • 我一直试图找出如何将所选城市存储在数组列表中,然后遍历此列表以显示/隐藏相关时钟。这是最好的方法吗?我无法帮助,但觉得会有一个更优雅的解决方案。
  • 我还不确定创建多个时钟的最佳方法?我试过循环,但这里遇到的问题是我用来创建一个时钟的代码。

    myClock = new JTextField(8);
    myClock.setFont(font);
    myClock.setEditable(false);
    myClock.setFocusable(false);
    myClock.setHorizontalAlignment(JTextField.CENTER);
    myClock.setBorder(BorderFactory.createTitledBorder(lineBorder, "City"));
    clockPanel.add(myClock);
    

然后使用此方法更新时钟时间。

    public void update() {
            myClock.setText(secondsAsTimeText(model.currentTime()));
        } 

任何帮助都将非常感谢我已经为此工作了三天而且一直没有。如果我不清楚,请让我详细说明。我也是筹码溢出的新人,所以我希望我在问题上没有犯任何新手错误。不要害怕打电话给我,这样我就能从错误中吸取教训:)

1 个答案:

答案 0 :(得分:1)

我的建议:

  • 将差异时间存储在地图(城市名称,diffthecurrenttime)中,例如,如果您居住在伦敦并且您需要当时的纽约市时间(NewYourk,-5)并且您放置了所有密钥及其当模型通过加载属性文件初始化时的值,并且当您要添加或删除城市时不必重写模型类。

  • 当视图开始时获取所有城市并放入Jlist(contllorer这样做)

您不必迭代..使用城市名称作为键来查找正确的时间,如下面的示例代码所示。

属性加载部分:

使用.properties ex创建文件。比如configuration.properties,内容应该是这样的:

纽约= -5 东京= 8

并将属性文件放在src文件夹中。

创建一个将从属性文件中加载信息的类文件:

public class PropertiesLoader{

       public Map<String,Integer> loadCities(){
             Properties file=getProperties("configuration.properties");
             return convertPropertiesToMap(file); //it will be return empty Map if       unable to load properties

       }

       private Properties getProperties(String fileName){
              Properties prop = new Properties();
              InputStream input = null;

              try {
                   input = getClass().getClassLoader().getResourceAsStream(fileName);
                   if (input == null) {
                    //Unable to find file
                                return null;
                   }
                   prop.load(input);

              } catch (IOException ex) {
                           ex.printStackTrace();
              } finally {
                           if (input != null) {
                                  try {
                                        input.close();
                                  } catch (IOException e) {
                                        e.printStackTrace();
                                  }
                           }
          }
             return prop;
       }

       private Map<String,Integer> convertPropertiesToMap(Properties file){
              Map<String,Integer> result=new HashMap<String,Integer>();
                        if(file != null){
                               Enumeration<?> e = file.propertyNames();
                               while (e.hasMoreElements()) {
                                      String key = (String) e.nextElement();
                                      Integer value = Integer.parseInt(file.getProperty(key));
                                      result.put(key,value);
                               }
                    }     
              return result;
       }


}

您必须在模型类中创建PropertiesLoader类,并通过调用loadCities()方法将信息存储在模型中。

MVC部分: 您的控制器将连接它们:

这是一个示例代码:

   public class Controller {

       private final View view;

       private final Model model;

       public Controller(View aview, Model aModel){
              this.view=aview;
              this.model=amodel;
              registerListeners();
       }

      public void registerListener(){
             ActionListener actionListener= new ActionListener(){
                       public void actionPerformed(ActionEvent e) {    
                              String city=view.getSelectedCity();
                              view.swithClockToCity(model.getCityTime(city));                                 
                       }

             }; 
         view.addListenerToOkButton(actionListener);
      }


   }

View类中的某个地方应该是这个

public class View{

       private JList cityList;

       private JButton selectCityButton;
       //other stuff

       public String getSelectedCity(){
              cityList.getSelectedItem().toString();
       }

       public void addListenerToOkButton(ActionListener alistener){
               selectCityButton.addActionListener(alistener);
       }

       public void swithClockToCity(Long time){
         //change the clock panel or something...
         //I put here your code:
          myClock.setText(secondsAsTimeText(time));
       }


}

您必须以类似的方式编写删除按钮及其操作。 我希望我能帮到你!如果你有排队,请不要犹豫!