1,如何让表单中显示单选框呢?
?
步骤一:设置表格数据
在表格的data中设置元素为JRadioButton
public void layoutTable( ) {//TODO Object[][] datas=new Object[4][3]; for(int i=0;i<4;i++){ Object[]objs=new Object[3]; JPanel panel=new JPanel(); panel.add(new JRadioButton()); objs[0]=panel; objs[1]="b"+i; objs[2]="c"+i; datas[i]=objs; } DefaultTableModel model = new DefaultTableModel(datas, columnNames); parameterTable_1.setModel(model); this.parameterTable_1.setRowHeight(30); }
?效果如图:
?
表格并没有显示控件,而是显示控件的对象信息,即调用了对象的toStirng() 方法
?
步骤二:设置setCellEditor
parameterTable_1.getColumnModel().getColumn(0) .setCellEditor(new MyButtonEditor());
?但是还是显示的对象信息,没有达到预期效果.但是鼠标点击时才显示控件
?
步骤三:设置setCellRenderer
parameterTable_1.getColumnModel().getColumn(0) .setCellRenderer(new MyButtonRender());
?达到了预期效果:
?
注意:
1,要同时有控件的cell的setCellEditor 和setCellRenderer
2,MyButtonEditor如下:
package com.yunma.table; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.DefaultCellEditor; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.JTextField; public class MyButtonEditor extends DefaultCellEditor { /** * serialVersionUID */ private static final long serialVersionUID = -6546334664166791132L; private JPanel panel; private JButton button; private Object obj = null; public MyButtonEditor() { // DefautlCellEditor有此构造器,需要传入一个,但这个不会使用到,直接new一个即可。 super(new JTextField()); // 设置点击几次激活编辑。 this.setClickCountToStart(1); // this.initButton(); // // this.initPanel(); // // // 添加按钮。 // this.panel.add(this.button); } private void initButton() { this.button = new JButton(); // 设置按钮的大小及位置。 this.button.setBounds(0, 0, 100, 15); // 为按钮添加事件。这里只能添加ActionListner事件,Mouse事件无效。 this.button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // 触发取消编辑的事件,不会调用tableModel的setValue方法。 // MyButtonEditor.this.fireEditingCanceled(); System.out.println(button.getText() + " is pressed"); // 这里可以做其它操作。 // 可以将table传入,通过getSelectedRow,getSelectColumn方法获取到当前选择的行和列及其它操作等。 } }); } private void initPanel() { this.panel = new JPanel(); // panel使用绝对定位,这样button就不会充满整个单元格。 this.panel.setLayout(null); } /** * 这里重写父类的编辑方法,返回一个JPanel对象即可(也可以直接返回一个Button对象,但是那样会填充满整个单元格) */ @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { // 只为按钮赋值即可。也可以作其它操作。 obj = value; return (JComponent) value; } /** * 重写编辑单元格时获取的值。如果不重写,这里可能会为按钮设置错误的值。 * will be invoke when editable and losing focus */ @Override public Object getCellEditorValue() { return obj; } }
?3,MyButtonRender 代码如下:
package com.yunma.table; import java.awt.Component; import javax.swing.JTable; import javax.swing.table.TableCellRenderer; public class MyButtonRender implements TableCellRenderer { public MyButtonRender() { } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { // 只为按钮赋值即可。也可以作其它操作,如绘背景等。 /*** * code below is useless */ // this.button.addActionListener(new ActionListener() // { // // @Override // public void actionPerformed(ActionEvent e) // { // System.out.println("a:"+button.getText()); // } // }); return (Component)value; } }
?
?
?
原文:http://hw1287789687.iteye.com/blog/2227989