testtablecelleditor.java

来自「疯狂Java讲义_源码(含Java设计模式CHM」· Java 代码 · 共 209 行

JAVA
209
字号

import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import java.io.*;
/**
 * Description:
 * <br/>Copyright (C), 2005-2008, Yeeku.H.Lee
 * <br/>This program is protected by copyright laws.
 * <br/>Program Name:
 * <br/>Date:
 * @author  Yeeku.H.Lee kongyeeku@163.com
 * @version  1.0
 */
public class TestTableCellEditor
{
	JFrame jf = new JFrame("使用单元格编辑器");
	JTable table;
	//定义二维数组作为表格数据
	Object[][] tableData = 
	{
		new Object[]{"李清照" , 29 , "女" , new ImageIcon("icon/3.gif") 
			, new ImageIcon("icon/3.gif") , true},
		new Object[]{"苏格拉底", 56 , "男" , new ImageIcon("icon/1.gif") 
			, new ImageIcon("icon/1.gif") , false},
		new Object[]{"李白", 35 , "男" , new ImageIcon("icon/4.gif") 
			, new ImageIcon("icon/4.gif") , true},
		new Object[]{"弄玉", 18 , "女" , new ImageIcon("icon/2.gif") 
			, new ImageIcon("icon/2.gif") , true},
		new Object[]{"虎头" , 2 , "男" , new ImageIcon("icon/5.gif") 
			, new ImageIcon("icon/5.gif") , true}
	};
	//定义一维数据作为列标题
	String[] columnTitle = {"姓名" , "年龄" , "性别" , "主头像" , "次头像" , "是否中国人"};
	public void init()
	{
		//以二维数组和一维数组来创建一个ExtendedTableModel对象
		ExtendedTableModel model = new ExtendedTableModel(columnTitle , tableData);
		//以ExtendedTableModel来创建JTable
		table = new JTable(model);
		table.setRowSelectionAllowed(false);
		table.setRowHeight(40);
		//为该表格指定默认的编辑器
		table.setDefaultEditor(ImageIcon.class, new ImageCellEditor());
		//获取最后一列
		TableColumn lastColumn = table.getColumnModel().getColumn(4);
		JComboBox editCombo = new JComboBox();
		for (int i = 1; i <= 10; i++)
		{
			editCombo.addItem(new ImageIcon("icon/" + i + ".gif"));
		}

		lastColumn.setCellEditor(new DefaultCellEditor(editCombo));

		//将JTable对象放在JScrollPane中,并将该JScrollPane放在窗口中显示出来
		jf.add(new JScrollPane(table));
		jf.pack();
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.setVisible(true);
	}
    public static void main(String[] args) 
    {
		new TestTableCellEditor().init();
    }
}
class ExtendedTableModel extends DefaultTableModel
{
	//重新提供一个构造器,该构造器的实现委托给DefaultTableModel父类
	public ExtendedTableModel(String[] columnNames , Object[][] cells)
	{
		super(cells , columnNames);
	}
	//重写getColumnClass方法,根据每列的第一个值来返回其真实的数据类型
	public Class getColumnClass(int c) 
	{
		return getValueAt(0 , c).getClass();
	}
}

//扩展自己的TableCellEditor类
class ImageCellEditor extends DefaultCellEditor
{
	//定义文件选择器
	private JFileChooser fDialog = new JFileChooser(); ;
	private JTextField field = new JTextField(15);
	private JButton button = new JButton("...");

	public ImageCellEditor()
	{
		//因为DefaultCellEditor没有无参数的构造器
		//所以这里显式调用父类有参数的构造器。
		super(new JTextField());
		initEditor();
	}
	
	private void initEditor()
	{
		field.setEditable(false);
		//为按钮添加监听器,当用户单击该按钮时,
		//系统将出现一个文件选择器让用户选择图标文件。
		button.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e) 
			{
				browse();
			}
		});
		//为文件选择器安装文件过滤器
		fDialog.addChoosableFileFilter(new javax.swing.filechooser.FileFilter()
		{
			public boolean accept(File f) 
			{
				if (f.isDirectory())
				{
					return true;
				}
				String extension = Utils.getExtension(f);
				if (extension != null)
				{
					if (extension.equals(Utils.tiff) ||
						extension.equals(Utils.tif) ||
						extension.equals(Utils.gif) ||
						extension.equals(Utils.jpeg) ||
						extension.equals(Utils.jpg) ||
						extension.equals(Utils.png)) 
					{
						return true;
					} 
					else 
					{
						return false;
					}
				}
				return false;
			}
			public String getDescription()
			{
				return "有效的图片文件";
			}
		});
		fDialog.setAcceptAllFileFilterUsed(false);
	}
	
	//重写TableCellEditor接口的getTableCellEditorComponent方法
	//该方法返回单元格编辑器,该编辑器是一个JPanel,该容器包含一个文本框和一个按钮
	public Component getTableCellEditorComponent(JTable table,
		Object value, boolean isSelected , int row, int column)
	{
		
		this.button.setPreferredSize(new Dimension(20, 20));
		JPanel panel = new JPanel();
		panel.setLayout(new BorderLayout());
		field.setText(value.toString());
		panel.add(this.field, BorderLayout.CENTER);
		panel.add(this.button, BorderLayout.EAST);
		return panel;
	}
	
	public Object getCellEditorValue()
	{
		return new ImageIcon(field.getText());
	}
	
	private void browse()
	{
		//设置、打开文件选择器
		fDialog.setCurrentDirectory(new File("icon"));
		int result = fDialog.showOpenDialog(null);
		//如果单击了文件选择器的“取消”按钮
		if (result == JFileChooser.CANCEL_OPTION)
		{
			//取消编辑
			super.cancelCellEditing();
			return;
		}
		//如果单击了文件选择器的“确定”按钮
		else
		{
			//设置field的内容
			field.setText("icon/" + fDialog.getSelectedFile().getName());
		}
	}
}

class Utils
{
    public final static String jpeg = "jpeg";
    public final static String jpg = "jpg";
    public final static String gif = "gif";
    public final static String tiff = "tiff";
    public final static String tif = "tif";
    public final static String png = "png";

	//获取文件扩展名的方法
	public static String getExtension(File f)
	{
        String ext = null;
        String s = f.getName();
        int i = s.lastIndexOf('.');
        if (i > 0 &&  i < s.length() - 1) 
		{
            ext = s.substring(i + 1).toLowerCase();
        }
        return ext;
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?