奇技淫巧 JTable放自定义组件

来源:互联网 发布:linux 反汇编工具 编辑:程序博客网 时间:2024/06/01 11:07

话不多说,放代码
主界面

import java.awt.BorderLayout;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import javax.swing.DefaultCellEditor;import javax.swing.JCheckBox;import javax.swing.JFrame;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.table.TableColumnModel;public class MainWindow extends JFrame{    public MainWindow()    {        super();        setBounds(100,100,300,300);        setTitle("JTable Example");        String[] column = {"JCheckBox"};        Object[][] row = new Object[5][1];        JTable t = new JTable(row,column);        t.setRowHeight(70);        TableColumnModel tcm = t.getColumnModel();        tcm.getColumn(0).setCellEditor(new DefaultCellEditor(new JCheckBox()));        tcm.getColumn(0).setCellRenderer(new MyCellRenderer());        for (int i = 0; i < t.getRowCount(); ++i)            t.setValueAt(false,i,0);        t.setValueAt(true, 0, 0);        JScrollPane scroll = new JScrollPane(t);        t.addMouseListener(new MouseAdapter()                {                    public void mouseClicked(MouseEvent e)                    {                        if (e.getClickCount() == 1)                        {                            int columnIntex = t.columnAtPoint(e.getPoint());                            int rowIntex = t.rowAtPoint(e.getPoint());                            if (columnIntex == 0)                            {                                for (int i = 0; i < t.getRowCount(); ++i)                                    t.setValueAt(false, i, 0);                                t.setValueAt(true, rowIntex, columnIntex);                            }                        }                    }                });        this.getContentPane().add(scroll,BorderLayout.CENTER);    }}

表格渲染器

import java.awt.Component;import java.awt.FlowLayout;import javax.swing.JCheckBox;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JTable;import javax.swing.table.TableCellRenderer;public class MyCellRenderer extends JCheckBox implements TableCellRenderer{        private static JLabel text  = new JLabel();// set the text you want        private static JPanel p = new JPanel(); //set the layout of table cell    /*设为static是为了应付JInternalFrame类子窗口,系列要释放资源是为不打开多窗口时重复,可去掉亲身体验*/        @Override        public Component getTableCellRendererComponent(JTable arg0, Object arg1, boolean arg2, boolean arg3, int arg4,                int arg5) {            // TODO Auto-generated method stub            p = null;            text = null;            p = new JPanel();            text = new JLabel();            boolean set = (Boolean)arg1;            this.setSelected(set);            if (this.isSelected())                text.setText("已选中");            else                text.setText("未选中");            p.setLayout(new FlowLayout(FlowLayout.CENTER));            p.add(this);            p.add(text);            return p;        }}

Main

public class Main {    public static void main(String[] args)     {        MainWindow w = new MainWindow();        w.setVisible(true);    }}

效果:

这里写图片描述