今天主要是将如下界面做成JAVA版的,我做这个Winform的目的并不是说觉得winform有前途,而是在练手,为了后面web和Andriod开发打点基础。

那做好的java界面如下

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
columnList = new ArrayList
(); 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
columnList) { Vector
columnHeads = new Vector
(); Vector
rows = new Vector
(); try { ResultSetMetaData rsmd = res.getMetaData(); for (int i = 1; i <= rsmd.getColumnCount(); i++) { columnHeads.addElement(rsmd.getColumnName(i)); } while (res.next()) { Vector
v = new Vector
(); 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,今天就讲到这里,洗洗睡!