今天主要是將以下界面作成JAVA版的,我作這個Winform的目的並非說以爲winform有前途,而是在練手,爲了後面web和Andriod開發打點基礎。java
那作好的java界面以下node
OK,畫好了,看代碼,首先是綁定樹的一個代碼web
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數據。sql
節點的數據使用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類實現。app
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的列頭不能顯示,因此須要加入下面的代碼ide
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。接下里咱們看刪除按鈕的代碼ui
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方法this
table = new JTable() { public boolean isCellEditable(int row, int column) { if (column == 0) { return true; } else return false; } };
OK,今天就講到這裏,洗洗睡!orm