java swing表格中包含单选框

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

猜你喜欢

转载自hw1287789687.iteye.com/blog/2227989