重拾JAVA之WinForm实战之(三)

简介:

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

175324736.png

那做好的java界面如下

221551595.png

OK,画好了,看代码,首先是绑定树的一个代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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这个类类记录的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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类实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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的列头不能显示,所以需要加入下面的代码

1
2
3
4
5
6
7
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。接下里我们看删除按钮的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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方法

1
2
3
4
5
6
7
8
table =  new  JTable() {
             public  boolean  isCellEditable( int  row,  int  column) {
                 if  (column ==  0 ) {
                     return  true ;
                 else
                     return  false ;
             }
         };

OK,今天就讲到这里,洗洗睡!



本文转自 BruceAndLee 51CTO博客,原文链接:http://blog.51cto.com/leelei/1330835,如需转载请自行联系原作者


相关文章
|
1月前
|
Java 应用服务中间件 开发工具
苍穹外卖》电商实战项目(java)知识点整理(上)
苍穹外卖》电商实战项目(java)知识点整理(上)
189 3
|
2月前
|
Java 测试技术 Maven
JAVA单元测试概念与实战
单元测试是软件开发中的一个测试方法,用于验证软件代码中最小的、独立的单元是否按照预期工作。在Java中,这通常指的是单个的方法或者一个类的个别功能。单元测试的目的是隔离代码的每个部分,并确保各个部分是正确的。
51 4
|
3月前
|
Java 关系型数据库 MySQL
兴奋!阿里巴巴首推“Java进阶必备宝典”,理论到实战,一键搞定
作为一名Java方向的程序员,打好夯实的基础是非常重要的,现在大厂面试对于程序员基础知识的掌握考察也越来越严格,虽然说现在技术更新比较快,但基础扎实才能够更深入的去理解每一个知识技术点。
|
17天前
|
设计模式 安全 Java
Java并发编程实战:使用synchronized关键字实现线程安全
【4月更文挑战第6天】Java中的`synchronized`关键字用于处理多线程并发,确保共享资源的线程安全。它可以修饰方法或代码块,实现互斥访问。当用于方法时,锁定对象实例或类对象;用于代码块时,锁定指定对象。过度使用可能导致性能问题,应注意避免锁持有时间过长、死锁,并考虑使用`java.util.concurrent`包中的高级工具。正确理解和使用`synchronized`是编写线程安全程序的关键。
|
3月前
|
传感器 自动驾驶 算法
JAVA实战演练之自动驾驶系统
JAVA实战演练之自动驾驶系统
|
2月前
|
监控 IDE Java
Java项目调试实战:如何高效调试Spring Boot项目中的GET请求,并通过equalsIgnoreCase()解决大小写不一致问题
Java项目调试实战:如何高效调试Spring Boot项目中的GET请求,并通过equalsIgnoreCase()解决大小写不一致问题
40 0
|
4天前
|
存储 Java 数据库连接
java DDD 领域驱动设计思想的概念与实战
【4月更文挑战第19天】在Java开发中,领域驱动设计(Domain-Driven Design, DDD) 是一种软件设计方法论,强调以领域模型为中心的软件开发。这种方法通过丰富的领域模型来捕捉业务领域的复杂性,并通过软件满足核心业务需求。领域驱动设计不仅是一种技术策略,而且还是一种与业务专家紧密合作的思维方式
19 2
|
14天前
|
Java API 开发者
Java 8新特性之函数式编程实战
【4月更文挑战第9天】本文将深入探讨Java 8的新特性之一——函数式编程,通过实例演示如何运用Lambda表达式、Stream API等技术,提高代码的简洁性和执行效率。
|
24天前
|
存储 安全 Java
【Java技术专题】「Guava开发指南」手把手教你如何进行使用Guava工具箱进行开发系统实战指南(不可变集合篇)
【Java技术专题】「Guava开发指南」手把手教你如何进行使用Guava工具箱进行开发系统实战指南(不可变集合篇)
30 1
|
24天前
|
Java API Apache
【Java技术专题】「Guava开发指南」手把手教你如何进行使用Guava工具箱进行开发系统实战指南(基础编程篇)
【Java技术专题】「Guava开发指南」手把手教你如何进行使用Guava工具箱进行开发系统实战指南(基础编程篇)
43 0

热门文章

最新文章