总体上而言,Java Swing编程有两大特点:麻烦、效果差。

麻烦是说由于设计器的使用不方便(如果您希望使用窗体设计器通过快速拖拽控件建立您的Java Swing GUI程序,请您使用MyEclipse 8.5以上版本,并且需要最高使用权限),所有代码都得手写,如果没有好的编码规范和注释习惯。自己都会被代码淹没。效果差是指运行时的界面。具体的您可以自己尝试发现。

通过一段代码来创建属于我们的窗体:

  import javax.swing.JFrame;
2
3 /**
4 * 我的第一个Java窗体
5 *
6 * @author Johness
7 *
8 */
9 public class MyJFrame extends JFrame{
10
11
12
13 }

然后通过main方法来测试:

运行后,窗体在屏幕左上角显现并且是最小化的形式。那么关于设置窗体的显示就不再赘述了,值得注意的是窗体的布局必须设置。

小贴士:使用setLayout设置布局,参数传递null;

讨论一下怎样在窗体的表格中显示复选框。即实现如下效果:

小贴士二:使用add方法向控件添加内容控件。

①首先我们需要面板(JPanel)或其他容器控件承载表格(JTable),值得一提的是:由于窗体本身就是容器型控件,您可以考虑将表格单个地放置在窗体上。

②然后我们需要将表格对象创建出来并放入该容器控件,(如JDK_API_1_6_zh_CN.CHM)创建表格控件。值得一提的是在这七个构造方法中,设计器(如果您使用了MyEclipse)使用的是JTable(TableModel dm)这个版本。而一般情况使用JTable(Vector rowData,Vector columnNames)

在Java方法中,如果参数需要传递接口,可以在调用方法时传递一个(匿名)对象,该对象是一个不具名的类的实例,该对象所属类实现了方法参数的接口。比如上面的例子JTable(TableModel dm),这是JTable的构造方法,需要的是一个TableModel接口类型的参数(这里只是举例,实际运用比较复杂),我们可以使用如下写法:JTable table = new JTable(new TableModel());

正确写法如下:

 import javax.swing.*;
2 import javax.swing.event.*;
3 import javax.swing.table.*;
4
5
6 public class MyFirstJFrame extends JFrame {
7 public MyFirstJFrame() {
8 setLayout(null);
9
10 JTable table = new JTable(new TableModel(){
11
12 @Override
13 public int getRowCount() {
14 // TODO Auto-generated method stub
15 return 0;
16 }
17
18 @Override
19 public int getColumnCount() {
20 // TODO Auto-generated method stub
21 return 0;
22 }
23
24 @Override
25 public String getColumnName(int columnIndex) {
26 // TODO Auto-generated method stub
27 return null;
28 }
29
30 @Override
31 public Class<?> getColumnClass(int columnIndex) {
32 // TODO Auto-generated method stub
33 return null;
34 }
35
36 @Override
37 public boolean isCellEditable(int rowIndex, int columnIndex) {
38 // TODO Auto-generated method stub
39 return false;
40 }
41
42 @Override
43 public Object getValueAt(int rowIndex, int columnIndex) {
44 // TODO Auto-generated method stub
45 return null;
46 }
47
48 @Override
49 public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
50 // TODO Auto-generated method stub
51
52 }
53
54 @Override
55 public void addTableModelListener(TableModelListener l) {
56 // TODO Auto-generated method stub
57
58 }
59
60 @Override
61 public void removeTableModelListener(TableModelListener l) {
62 // TODO Auto-generated method stub
63
64 }});
65 }
66 }

解释一下这些代码:首先是JTable table = new JTable(new TableModel(){});可以看出来,大括号中间的部分是一些需要重写的方法。new ……()是构造方法,调用来构造一个匿名对象,其后的{}不是Java的特殊语法,但是Java中可以将方法定义在里面(这里的方法生命周期与匿名对象相 同),当然,此处是用于实现接口的方法。TableModel我们可以在其前面补充一个不存在的类类名,比如MyTableModel。new MyTableModel:TableModel(){}也就是说大家可以想象成(new TableModel(){})是在声明一个匿名对象,它属于一个不具名的类(如MyTableModel),该类实现了TableModel接口。而由 于语法限制,不能全部写出来所以省略了[MyTableModel:]。

③设置表格渲染。在详细说明之前先解释一下JTable的显示原理:

首先是数据来源,您使用JTable的构造方法,大部分重载中参数即包含了数据,比如JTable(VectorrowData, Vector columnNames)中Vector保存的数据(Vector相当于数组)。

  其次是表格样式,表格将数据和如何显示数据(比如列数量、列名称、是否可编辑)保存在其数据模版中,该模版实现自接口TableModel。

  最后,表格(每一个单元格)可以设置渲染效果。

完整的代码如下:

 import java.awt.Component;
