項目設置

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的選擇行,刪除該行。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章