2011-12-21 70 views
-1

我有一個實體列表,其中每個實體根據JPanel呈現爲小部件。小部件具有動態行爲 - 一旦放置在面板上,它可以由基礎實體改變。這是自動發生的。此外,一些小部件可以通過不同的動作來調整大小,例如按鈕點擊。動態JList實現

問題是如何將它們組織成類似JList但沒有橡皮圖章工藝。換句話說,我想JList其中每個項目渲染與cellrenderer保持「活着」。

基於JPanel垂直BoxLayout現在我已經實現了快速和骯髒的組成部分,它採用JList's渲染器組件和它的模型......但我的實現是太髒了......

嗯..是啊,使用JTable也不合適。

你有什麼想法嗎?

+0

爲更好地幫助越早請張貼http://sscce.org/這裏 – mKorbel 2011-12-21 14:47:30

+0

你真的需要更好地瞭解Swing的MVC的;你需要的一切已經提供給你..你只需要知道如何將它們連接在一起來說明你的實體。 – mre 2011-12-21 14:49:34

+0

是的。我的Swing知識並不完美,我發現它可以從零件構建組件,但我希望存在一些穩定且經過測試的實現。今晚我不想重塑自行車。 – 2011-12-21 14:57:48

回答

0

如果你不想橡皮圖章發生,那麼你將不得不創建自己的使用實際組件的JList實現。

您可以嘗試通過緩存渲染器中每行的每個組件並將值綁定到它並在JList詢問渲染器時返回該實例來解決橡皮戳效果。這非常危險,因爲如果顯示了20行,則必須在渲染器中緩存20個實例,並且只有當該行不可見時才能重用一個實例。這就意味着如果你有5種獨特的配置(A,B,C,D,E),你可能有10種A型,5種B型,2種C型和3種D型,0型E正在顯示。但是,不能簡單地重用其中一個組件,而不知道它是否被顯示。因此,如果行正在顯示,並且它是正在渲染的行的正確類型,則必須考慮該行。隱藏行後,您必須清理。

另一種選擇是爲行封裝所有X變體並將其放在CardLayout上。然後,您可以簡單地緩存每行顯示的一行,並簡單地交換顯示該行時顯示的卡。我認爲這對你來說可能是最簡單的選擇。

更難的部分是路由事件點擊鼠標點擊,鍵盤事件等等這些活動組件,讓它們像正常組件一樣響應。當用戶點擊按鈕時重新呈現按鈕等等,將是具有挑戰性的。不是不可能,但乏味。

最後,可變行高JList是一種痛苦。特別是在你的計算中,要弄清楚是否顯示一行,因爲你不能簡單地做如下簡單的數學運算:int rowHeight = jlist.getHeight/model.size()。它不起作用。你必須計算每一行的高度,然後計算出一行是否可見。

做你說的是很多工作,而且非常棘手的編碼,以解決JList的一些假設,使其工作。最後,您可能會發現僅僅實現自己的List控件就可以做出不同的設計決策。無論哪種方式,它都要求你擅長Swing來使其工作。

+0

是的。對JList源碼的快速喧染使我確信現在基於現有組件對我來說太難了。我的Swing知識不那麼深刻。正如我前面寫的那樣,我實現了一些基於佈局,滾動面板和jpanel的錯誤解決方法,有時可以按我的意願工作。但我仍然希望早些時候有人已經遇到了這樣的問題 – 2011-12-21 16:06:41

-1

使用JList和ActionListener的XD

+0

做什麼,怎麼做? -1 – kleopatra 2014-02-11 10:59:08