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 }

 

 界面展示:

swing之JTable小测试(一个单元格添加两个或多个下拉框)

 

 

你可能感兴趣的:(jtable)