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 }

 

 界面展示:

 

 

posted @ 2012-09-18 11:05  FC WORLD!!!  阅读(...)  评论(...编辑  收藏