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