带tooltip和checkbox的JTable

业务需求,查阅多方资料,写出这个Test。高手多指教!

PS:程序使用了swing的主题包Alloy。下载地址:Swing主题包Alloy

import java.awt.Component;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

public class ShowPane extends JDialog {

	private static final long serialVersionUID = 3211670289885481102L;
	
	int WIDTH = 1200;
	int HEIGHT = 490;
	JPanel panel = new JPanel();
	Frame g = null;
	public ShowPane(Frame owner,Object[][]obj){
		super(owner, true);
		g = owner;
		Object[] columnTitle = { "收件人", "收件地址", "抄送人", "抄送地址", "附件","选择" };
		DefaultTableModel dtm = new DefaultTableModel(columnTitle, 0);
		for (Object[] v : obj) {
			dtm.addRow(v);	
		}
		final JTable table = new JTable(dtm){

			private static final long serialVersionUID = 6608687572383071834L;

			@Override
			 public boolean isCellEditable(int row, int column)  { 
//				表格不允许被编辑
				if (column == 5) {
					return true;//如果是选项框的行则可以编辑
				}
                return false;
             }
			/**
			 * 默认情况下这个方法不用重新实现的,但是这样就会造成如果这个列式boolean的类型,就当做string来处理了
			 * 如果是boolean的类型那么用checkbox来显示
			 */
			@Override
			public Class<?> getColumnClass(int columnIndex) {
				return getValueAt(0, columnIndex).getClass();
			}
			/**
			 * 以Tooltip的方式可以显示具体的值
			 */
			@Override
			public String getToolTipText(MouseEvent e) {
				java.awt.Point p = e.getPoint();
		           int rowIndex = rowAtPoint(p);
		           int colIndex = columnAtPoint(p);
		          return  this.getValueAt(rowIndex, colIndex)==null?"":this.getValueAt(rowIndex, colIndex).toString();
			}
		};
		table.setSize(WIDTH, HEIGHT);
		final MyCheckBoxRenderer check = new MyCheckBoxRenderer();
		TableColumn tc = table.getColumn("选择");
		tc.setHeaderRenderer(check);

		table.getTableHeader().addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				// 如果点击的是第6列,即checkbox这一列.下标从0开始
				if (table.getColumnModel().getColumnIndexAtX(e.getX()) == 5) {
					boolean b = !check.isSelected();
					check.setSelected(b);
					table.getTableHeader().repaint();
					for (int i = 0; i < table.getRowCount(); i++) {
						table.getModel().setValueAt(b, i, 5);// 把这一列都设成和表头一样
					}
				}
			}
		});
		//-----------------设置列宽
		int width = 150;
		TableColumn c = table.getColumnModel().getColumn(0);//收件人
		c.setPreferredWidth(width);
		c.setMaxWidth(width);
		c.setMinWidth(width);
		c = table.getColumnModel().getColumn(1);//收件地址
		width = 200;
		c.setPreferredWidth(width);
		c.setMaxWidth(width);
		c.setMinWidth(width);
		c = table.getColumnModel().getColumn(2);//抄送人
		width =150;
		c.setPreferredWidth(width);
		c.setMaxWidth(width);
		c.setMinWidth(width);
		c = table.getColumnModel().getColumn(3);//抄送地址
		width = 330;
		c.setPreferredWidth(width);
		c.setMaxWidth(width);
		c.setMinWidth(width);

		c = table.getColumnModel().getColumn(5);//选择列
		width = 23;
		c.setPreferredWidth(width);
		c.setMaxWidth(width);
		c.setMinWidth(width);
		//----------------------
		table.setPreferredScrollableViewportSize(new Dimension(WIDTH-50, HEIGHT-100));
		JScrollPane jp = new JScrollPane(table);
		jp.setViewportView(table);
		jp.setSize(1000, HEIGHT-30);
		
		JButton ok = new JButton("确定");
		ok.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				ShowPane.this.dispose();
			}
		});
		JButton cancel = new JButton("取消");
		cancel.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				ShowPane.this.dispose();
				System.out.println("取消发送");
			}
		});
		
		panel.add(jp);
		panel.add(ok);
		panel.add(cancel);
		this.add(panel);
		this.setResizable(false);
	}

	public static void main(String[] args) {
		final Object [][] o = {
				{"张三","zhangsan@sina.com.cn","张无忌;张三丰","zhangwuji@163.com;sanfeng@souhu.com","C:\\Program Files\\Internet Explorer\\IE.exe",true}
				,{"李四","lisi@gmail.com","李某某","moumou@haitianshengyan.com","D:\\MyVideo\\XXX\\a.avi",false}
		};
		final JFrame frame = new JFrame();
		JButton btn = new JButton("确认");
		btn.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				ShowPane.invokeApp(frame,o);
			}
		});
		frame.setSize(100,70);
		frame.add(btn);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	/**
	 * 初始化界面
	 */
	void init() {
		// 设置程序显示在屏幕中间
		Dimension size = Toolkit.getDefaultToolkit().getScreenSize();
		int w = size.width;
		int h = size.height;
		int x = (w - WIDTH) / 2;
		int y = (h - HEIGHT) / 2;
		this.setBounds(x, y, WIDTH, HEIGHT);
		this.setResizable(false);
		this.setTitle("发送列表");
		this.setVisible(true);
		this.setDefaultCloseOperation(HIDE_ON_CLOSE);
	}

	/**
	 * 运行程序的主要方法。 主要功能:应用主题、创建面板
	 */
	public static void invokeApp(final Frame owner,final Object[][] row) {
		try {
			SwingUtilities.invokeLater(new Runnable() {
				public void run() {
					try {
						JFrame.setDefaultLookAndFeelDecorated(true);
						JDialog.setDefaultLookAndFeelDecorated(true);
						UIManager.setLookAndFeel("com.incors.plaf.alloy.AlloyLookAndFeel");
						new ShowPane(owner,row).init();
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			});
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

class MyCheckBoxRenderer extends JCheckBox implements TableCellRenderer {

	private static final long serialVersionUID = 4343577984596283840L;

	public MyCheckBoxRenderer() {
		this.setBorderPainted(true);
	}

	@Override
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		return this;
	}
}



运行效果:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值