swing之JTable小测试(一个单元格添加两个或多个下拉框)
View Code
1 package com.copy; 2 3 import java.awt.BorderLayout; 4 import java.awt.Color; 5 import java.awt.Component; 6 import java.awt.event.ActionEvent; 7 import java.awt.event.ActionListener; 8 import java.util.Vector; 9 10 import javax.swing.DefaultCellEditor; 11 import javax.swing.JButton; 12 import javax.swing.JComboBox; 13 import javax.swing.JFrame; 14 import javax.swing.JPanel; 15 import javax.swing.JScrollPane; 16 import javax.swing.JTable; 17 import javax.swing.ListSelectionModel; 18 import javax.swing.event.ListSelectionEvent; 19 import javax.swing.event.ListSelectionListener; 20 import javax.swing.table.AbstractTableModel; 21 import javax.swing.table.DefaultTableCellRenderer; 22 import javax.swing.table.TableColumnModel; 23 24 /** 25 * 26 * @项目名称:TestTable 27 * @类名称:Test 28 * @类描述: swing 三层演示 以及 Jtable小测试 29 * @创建人:wangyongfei 30 * @创建时间:2012-9-18 上午10:57:40 31 * @修改人:wangyongfei 32 * @修改时间:2012-9-18 上午10:57:40 33 * @修改备注: 34 * @version 35 */ 36 public class TestTable { 37 38 private JFrame frame; 39 private JTable table; 40 private Table_Model model; 41 private JScrollPane s_pan; 42 private JButton btnDelete; 43 private JButton btnAdd; 44 private JButton btnSave; 45 private JPanel pane; 46 private JComboBox sexBox; 47 private JBoxTestCell jc; 48 49 public TestTable() { 50 frame = new JFrame("JTable测试"); 51 pane = new JPanel(); 52 btnDelete = new JButton("删除"); 53 btnDelete.addActionListener(new ActionListener() { 54 public void actionPerformed(ActionEvent e) { 55 int row = table.getSelectedRow(); 56 removeData(row); 57 } 58 }); 59 btnAdd = new JButton("添加"); 60 btnAdd.addActionListener(new ActionListener() { 61 public void actionPerformed(ActionEvent e) { 62 addData(); 63 } 64 }); 65 btnSave = new JButton("保存"); 66 btnSave.addActionListener(new ActionListener() { 67 public void actionPerformed(ActionEvent e) { 68 saveData(); 69 } 70 }); 71 pane.add(btnDelete); 72 pane.add(btnAdd); 73 pane.add(btnSave); 74 model = new Table_Model(20); 75 table = new JTable(model); 76 77 //得到选中的行号 78 ListSelectionModel model = table.getSelectionModel(); 79 model.addListSelectionListener(new ListSelectionListener() { 80 @Override 81 public void valueChanged(ListSelectionEvent e) { 82 if(table.getSelectedRowCount() > 0) 83 System.out.println(table.getSelectedRow()); 84 } 85 }); 86 table.setRowHeight(30); 87 table.setGridColor(Color.red); 88 table.setBackground(Color.white); 89 try { 90 table.setDefaultRenderer(Class.forName("java.lang.Object"), new TableRender()); 91 } catch (ClassNotFoundException e1) { 92 e1.printStackTrace(); 93 } 94 95 jc = new JBoxTestCell(); 96 TableColumnModel tcm = table.getColumnModel(); 97 tcm.getColumn(3).setCellEditor(jc); 98 tcm.getColumn(0).setPreferredWidth(50); 99 tcm.getColumn(1).setPreferredWidth(100); 100 101 String[] sex = { "女", "男", "未知" }; 102 sexBox = new JComboBox(sex); 103 sexBox.setSelectedIndex(0); 104 TableColumnModel sexT = table.getColumnModel(); 105 sexT.getColumn(2).setCellEditor(new DefaultCellEditor(sexBox)); 106 107 s_pan = new JScrollPane(table); 108 frame.getContentPane().add(s_pan, BorderLayout.CENTER); 109 frame.getContentPane().add(pane, BorderLayout.NORTH); 110 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 111 frame.setSize(300, 200); 112 frame.setVisible(true); 113 114 } 115 116 private void addData() { 117 Object[] str = {"小张", "", ""}; 118 model.addRow(str); 119 table.updateUI(); 120 } 121 122 /** 123 * 清除选中行 124 * @param row 125 */ 126 private void removeData(int row) { 127 model.removeRows(row); 128 table.updateUI(); 129 } 130 131 /** 132 * 打印到控制台 133 */ 134 private void saveData() { 135 136 int col = model.getColumnCount(); 137 int row = model.getRowCount(); 138 int i = 0; 139 while(i < col){ 140 System.out.print(model.getColumnName(i) + "\t"); 141 i++; 142 } 143 System.out.print("\r\n"); 144 int k = 0, j = 0; 145 while(k < row){ 146 while(j < col){ 147 System.out.print(model.getValueAt(k, j) + "\t"); 148 j++; 149 } 150 k++; 151 } 152 System.out.print("\r\n"); 153 } 154 155 public static void main(String args[]) { 156 new TestTable(); 157 } 158 159 } 160 161 162 /** 163 *模型 164 */ 165 class Table_Model extends AbstractTableModel { 166 private Vector vector = null; 167 private String[] titleName = { "编号", "姓名", "性别", "爱好" }; 168 public Table_Model() { 169 vector = new Vector(); 170 } 171 public Table_Model(int count) { 172 vector = new Vector(count); 173 } 174 175 public void addRow(Object[] str) { 176 177 Vector v = new Vector(titleName.length); 178 v.add(0, new Integer(vector.size())); 179 for(int i = 1; i <= str.length; i++){ 180 v.add(i, str[i-1]); 181 182 } 183 vector.add(v); 184 } 185 186 /** 187 * 删除选中行 188 * @param row 189 */ 190 public void removeRows(int row) { 191 vector.remove(row); 192 } 193 194 /** 195 * 是否为可编辑 196 */ 197 public boolean isCellEditable(int rowIndex, int columnIndex) { 198 if (columnIndex == 0) { 199 return false; 200 } 201 return true; 202 } 203 204 /** 205 * 使修改的内容生效 206 */ 207 public void setValueAt(Object value, int row, int col) { 208 ((Vector) vector.get(row)).remove(col); 209 ((Vector) vector.get(row)).add(col, value); 210 this.fireTableCellUpdated(row, col);//通知所有侦听器,已更新 [row, column] 处的单元格值。 211 } 212 213 public String getColumnName(int col) { 214 return titleName[col]; 215 } 216 217 public int getColumnCount() { 218 return titleName.length; 219 } 220 221 public int getRowCount() { 222 return vector.size(); 223 } 224 225 /** 226 * 返回 col 和 row 位置的单元格值。 227 */ 228 public Object getValueAt(int row, int col) { 229 return ((Vector) vector.get(row)).get(col); 230 } 231 232 /** 233 * 针对列中所有的单元格值,返回最具体的超类 234 * 返回数据类型 235 */ 236 public Class getColumnClass(int col) { 237 return getValueAt(0, col).getClass(); 238 } 239 240 } 241 /** 242 * 视图处理 243 */ 244 class TableRender extends DefaultTableCellRenderer{ 245 private int row; 246 private int column; 247 private String value; 248 public Component getTableCellRendererComponent(JTable table, Object value, 249 boolean isSelected, boolean hasFocus, int row, int column) { 250 Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 251 if(hasFocus){ 252 this.row = row; 253 this.column = column; 254 this.value = value.toString(); 255 // cell.setBackground(Color.RED); 256 // cell.setForeground(Color.BLACK); 257 } 258 return cell; 259 } 260 public int getSelectedRow(){ 261 return row; 262 } 263 public int getSelectedColumn(){ 264 return column; 265 } 266 public String getSelectedValue(){ 267 return value; 268 } 269 270 }
View Code
1 package com.copy; 2 3 import java.awt.BorderLayout; 4 import java.awt.Component; 5 import java.awt.Dimension; 6 import java.util.EventObject; 7 8 import javax.swing.AbstractCellEditor; 9 import javax.swing.JComboBox; 10 import javax.swing.JPanel; 11 import javax.swing.JTable; 12 import javax.swing.table.TableCellEditor; 13 14 public class JBoxTestCell extends AbstractCellEditor implements 15 TableCellEditor { 16 int row; 17 private JTable table; 18 private JPanel p1; 19 private JComboBox jbxType1; 20 private JComboBox jbxType2; 21 private Object val = null; 22 public JBoxTestCell() { 23 p1 = new JPanel(new BorderLayout()); 24 p1.setPreferredSize(new Dimension(300, 30)); 25 String[] interest1 = { "足球1", "游泳1", "拉丁舞1", "击剑1", "马术1", "读书1", "旅游1" }; 26 jbxType1 = new JComboBox(interest1); 27 jbxType1.setPreferredSize(new Dimension(80,25)); 28 29 String[] interest2 = { "足球2", "游泳2", "拉丁舞2", "击剑2", "马术2", "读书2", "旅游2" }; 30 jbxType2 = new JComboBox(interest2); 31 jbxType2.setPreferredSize(new Dimension(80,25)); 32 jbxType1.setSelectedIndex(0); 33 jbxType2.setSelectedIndex(0); 34 p1.add(jbxType1, BorderLayout.WEST); 35 p1.add(jbxType2, BorderLayout.EAST); 36 } 37 38 @Override 39 public boolean isCellEditable(EventObject anEvent) { 40 return true; 41 } 42 public void showSave() { 43 jbxType1.setVisible(true); 44 jbxType2.setVisible(true); 45 } 46 47 public Object getCellEditorValue() { 48 String v1 = jbxType1.getSelectedItem().toString(); 49 String v2 = jbxType2.getSelectedItem().toString(); 50 return v1+", "+v2; 51 52 } 53 54 public Component getTableCellEditorComponent(JTable table, Object value, 55 boolean isSelected, int row, int column) { 56 this.table = table; 57 this.row = row; 58 val = value; 59 return this.p1; 60 } 61 }
界面展示: