2011-03-30 101 views
2

我需要在Java Swing中實現映射,該映射與空間數據庫連接以處理某些查詢。我用jLabel來表示地圖圖像。Java Swing中的交互式組件

我需要拖動一個區域並返回該區域內所有可能的元素。每個返回元素應該在地圖上顯示爲黃色三角形或紅色圓圈,並且可以單擊這些多邊形以在其他位置提供更多信息。

這是我的困惑。我應該使用哪個組件來演示圖像上的元素? 它必須是互動的所以我憑直覺選擇JButton,這裏是我的實現:

Iterator<JGeometry> it = al.iterator(); 
    while (it.hasNext()) { 
     JButton jButton1 = new JButton(); 
     jButton1.setText("213"); 
     jButton1.setBounds(325 + (int)it.next().getPoint()[0], 70 + (int)it.next().getPoint()[1], 30,30); 
     jButton1.setVisible(true); 
     getContentPane().add(jButton1); 
    } 

但它並不顯示在面板上的任何按鈕。我想,jButton和包含圖像的jLabel都在同一層次上,所以可能會有一些重疊。我該如何處理?這種情況有沒有更好的解決方案?

expected performance

+1

您使用空佈局管理器? – MeBigFatGuy 2011-03-30 05:35:15

回答

1

考慮具有這些元件上的JPanel繪製,其偵聽鼠標事件。用戶將點擊並拖動,創建一個有界的框,您可以確定是否有任何對象相交,並獲得它們的座標。

這是demo,可以幫助您開始。

1

這與您的問題沒有直接關係,但代碼中存在另一個問題,它會給您帶來麻煩。

您在迴路中呼叫it.next()兩次。每次調用next()都會將迭代器移動一個元素,因此您獲得的第一個對象將不會與第二個對象相同。所以,不僅你的結果是錯誤的,而且如果al中的元素數目很奇怪(因爲你一次獲得兩個元素),你最終會得到一個例外。相反,你應該只調用next()一次和值賦給一個局部變量或使用Java 6 for循環語法:

for(JGeometry geom : al) { 
    ... 
    jButton1.setBounds(325 + (int)geom.getPoint()[0], 70 + (int)geom.getPoint()[1], 30, 30); 
    ... 
} 
+0

謝謝boffinbraiN,這真的很有幫助 – ssb 2011-03-30 17:26:27