重拾JAVA之WinForm實戰之(三)

今天主要是將如下界面做成JAVA版的,我做這個Winform的目的並不是說覺得winform有前途,而是在練手,爲了後面web和Andriod開發打點基礎。

175324736.png

那做好的java界面如下

221551595.png

OK,畫好了,看代碼,首先是綁定樹的一個代碼

public void BuildCodeTree() throws SQLException {
        treeCode.removeAll();
        DefaultMutableTreeNode top = new DefaultMutableTreeNode(new NodeData(
                "root", "系統參數"));
        String sql = "SELECT Distinct ename,cname FROM dbo.Codes WITH(NOLOCK)";
        ResultSet res = JDBCSqlHelper.query(sql);
        try {
            while (res.next()) {
                DefaultMutableTreeNode childTreeNode = new DefaultMutableTreeNode(
                        new NodeData(res.getString("ename"),
                                res.getString("cname")));
                top.add(childTreeNode);
            }
            this.treeCode = new JTree(top);
            treeCode.setBounds(10, 39, 146, 278);
            treeCode.addTreeSelectionListener(new TreeSelectionListener() {
                public void valueChanged(TreeSelectionEvent e) {
                    DefaultMutableTreeNode node = (DefaultMutableTreeNode) treeCode
                            .getLastSelectedPathComponent();
                    String nodeName = ((NodeData) node.getUserObject()).ename;
                    if (nodeName == "root")
                        return;
                    String sql = "SELECT 0 as bit,data,ename,cname,display_content  FROM dbo.Codes WHERE ename='"
                            + nodeName + "'";
                    ResultSet res = JDBCSqlHelper.query(sql);
                    List<String> columnList = new ArrayList<String>();
                    columnList.add("選擇");
                    columnList.add("數據值");
                    columnList.add("英文代碼");
                    columnList.add("中文代碼");
                    columnList.add("顯示值");
                    DataFillHelper.FillTable(res, table, columnList);
                    table.getColumnModel().getColumn(0)
                            .setCellRenderer(new TableCellRenderer() {
                                public Component getTableCellRendererComponent(
                                        JTable table, Object value,
                                        boolean isSelected, boolean hasFocus,
                                        int row, int column) {
                                    JCheckBox ck = new JCheckBox();
                                    ck.setSelected(isSelected);
                                    ck.requestFocus(hasFocus);
                                    ck.setHorizontalAlignment((int) 0.5f);
                                    return ck;
                                }
                            });
                    table.getColumnModel().getColumn(0).setWidth(10);
                }
            });
            treeCode.setBorder(new LineBorder(new Color(0, 0, 0)));
            contentPane.add(treeCode);
            // treeCode.setCellRenderer(new MyRenderer());
            treeCode.setShowsRootHandles(true);
            treeCode.setRootVisible(true);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            res.close();
        }
    }

這段代碼首先會從數據庫讀出要加載的樹的數據,由於這裏的樹只有兩級,所以代碼很簡單。先定義一個root節點,然後將數庫中的讀出的節點加載在他下面。這樣樹就形成了,然後在樹節點被選擇時註冊一個事件,事件中,如果選擇的是root節點,則不加載右邊的Jtable數據。否則根據英文代碼加載左邊的Jtable數據。

節點的數據使用NodeData這個類類記錄的

private class NodeData {
        private String ename;
        public String getEname() {
            return ename;
        }
        public void setEname(String ename) {
            this.ename = ename;
        }
        private String cname;
        public String getCname() {
            return cname;
        }
        public void setCname(String cname) {
            this.cname = cname;
        }
        public NodeData() {
        }
        public NodeData(String ename, String cname) {
            this.setEname(ename);
            this.setCname(cname);
        }
        public String toString() {
            return cname;
        }
    }

左邊的JTable數據的加載通過DataFillHelper類實現。

public class DataFillHelper {
    public static void FillTable(ResultSet res, JTable jTable,List<String> columnList) {
        Vector<String> columnHeads = new Vector<String>();
        Vector<Vector> rows = new Vector<Vector>();
        try {
          ResultSetMetaData rsmd = res.getMetaData();
          for (int i = 1; i <= rsmd.getColumnCount(); i++) {
            columnHeads.addElement(rsmd.getColumnName(i));
          }
          while (res.next()) {
            Vector<String> v = new Vector<String>();
            for (int i = 1; i <= rsmd.getColumnCount(); i++) {
              v.addElement(res.getString(i));
            }
            rows.add(v);
          }
          DefaultTableModel model = new DefaultTableModel(rows, columnHeads);
          jTable.setModel(model);
          makeFace(jTable);
          for (int i = 0; i < jTable.getColumnModel().getColumnCount(); i++) {
            jTable.getColumnModel().getColumn(i).setHeaderValue(
                    columnList.get(i));
          }
                                                                                                                                                                                                                                                    
        } catch (SQLException e) {
          // TODO 自動生成 catch 塊
          e.printStackTrace();
        }
      }
                                                                                                                                                                                                                                              
    public static void makeFace(JTable table) {
        try {
            DefaultTableCellRenderer tcr = new DefaultTableCellRenderer() {
                public Component getTableCellRendererComponent(JTable table,
                        Object value, boolean isSelected, boolean hasFocus,
                        int row, int column) {
                    if (row % 2 == 0)
                        setBackground(new Color(206, 231, 255));
                    else if (row % 2 == 1)
                        setBackground(Color.white);
                    return super.getTableCellRendererComponent(table, value,
                            isSelected, hasFocus, row, column);
                }
            };
          for (int i = 0; i < table.getColumnCount(); i++) {
            table.getColumn(table.getColumnName(i)).setCellRenderer(tcr);
          }
        } catch (Exception ex) {
          ex.printStackTrace();
        }
      }
}

這裏就不多做解釋,解釋我也解釋不清楚。OK,在這裏需要說明的是如果將jtable放在JScrollPane中,可能會導致jtable的列頭不能顯示,所以需要加入下面的代碼

table = new JTable();
        table.setBorder(UIManager.getBorder("FormattedTextField.border"));
        table.setBackground(Color.WHITE);
        JScrollPane scrollPane = new JScrollPane(table);
        scrollPane.setBounds(166, 39, 430, 278);
        contentPane.add(scrollPane);
        table.setFillsViewportHeight(true);

就是那句SetFillsViewportHeight。OK,接下來我們看一下界面上的刪除按鈕功能。在前面我們已經在JTable中加入了checkBox。接下里我們看刪除按鈕的代碼

private void DeleteCodes() {
        int[] rowIndexs = table.getSelectedRows();
                                                                                       
        if(rowIndexs.length==0){
            MessageHelper.ShowMessage("請選擇要刪除的數據!");
            return;
        }
        StringBuffer strBuffer = new StringBuffer();
        for (int i : rowIndexs) {
            Object data = table.getValueAt(i, 1);
            Object ename = table.getValueAt(i, 2);
            strBuffer.append("'");
            strBuffer.append(data.toString() + ename.toString());
            strBuffer.append("',");
        }
        strBuffer.setLength(strBuffer.length() - 1);
        String sql = "DELETE FROM dbo.Codes WHERE (data+ename) IN ("
                + strBuffer.toString() + ")";
        MessageHelper.ShowMessage(sql);
        JDBCSqlHelper.update(sql);
    }

還有一個要說的是,我們並不想讓後後面的列被編輯,我們只想第一列被編輯,所以需要覆蓋IsCellEditable方法

table = new JTable() {
            public boolean isCellEditable(int row, int column) {
                if (column == 0) {
                    return true;
                } else
                    return false;
            }
        };

OK,今天就講到這裏,洗洗睡!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章