2010-09-23 29 views
2

我有一个我正在循环的Map.Entry<String,Integer> s列表,并且每个列表都有一个表示该特定条目的JLabel/JSpinnerJava/Swing:在stateChange上更新数据

我该怎么做才能让ChangeListenerJSpinner上触发时更新该条目以反映新值?

我的代码看起来像

for (Map.Entry<String,Integer> entry : graph.getData()) { 
    SpinnerNumberModel model = new SpinnerNumberModel(
     entry.getValue(),(Integer)0,(Integer)100,(Integer)5); 
    JSpinner spinner = new JSpinner(model); 

    JLabel label = new JLabel(entry.getKey()); 

    spinner.addChangeListener(new ChangeListener() { 
     public void stateChanged(ChangeEvent e) { 
      entry.setValue((Integer)((JSpinner)e.getSource()).getValue()); 
     } 
    }); 

    // more stuff 
} 

然而,这是不行的,因为该项或者需要是最终或对象级,这两者都不是。

有没有更简单的方法,像C#的dataSource,直接绑定对象到微调?或者我该如何做这项工作?

+1

难道你不能进入最后?像(最终Map.Entry 条目:graph.getData())....? – 2010-09-23 03:51:38

回答

2

如果你想坚持个人JLabelJSpinner有几种选择。如果地图可能变大,请使用@ trashgod的答案。

  1. WRONG每@Suresh库马尔的评论:final Map.Entry<String,Integer> entry
  2. WRONG添加spinner.putClientProperty("MyEntryKey", entry),然后在您的ChangeListener获得与spinner.getClientProperty的条目。
  3. 添加spinner.putClientProperty("MyEntryKey", entry.getKey()),然后在您的ChangeListener graph.put(spinner.getClientProperty(), ...)
  4. 从@迈克尔的回答(不知道这是否道德):添加final String key = entry.getKey(),然后在您的ChangeListener graph.put(key, ...)
  5. 让你的封装类实现ChangeListener避免ChangeListener每一个JSpinner

    公共无效stateChanged(的ChangeEvent E){ JSpinner的微调=(JSpinner的)e.getSource(); ((String))spinner.getClientProperty(“MyEntryKey”),(Integer)spinner.getValue()); }

BTW graph.getData()看起来有点奇怪。如果执行Map,则应使用graph.entrySet()

+0

'地图。迭代器完成后,条目参数无效,因此只有(原始)解决方案#3可以可靠工作。 – 2010-09-23 04:22:30

+0

哎呀,对于这样的n00b错误感到抱歉。我想我应该真的得到'-2 + 1 = -1'票。 – 2010-09-23 04:34:47

+0

好吧,没有图不是'Map',但它确实包含一个。它也不是像边和顶点一样的图。这是一种非常简单的方式来表示要在饼图/栏/线/等图中显示的数据。 – 2010-09-25 04:38:23

1

特别是如果Map条目的数量较大时,可以考虑使用JTable,你Map作为数据模型的核心和一个自定义渲染/编辑延长JSpinner。有一个相关的例子here

1

@Suresh对于在for循环中使用final是正确的,但由于Map.Entry值在迭代器外部不可行,所以这会导致麻烦。该单向绑定另一种可能性是

for (Map.Entry<String, Integer> entry : graph.getData()) { 
    ... 
    final String key = entry.getKey(); 

    spinner.addChangeListener(new ChangeListener() { 
     public void stateChanged(ChangeEvent e) { 
      graph.put(key, (Integer)((JSpinner)e.getSource()).getValue()); 
     } 
    }); 

更完整的数据绑定,你可能要绑定针对更复杂的对象。例如,请参阅jgoodies绑定API的ValueModelSpinnerAdapterFactory