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