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;
}
}