2 import java.awt.event.ActionEvent;
3 import java.awt.event.ActionListener;
4
5 import javax.swing.*;
6 import javax.swing.table.*;
7
8
9 public class MyFirstJFrame extends JFrame {
10
11 // 作为测试的main方法
12 public static void main(String[] args) {
13 new MyFirstJFrame().setVisible(true);
14 }
15
16 /**
17 * 构造方法
18 */
19 public MyFirstJFrame() {
20 InitialComponent();
21 }
22
23 /**
24 * 初始化组件的方法
25 */
26 private void InitialComponent(){
27 // 设置窗体参数
28
29 // 设置布局模式
30 setLayout(null);
31 // 设置窗体大小
32 setSize(480, 360);
33 // 设置窗体居中(非常规方法)
34 setLocationRelativeTo(null);
35 // 关闭窗体退出程序
36 setDefaultCloseOperation(DISPOSE_ON_CLOSE);
37
38 // 初始化面板
39 panel = new JPanel();
40 panel.setSize(this.getWidth(), this.getHeight());
41 panel.setLocation(0,0);
42 panel.setLayout(null);
43
44 // 初始化表格
45 table = new JTable(new DefaultTableModel(new Object[][]{{"第一行"},{"第二行"},{"第三行"},{"第四行"}}, new String[]{"测试行1","测试行2"}){
46 /* (non-Javadoc)
47 * 重写方法,判断表单元格是否可编辑
48 * 可以通过row和column索引判断某一个单元格是否可编辑
49 * 此处设为都不可编辑
50 * @see javax.swing.table.DefaultTableModel#isCellEditable(int, int)
51 */
52 @Override
53 public boolean isCellEditable(int row, int column) {
54 return false;
55 }
56 });
57
58 // 开始向表格中添加复选框(注意:此示例较为简单,缺省很多判断,也没有动态代码支持)
59 // 通过设置列渲染
60
61 // 方法一:直接方式 使用TableColumn的setCellRenderer方法(推荐)
62 // 此方法可以设置某一列的渲染(即使用某一个组件--即控件来显示单元格数据)
63 table.getColumnModel().getColumn(1).setCellRenderer(new TableCellRenderer(){
64
65 /*(non-Javadoc)
66 * 此方法用于向方法调用者返回某一单元格的渲染器(即显示数据的组建--或控件)
67 * 可以为JCheckBox JComboBox JTextArea 等
68 * @see javax.swing.table.TableCellRenderer#getTableCellRendererComponent(javax.swing.JTable, java.lang.Object, boolean, boolean, int, int)
69 */
70 @Override
71 public Component getTableCellRendererComponent(JTable table,
72 Object value, boolean isSelected, boolean hasFocus,
73 int row, int column) {
74 // 创建用于返回的渲染组件
75 JCheckBox ck = new JCheckBox();
76 // 使具有焦点的行对应的复选框选中
77 ck.setSelected(isSelected);
//设置背景颜色 这里是设置jcheckbox的背景颜色 直接设置为透明,我这里是用了一种明暗交替的颜色转换,所以背景颜色设置了一下
ck.setOpaque(false);
78 // 设置单选box.setSelected(hasFocus);
79 // 使复选框在单元格内居中显示
80 ck.setHorizontalAlignment((int) 0.5f);
81 return ck;
82 }});
83
84 // 方法二:先设置列编辑器,然后设置单元格渲染
85 // 设置列编辑器
86 // 在以复选框为对象设置列编辑器时,必须保证该列能够被编辑,否则无法更改状态
87 // (此步骤可以省略,省略时不要忘记将列设为不可编辑)
88 // table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(new JCheckBox()));
89
90 // 设置单元格渲染(这里是设置表格级别的渲染)
91 /*table.setDefaultRenderer(Object.class, new TableCellRenderer(){
92
93 @Override
94 public Component getTableCellRendererComponent(JTable table,
95 Object value, boolean isSelected, boolean hasFocus,
96 int row, int column) {
97 // 判断是否为需要渲染的列
98 if(column == 1){
99 // 和方法一基本一致
100 JCheckBox box = new JCheckBox();
101 box.setSelected(isSelected);
102 // 设置单选box.setSelected(hasFocus);
103 box.setHorizontalAlignment((int) CENTER_ALIGNMENT); // 0.5f
104 return box;
105 }
106 // 如果不是需要渲染的列,封装文本域显示数据
107 return new JTextArea(value.toString());
108 }});*/
109
110 // 在多选是需要按住Ctrl键或者鼠标按住拖过连续的需要选中的行,应该给用户说明
111 // 第一种方法是被推荐的,因为它具有选中的高亮显示,界面能更加友好
112 table.setSize(panel.getWidth(),panel.getHeight() - 90);
113 table.setLocation(0, 0);
114
115
116 btn = new JButton("Test");
117 btn.setSize(80,40);
118 btn.setLocation((panel.getWidth()) / 2 - 40, panel.getHeight() - 80);
119
120 // 按钮点击时显示当前选中项
121 btn.addActionListener(new ActionListener(){
122
123 @Override
124 public void actionPerformed(ActionEvent e) {
125 for(int rowindex : table.getSelectedRows()){
126 JOptionPane.showMessageDialog(null, rowindex + " " + table.getValueAt(rowindex, 0));
127 }
128 }});
129
130 panel.add(table);
131 panel.add(btn);
132 this.add(panel);
133
134 }
135
136 // 定义一些必要的组件
137 private JPanel panel;
138 private JTable table;
139 private JButton btn;
140 }

