java treetable_在Swing中创建TreeTable | 学步园
TreeTable是Tree和Table的一個(gè)結(jié)合-
就是一個(gè)即能夠展開(kāi)和收起行,同時(shí)也能夠顯示多個(gè)列的組件。在Swing的標(biāo)準(zhǔn)包里沒(méi)有一個(gè)叫做JtreeTable的組件,但是我們很容易通過(guò)把Jtree做成Jtable的渲染器來(lái)創(chuàng)建一個(gè)這樣的組件。
這篇文章就是關(guān)于如何使用該技術(shù)來(lái)創(chuàng)建一個(gè)TreeTable。最后實(shí)現(xiàn)一個(gè)名為TreeTableExample0的例子程序,該例子實(shí)現(xiàn)了一個(gè)TreeTable的瀏覽器,可以用來(lái)瀏覽本機(jī)的文件系統(tǒng)(如下圖所示)
在Swing中,Jtree,Jtable,Jlist和JcomboBox組件都是使用一個(gè)叫做單元格渲染器(Cell Render)的指定對(duì)象來(lái)畫內(nèi)容。單元格渲染器的paint()方法來(lái)畫list中的每一項(xiàng),tree中的每個(gè)節(jié)點(diǎn),table中的每個(gè)單元格。單元格渲染器就象一個(gè)“印章(rubber
stamp)”,它會(huì)移動(dòng)到setBounds()方法指定的位置,然后用paint()方法來(lái)畫。
通過(guò)使用組件來(lái)渲染單元格,你可以僅創(chuàng)建一個(gè)組件來(lái)高效地顯示大量的相同組件。缺省的,Swing組件使用支持簡(jiǎn)單的文本和圖標(biāo)組合(Text和Icon)的Jlabel來(lái)做單元格的渲染器。要使用任何的Swing組件做單元格渲染器,只需創(chuàng)建一個(gè)實(shí)現(xiàn)了相應(yīng)的單元格渲染器接口的子類。如:Jtable的TableCellRenderer接口,Jlist的ListCellRenderer接口,等等。
Swing中的渲染
下面是一個(gè)如何在JTable中使用JcheckBox作為渲染器的例子
public class CheckBoxRenderer extends JCheckBox
implements TableCellRenderer {
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
setSelected(((Boolean)value).booleanValue()));
return this;
}
}
來(lái)看看下面例子是如何工作的
下面的代碼段是本文后面介紹的例子中的一個(gè)片斷 ,演示了如何用JTree來(lái)渲染JTable的內(nèi)部。這個(gè)例子稍微有點(diǎn)兒不尋常,是因?yàn)樗袹Tree的每單個(gè)節(jié)點(diǎn)畫到JTable的每單個(gè)單元格,而不是把整個(gè)樹畫到每個(gè)JTable的單元格
我們使用通常的方法開(kāi)始:通過(guò)擴(kuò)展Jtree類和實(shí)現(xiàn)TableCellRenderer接口把Jtree展開(kāi)到單元格渲染器。為了實(shí)現(xiàn)一個(gè)單元格渲染器所需的行為,我們必須讓我們的渲染器僅把樹的節(jié)點(diǎn)畫在一個(gè)特定的表單元格中。 實(shí)現(xiàn)這些的一個(gè)簡(jiǎn)單方法就是重寫setBounds()方法和paint()方法,如下:
public class TreeTableCellRenderer extends JTree
implements TableCellRenderer {
protected int visibleRow;
public void setBounds(int x, int y, int w, int h) {
super.setBounds(x, 0, w, table.getHeight());
}
public void paint(Graphics g) {
g.translate(0, -visibleRow * getRowHeight());
super.paint(g);
}
public Component getTableCellRendererComponent(JTable table,
object value,
boolean isSelected,
boolean hasFocus,
int row, int column) {
visibleRow = row;
return this;
}
}
當(dāng)每個(gè)單元格繪制好以后,JTable進(jìn)行正常的渲染過(guò)程,設(shè)置其邊界,請(qǐng)求繪制。然而在本例中,我們使用一個(gè)實(shí)例變量visibleRow來(lái)記錄當(dāng)前繪制的單元格的行號(hào)。同時(shí)我們重寫了setBounds(),因此即使當(dāng)JTable根據(jù)當(dāng)前繪制的單元格的尺寸來(lái)設(shè)定自己的邊界的時(shí)候,Jtree也能和JTable保持同意的高度。
為了完成該功能,我們還要重寫paint(), 使用已經(jīng)存儲(chǔ)的變量visibleRow,把剪輯矩形區(qū)域移動(dòng)到tree的相應(yīng)部分的上方。結(jié)果是當(dāng)table要求繪制的時(shí)候,Jtree 僅繪制它的其中一個(gè)節(jié)點(diǎn)。
除了把Jtree做成單元格第一列的渲染器,我們還把Jtree作為這些單元個(gè)的編輯器。這種作法的效果是JTable傳遞所有的鼠標(biāo)和鍵盤事件給這個(gè)“編輯器” - 也就允許tree接受用戶輸入來(lái)展開(kāi)和收縮它的節(jié)點(diǎn)。
例子:一個(gè)文件系統(tǒng)瀏覽器
文中的例子創(chuàng)建了一個(gè)文件系統(tǒng)瀏覽器,每個(gè)目錄可以展開(kāi)和收起,表中的其它列顯示文件和目錄的重要屬性,如文件大小和日期等
下面是例子中的類文件列表,及其用途描述:
TreeTableModel.java: 新接口,擴(kuò)展了TreeModel接口,描述TreeTable中要顯示那些數(shù)據(jù)
AbstractTreeTableModel.java: TreeTableModel的基類,該類處理一些監(jiān)聽(tīng)器。
TreeTableModelAdapter.java:? 實(shí)現(xiàn)了TreeModel接口的包裝類,輸入?yún)?shù)為TreeTableModel和Jtree
AbstractCellEditor.java:? CellEditors的基類,該類處理一些監(jiān)聽(tīng)器。
JTreeTable.java: JTable的子類,該類可以從TreeTableModel中渲染數(shù)據(jù)
MergeSort.java:? 一個(gè)合并排序的實(shí)現(xiàn)
FileSystemModel.java: 本機(jī)文件系統(tǒng)的模型,AbstractTreeTableModel的實(shí)子類,實(shí)現(xiàn)了TreeTableModel接口
TreeTableExample0.java:
顯示TreeTable的示例程序。
sources.zip:
包含上述文件的壓縮文件,當(dāng)你運(yùn)行程序TreeTableExample0, 顯示一個(gè)本地文件系統(tǒng)中文件和目錄的TreeTable。就像文章開(kāi)始部分顯示的圖片。 點(diǎn)擊表的第一列中的支元素,項(xiàng)目就會(huì)象其它樹一樣的展開(kāi)和收縮。
總結(jié)
以上是生活随笔為你收集整理的java treetable_在Swing中创建TreeTable | 学步园的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 优化matlab作业,现代设计优化算法M
- 下一篇: java sax xml文件解析_jav