如果你不想橡皮圖章發生,那麼你將不得不創建自己的使用實際組件的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來使其工作。
爲更好地幫助越早請張貼http://sscce.org/這裏 – mKorbel 2011-12-21 14:47:30
你真的需要更好地瞭解Swing的MVC的;你需要的一切已經提供給你..你只需要知道如何將它們連接在一起來說明你的實體。 – mre 2011-12-21 14:49:34
是的。我的Swing知識並不完美,我發現它可以從零件構建組件,但我希望存在一些穩定且經過測試的實現。今晚我不想重塑自行車。 – 2011-12-21 14:57:48