java swing 添加 jcheckbox复选框的更多相关文章

  1. 通过编写串口助手工具学习MFC过程——(五)添加CheckBox复选框

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  2. Dtree 添加 checkbox 复选框 可以默认选中

    一:目标 要实现用一个树形结构的展示数据,每个节点(除了根节点)前有一个checkbox,同时,点击父节点,则子节点全选或者全不选,当选中了全部子节点,父节点选中:如下图所示: 同时可以在创建的时候, ...

  3. C# dev gridcontrol中添加checkbox复选框

    文章来源 csdn weinierbian http://blog.csdn.net/weinierbian/article/details/6255402 添加一列,FieldName为 " ...

  4. DevExpress GridControl使用教程:之 添加 checkbox 复选框

    添加一列,FieldName为"FLAG",将ColumnEdit设置为复选框样式. gridview1   =>optionsbehavior =>  editabl ...

  5. DevExpress gridcontrol添加了复选框删除选中的多行/批量删除的方法

    思路:遍历gridView1的每一行,该行中checkbox列被勾选则设置该行为选中状态,执行gridView1提供的DeleteSelectedRows方法则可 public void DoDele ...

  6. QListWidget的QComboBox下拉列表添加复选框及消息处理

    要在QComboBox下拉列表项中添加复选框,并进行消息处理,在网上搜索了很久没有找到太多有用的信息和实际的例子,但从中还是找到了一些提示性的资料,根据这些简短的介绍,最终实现了这个功能. QComb ...

  7. 雷林鹏分享:jQuery EasyUI 数据网格 - 添加复选框

    jQuery EasyUI 数据网格 - 添加复选框 本实例演示如何放置一个复选框列到数据网格(DataGrid).通过复选框,用户将可以选择 选中/取消选中 网格行数据. 为了添加一个复选框列,我们 ...

  8. 复选框批量删除操作-jquery方式

    1.首先在页面添加一个批量删除的按钮:<li class="btns"><input id="deleteSubmit" class=&quo ...

  9. QTableWidget自定义表头QHeaderView加全选复选框

    1         QTableWidget自定义表头QHeaderView加全选复选框 在使用QTableWidget时需要在表头添加全选复选框,但是默认的表头无法添加复选框,只能用图片画上去一个复 ...

随机推荐

  1. 【转】一个工具类(可以控制多层嵌套的movieClip)

    好多人也应该遇到和我一样的问题,当设计师给了我们一个多层嵌套的movieClip时,我们在写代码时无法将movieClip完全停止掉,主要是基于好多movieClip有深层嵌套,主时间轴不在最上层导致 ...

  2. 管中窥豹——从对象的生命周期梳理JVM内存结构、GC调优、类加载、AOP编程及性能监控

    如题,本文的宗旨既是透过对象的生命周期,来梳理JVM内存结构及GC相关知识,并辅以AOP及双亲委派机制原理,学习不仅仅是海绵式的吸收学习,还需要自己去分析why,加深对技术的理解和认知,祝大家早日走上 ...

  3. (iOS)关于UITableView设置contentsize(原创)

    由于UITableView是继承自UIScrollView的,所以他是可以设置contentsize的. 但是,我在试验的过程中,初始化UITableView实例后,直接设置它的contentsize ...

  4. Redis基础学习(四)—Redis的持久化

    一.概述      Redis的强大性能很大程度上都是因为数据时存在内存中的,然而当Redis重启时,所有存储在内存中的数据将会丢失,所以我们要将内存中的数据持久化. Redis支持两种数据持久化的方 ...

  5. 基于Spring开发——自定义标签及其解析

    1. XML Schema 1.1 最简单的标签 一个最简单的标签,形式如: <bf:head-routing key="1" value="1" to= ...

  6. 简单 fibonacci 函数

    public static int fibonacci(int n){  if(n<=1) return 1;  else {     return fibonacci(n-1)+fibonac ...

  7. jsp之session对象

    jsp之session对象:一:概念session对象可以在应用程序的web页面之间跳转时保存用户的信息,使整个用户会话一直存在,直到关闭浏览器或是销毁session.session的生命周期:20~ ...

  8. 使用charles抓取htpps的方法

    自己整理的步骤做个记录 1.下载证书,官方地址:http://www.charlesproxy.com/ssl.zip 可直接点击链接下载:http://charlesproxy.com/getssl ...

  9. [ SharePoint ADFS 开发部署系列 (一)]

    前言 本文完全原创,转载请说明出处,希望对大家有用. 随着企业信息化建设逐渐成熟,基于微软体系的企业内部系统架构在众多企业中得到应用,随之而来的用户统一身份认证(SSO)问题成为企业IT部门急需解决的 ...

  10. 开始使用gentoo linux——gentoo安装笔记(上)

    gentoo linux安装笔记(上) 家里有一台破旧的富士通笔记本,08年至今质量依然杠杠的,但是性能已经不能和现代超极本同日而语,装上了ubuntu更是不敢恭维,别提gnome和kde的linux ...