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) {}
});
}
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。
(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;
}
// 將輸入項組件添加到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;
}
(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的選擇行,刪除該行。