我目前正在使用JTable和DefaultTableModel構建數據庫。在我的程序中,我有 有一個允許用戶搜索數據庫的功能。我有搜索部分構建,但我不知道如何在JTable中突出顯示一行或一個單元格。有人可以幫幫我嗎?無論如何,我可以在JTable中突出顯示一行嗎?
謝謝
我目前正在使用JTable和DefaultTableModel構建數據庫。在我的程序中,我有 有一個允許用戶搜索數據庫的功能。我有搜索部分構建,但我不知道如何在JTable中突出顯示一行或一個單元格。有人可以幫幫我嗎?無論如何,我可以在JTable中突出顯示一行嗎?
謝謝
您確定要突出顯示而不是篩選出多餘的結果嗎?如果您突出顯示,則必須滾動瀏覽整個列表才能找到所有匹配的結果,而如果過濾顯示,則可以更輕鬆地找到要查找的內容。
如果你走過濾路線,我會考慮GlazedLists,這是一個非常棒的Java庫,用於處理諸如動態過濾,排序等JTables。
如果你仍然想要突出顯示的路線,那麼有兩種主要的方法可以實現這一點。首先是使用JTable的ListSelectionModel,並確保所有匹配的行都在選定的集合中;這將使它們在視覺上與最少的編碼區分開來。另一方面,只要用戶在表格中拖動並選擇其他內容,視覺效果就會丟失。
完成此操作的第二種方法是使用自定義TableCellRenderer,如果行符合您的選擇標準,則會更改行的呈現方式。一個簡單的方法可以改變背景顏色。
關於How to Use Tables的Swing教程有一個關於過濾的部分,因此您可以只顯示符合搜索條件的數據。如果你想看到所有的數據,那麼你只需刪除過濾器。
如果你真的想單獨突出顯示,那麼我會看看Table Row Rendering的方法。
我可以告訴你我是如何做到的。 我實現了我的搜索以作爲文檔中的搜索工作,即一次找到單個結果。我存儲所選行的當前索引,或者如果先前未選擇行,則從第一個索引開始。然後,我的模型實現了我的接口,可以搜索下一個或上一個匹配的功能,下面的示例顯示使用find next match方法,該方法返回表中找到匹配字符串的行的索引,然後將選擇更改爲否則我會清除選擇以讓用戶知道沒有匹配。
int index = serchableTableModel.findNextMatchIndex(serchedText, currentIndex);
if(index != -1)
table.changeSelection(index, 0, false, false);
else
table.clearSelection();
我希望這可以解決您的問題。
注意:之前我並沒有意識到上面列出的列表,他們確實看起來很有希望。他們可以幫助我實現對錶格的排序,搜索自己。
如果我繼續使用過濾器位,我如何確保當用戶完成後,過濾器將停止並顯示正常結果? – 2011-04-02 01:58:46
GlazedLists允許您在綁定給定的JTextField後實時查看過濾器更新。因此,只要清除過濾器(即通過選擇所有文本並按刪除,或僅按退格鍵),整個表格就會再次顯示。 – I82Much 2011-04-02 02:06:15