2010-09-23 63 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