1#区域中使用JTree显示项目分组的数据。2#区域中使用JTable显示项目的数据。3#区域中显示输入项和按钮。
private void build(){
JSplitPane jspan = new JSplitPane();
jspan.setDividerLocation(200);
jspan.setDividerSize(10);
jspan.setOrientation(JSplitPane.HORIZONTAL_SPLIT);
jspan.setOneTouchExpandable( true);
setLayout( new BorderLayout());
add(jspan);
MyTree myTree = new MyTree(MyTree.NOCHECK);
jtree = myTree.getXmfzJTree();
JScrollPane jscpan = new JScrollPane(jtree);
jspan.setLeftComponent(jscpan);
JPanel jpanRight = new JPanel( new BorderLayout());
jspan.setRightComponent(jpanRight);
// 创造JTable实例,JTable中的单元格不可编辑
jt = new JTable();
defaultModel = new DefaultTableModel( null, title){
public boolean isCellEditable( int row, int column){
return false;
}
};
jt.setAutoscrolls( true);
jt.setModel(defaultModel);
jt.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
// 隐藏JTable中的不显示的列
SwingUtils.hideTableColumn(jt, 0);
SwingUtils.hideTableColumn(jt, 1);
JPanel xmszPanel = new JPanel( new BorderLayout());
xmszPanel.setBorder(BorderFactory.createEtchedBorder());
// 添加JTable实例的标题
xmszPanel.add(jt.getTableHeader(), "North");
// 添加JTable实例
JScrollPane scrollPane = new JScrollPane(jt);
xmszPanel.add(scrollPane, "Center");
jpanRight.add(xmszPanel);
JPanel editP = this.createOperatJPanel();
editP.setBorder(BorderFactory.createEtchedBorder());
// 添加操作区面板
jpanRight.add(editP, "South");
jtree.addMouseListener( new MouseListener(){
public void mouseClicked(MouseEvent e) {
int row = jtree.getRowForLocation(e.getX(), e.getY());
if(row == -1) return;
DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode)jtree.getLastSelectedPathComponent();
TreeNodeObject tno = (TreeNodeObject)treeNode.getUserObject();
if(e.getClickCount() == 1) {
jfzid.setText(tno.getNodeId());
} else if(e.getClickCount() == 2){
listXmszByFzid(tno.getNodeId());
}
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
});
}
(1)创造JSplitPane实例jspan,左边放JTree,右上边放JTable,右下边放JPanel。JTable分标题和表体两块,分别放在Layout为BorderLayout的JPanel的North和Center方向。
(2)创造JTree的实例jtree。使用MyTree的实例方法getXmfzJTree创建jtree。
(3)创造DefaultTableModel的实例,传入参数null和title,null表示JTable的数据为空,title是JTable的标题,在方法isCellEditable中返回false,表示单元格不可编辑。调用SwingUtils的类方法hideTableColumn隐藏JTable的第0列和第1列。调用setBorder方法设置JPanel的边框样式为BorderFactory.createEtchedBorder()。
(4)JTree的单击与双击事件。调用jtree.getRowForLocation(e.getX(), e.getY())检查是否选择上了JTree的一行。调用jtree.getLastSelectedPathComponent()返回选择的树节点。调用treeNode.getUserObject()获得与树节点关联的TreeNodeObject对象。调用e.getClickCount()检查鼠标点击次数是1还是2,如果是1,表示单击,执行语句jfzid.setText(tno.getNodeId()),如果是2,表示双击,执行语句listXmszByFzid(tno.getNodeId())列出项目设置数据在JTable。
private JPanel createOperatJPanel() {
// 将输入项组件添加到JPanel
JPanel p1 = new JPanel( new FlowLayout(FlowLayout.LEFT));
jfzid = new JTextField(20);
p1.add(jfzid);
jfzid.setVisible( false);
jxmid = new JTextField(20);
p1.add(jxmid);
jxmid.setVisible( false);
jxmzq = new Jxsgs( "xmzq", "项目周期");
p1.add(jxmzq);
jsjdw = new Jxsgs( "sjdw", "数据单位");
p1.add(jsjdw);
// 将输入项组件添加到JPanel
JPanel p2 = new JPanel( new FlowLayout(FlowLayout.LEFT));
p2.add( new JLabel( "项目名称"));
jxmmc = new JTextField(30);
p2.add(jxmmc);
JPanel p4 = new JPanel( new FlowLayout(FlowLayout.LEFT));
p4.add( new JLabel( " 小数位"));
jxsw = new JTextField(30);
p4.add(jxsw);
// 将功能按钮新增、保存、删除添加到JPanel
JPanel p3 = new JPanel( new FlowLayout(FlowLayout.LEFT));
addBtn = new JButton( "新增");
p3.add(addBtn);
savBtn = new JButton( "保存");
p3.add(savBtn);
delBtn = new JButton( "删除");
p3.add(delBtn);
xmzyBtn = new JButton( "项目转移");
p3.add(xmzyBtn);
// 按钮起初状态:增加可用、保存不可用、删除不可用
this.setButtonState( true, false, false, false);
// JTable实例点击事件处理
jt.addMouseListener( new MouseAdapter(){
public void mouseClicked(MouseEvent e) {
int ind = jt.rowAtPoint(e.getPoint());
if(ind == -1){ return;}
Vector<String> v = (Vector<String>)defaultModel.getDataVector().get(ind);
vector2Comp(v);
setButtonState( true, true, true, true);
setNew( false);
}
});
// 增加按钮点击事件处理
addBtn.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent e) {
initEditItem();
setButtonState( true, false, true, false);
setNew( true);
jt.clearSelection();
}
});
// 删除按钮点击事件处理
delBtn.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent e) {
int ind = jt.getSelectedRow();
if(ind == -1){ return;}
if(!SwingUtils.confirm( "确定要删除选择的数据?")){ return;}
String xmid = jt.getModel().getValueAt(ind, 1).toString();
// 判断项目下是否有数据
String url1 = mainFrame.BASEURL + "xmsz2Action.do?method=getXmszDataNum&xmid=" + xmid;
Integer num = (Integer)SwingUtils.request(url1);
if(num!=0){
SwingUtils.alert( "该项目已经有数据,无法删除!");
return;
}
// 删除项目
String url2 = mainFrame.BASEURL + "xmsz2Action.do?method=deleteXmsz&xmid=" + xmid;
SwingUtils.request(url2, "");
defaultModel.removeRow(ind);
SwingUtils.fitTableColumns(jt);
initEditItem();
setButtonState( true, false, false, false);
setNew( false);
jt.clearSelection();
}
});
// 保存按钮点击事件处理
savBtn.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
if(!isValidate()){ return;}
if(getNew()){
Xmsz xmsz = comp2Xmsz();
xmsz.setXmid( null);
String url = mainFrame.BASEURL + "xmsz2Action.do?method=saveXmsz";
xmsz = (Xmsz)SwingUtils.request(url, xmsz);
defaultModel.addRow(xmsz2Array(xmsz));
SwingUtils.fitTableColumns(jt);
} else{
Xmsz xmsz = comp2Xmsz();
String url = mainFrame.BASEURL + "xmsz2Action.do?method=saveXmsz";
xmsz = (Xmsz)SwingUtils.request(url, xmsz);
int sr = jt.getSelectedRow();
defaultModel.removeRow(sr);
defaultModel.insertRow(sr, xmsz2Array(xmsz));
SwingUtils.fitTableColumns(jt);
}
initEditItem();
setButtonState( true, false, false, false);
setNew( true);
jt.clearSelection();
}
});
xmzyBtn.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
List<TreeNodeObject> list = MyTree.openXmfzJDialog();
long fzid = Long.valueOf(list.get(0).getNodeId());
Xmsz xmsz = comp2Xmsz();
if(fzid==xmsz.getFzid()){
SwingUtils.alert( "项目转移成功。");
return;
}
xmsz.setFzid(fzid);
String url = mainFrame.BASEURL + "xmsz2Action.do?method=saveXmsz";
SwingUtils.request(url, xmsz);
int ind = jt.getSelectedRow();
defaultModel.removeRow(ind);
SwingUtils.alert( "项目转移成功。");
}});
// 将各面板添加到JPanel
JPanel panel = new JPanel( new GridLayout(4, 1));
panel.add(p1);
panel.add(p2);
panel.add(p4);
panel.add(p3);
return panel;
}
(1)创造JPanel实例p1,设置Layout为FlowLayout。创造JTextField的实例jfzid和jxmid,是否可见为false,添加到p1,创造Jxsgs的实例jxmzq和jsjdw,添加到p1。
(2)创造JPanel实例p2,设置Layout为FlowLayout。创造JTextField实例jxmmc,添加到p2。
(3)创造JPanel实例p4,设置Layout为FlowLayout。创造JTextField实例jxsw,添加到p4。
(4)创造JPanel实例p3,设置Layout为FlowLayout。创造JButton实例addBtn、delBtn、savBtn和xmzyBtn,添加到p3。
(5)调用实例方法setButtonState设置JButton的初始状态。
(6)创造JTable的mouseClicked监听实例。调用jt.rowAtPoint(e.getPoint())获得行序号,将这一行的数据填充在Vector实例中,调用vector2Comp将Vector中的数据填充到界面的输入项中。设置JButton的状态,设置new标记为false。
(7)创造JButton addBtn的actionPerformed监听实例。调用initEditItem设置界面输入项为初始值。调用setButtonState设置JButton的状态。调用setNew设置new状态为true。调用jt.clearSelection()清空JTable的选择。
(8)创造JButton delBtn的actionPerformed监听实例。调用jt.getSelectedRow()获得JTable的选择的行序号,调用SwingUtils的类方法confirm确认删除,调用jt.getModel().getValueAt(ind, 1).toString()获得所选择JTable行的xmid,调用xmsz2Action的方法getXmszDataNum获得项目下存在的记录数,如果记录数不为0,那么不能删除这个项目,调用xmsz2Action的方法deleteXmsz删除掉项目。调用defaultModel的方法removeRow删除对应的行。调用SwingUtils的fitTableColumns方法重新调整JTable列的宽度。
(9)创造JButton savBtn的actionPerformed监听实例。调用isValidate检查界面上的输入项数据是否为空等有效性检查,调用getNew获取new的状态值,如果new为true,表示新增状态,如果new为false,表示修改状态。新增状态时,调用comp2Xmsz将界面上的输入项值创建一个Xmsz实例,设置xmid为null,调用xmsz2Action的方法saveXmsz保存Xmsz数据,返回xmid有值的Xmsz实例,调用xmsz2Array转换Xmsz对象为一个数组。调用defaultModel的方法addRow添加到JTable的最后一行。调用SwingUtils的方法fitTableColumns调整JTable列的宽度。修改状态时,不用设置xmid为null,调用removeRow方法将修改的那条记录从JTable中删除,调用方法insertRow将返回的记录插入到JTable中。
(10)创造JButton xmzyBtn的actionPerformed监听实例。调用MyTree的类方法openXmfzJDialog打开Xmfz对话框,调用list.get(0).getNodeId()从返回值的list中获得分组ID,调用comp2Xmsz使用界面上的输入项值创造一个Xmsz实例,如果界面上的fzid值与对话框中选择的分组ID值相同,那么就已经转移成功!如果不相同,那么就修改xmsz实例的分组ID值,调用jt.getSelectedRow()获得JTable的选择行,删除该行。