按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
{ 〃Temperature〃; 〃High〃; 〃Medium〃; 〃Low〃 };
{ 〃Intensity〃; 〃High〃; 〃Medium〃; 〃Low〃 };
};
static int i = 0;
DefaultMutableTreeNode root; child; chosen;
JTree tree;
DefaultTreeModel model;
public Trees() {
setLayout(new BorderLayout());
root = new DefaultMutableTreeNode(〃root〃);
tree = new JTree(root);
// Add it and make it take care of scrolling:
add(new JScrollPane(tree);
BorderLayout。CENTER);
// Capture the tree's model:
model =(DefaultTreeModel)tree。getModel();
JButton test = new JButton(〃Press me〃);
test。addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
if(i 《 data。length) {
child = new Branch(data'i++')。node();
// What's the last one you clicked?
chosen = (DefaultMutableTreeNode)
tree。getLastSelectedPathponent();
if(chosen == null) chosen = root;
// The model will create the
// appropriate event。 In response; the
// tree will update itself:
model。insertNodeInto(child; chosen; 0);
// This puts the new node on the
// currently chosen node。
}
}
});
// Change the button's colors:
test。setBackground(Color。blue);
test。setForeground(Color。white);
JPanel p = new JPanel();
p。add(test);
add(p; BorderLayout。SOUTH);
}
public static void main(String args'') {
Show。inFrame(new Trees();200;500);
}
} ///:~
最重要的类就是分支,它是一个工具,用来获取一个字符串数组并为第一个字符串建立一个
481
…………………………………………………………Page 483……………………………………………………………
DefaultMutableTreeNode 作为根,其余在数组中的字符串作为叶。然后 node()方法被调用以产生“分支”的
根。树状物类包括一个来自被制造的分支的二维字符串数组,以及用来统计数组的一个静态中断 i。
DefaultMutableTreeNode 对象控制这个结节,但在屏幕上表示的是被JTree 和它的相关
(DefaultTreeModel)模式所控制。注意当JTree 被增加到程序片时,它被封装到JScrollPane 中——这就
是它全部提供的自动滚动。
JTree 通过它自己的模型来控制。当我们修改这个模型时,模型产生一个事件,导致JTree 对可以看见的树
状物完成任何必要的升级。在 init()中,模型由调用getModel()方法所捕捉。当按钮被按下时,一个新的分
支被创建了。然后,当前选择的组件被找到(如果没有选择就是根)并且模型的 insertNodeInto()方法做所
有的改变树状物和导致它升级的工作。
大多数的时候,就像上面的例子一样,程序将给我们在树状物中所需要的一切。不过,树状物拥有力量去做
我们能够想像到的任何事——在上面的例子中我们到处都可看到“default (默认)”字样,我们可以取代我
们自己的类来获取不同的动作。但请注意:几乎所有这些类都有一个具大的接口,因此我们可以花一些时间
努力去理解这些错综复杂的树状物。
13。19。14 表格
和树状物一样,表格在 Swing 相当的庞大和强大。它们最初有意被设计成以 Java 数据库连结(JDBC,在15
章有介绍)为媒介的“网格”数据库接口,并且因此它们拥有的巨大的灵活性,使我们不再感到复杂。无
疑,这是足以成为成熟的电子数据表的基础条件而且可能为整本书提供很好的根据。但是,如果我们理解这
个的基础条件,它同样可能创建相关的简单的 Jtable。
JTable 控制数据的显示方式,但 TableModel 控制它自己的数据。因此在我们创建JTable 前,应先创建一个
TableModel。我们可以全部地执行 TableModel 接口,但它通常从 helper 类的AbstractTableModel 处简单地
继承:
//: Table。java
// Simple demonstration of JTable
package c13。swing;
import java。awt。*;
import java。awt。event。*;
import javax。swing。*;
import javax。swing。table。*;
import javax。swing。event。*;
// The TableModel controls all the data:
class DataModel extends AbstractTableModel {
Object'''' data = {
{〃one〃; 〃two〃; 〃three〃; 〃four〃};
{〃five〃; 〃six〃; 〃seven〃; 〃eight〃};
{〃nine〃; 〃ten〃; 〃eleven〃; 〃twelve〃};
};
// Prints data when table changes:
class TML implements TableModelListener {
public void tableChanged(TableModelEvent e) {
for(int i = 0; i 《 data。length; i++) {
for(int j = 0; j 《 data'0'。length; j++)
System。out。print(data'i''j' + 〃 〃);
System。out。println();
}
}
}
DataModel() {
addTableModelListener(new TML());
}
482
…………………………………………………………Page 484……………………………………………………………
public int getColumnCount() {
return data'0'。length;
}
public int getRowCount() {
return data。length;
}
public Object getValueAt(int row; int col) {
return data'row''col';
}
public void
setValueAt(Object val; int row; int col) {
data'row''col' = val;
// Indicate the change has happened:
fireTableDataChanged();
}
public boolean
isCellEditable(int row; int col) {
return true;
}
};
public class Table extends JPanel {
public Table() {
setLayout(new BorderLayout());
JTable table = new JTable(new DataModel());
JScrollPane scrollpane =
JTable。createScrollPaneForTable(table);
add(scrol lpane; BorderLayout。CENTER);
}
public static void main(String args'') {
Show。inFrame(new Table();200;200);
}
} ///:~
DateModel 包括一组数据,但我们同样能从其它的地方得到数据,例如从数据库中。构建器增加了一个
TableModelListener 用来在每次表格被改变后打印数组。剩下的方法都遵循Bean 的命名规则,并且当
JTable 需要在 DateModel 中显示信息时调用。AbstractTableModel 提供了默认的 setValueAt()和
isCellEditable()方法以防止修改这些数据,因此如果我们想修改这些数据,就必须过载这些方法。
一旦我们拥有一个TableModel,我们只需要将它分配给JTable构建器即可。所有有关显示,编辑和更新的
详细资料将为我们处理。注意这个程序例子同