带复选框的JTable

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 ConfirmPane extends JDialog {
	int WIDTH = 1200;
	int HEIGHT = 490;
	JPanel panel = new JPanel();
	Graphical g = null;
	public ConfirmPane(Graphical 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){
			@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();
			}
		};
		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) {
				if (table.getColumnModel().getColumnIndexAtX(e.getX()) == 5) {// 如果点击的是第0列,即checkbox这一列
					JCheckBox Checkbox = (JCheckBox) check;
					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 = 70;
		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 =70;
		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);
		//----------------------
		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) {
				// 发送邮件。
				g.bar.setValue(0);
				g.bar.setString("正在发送 - " + g.bar.getValue() + "%");
				SendEmailThread sendEmail = new SendEmailThread();
				sendEmail.setGraphical(g);
				sendEmail.setProgressBar(g.bar);
				sendEmail.start();
				ConfirmPane.this.dispose();
			}
		});
		JButton cancel = new JButton("取消");
		cancel.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				ConfirmPane.this.dispose();
				System.out.println("取消发送");
			}
		});
		
		panel.add(jp);
		panel.add(ok);
		panel.add(cancel);
		this.add(panel);
	}
	/**
	 * 初始化界面
	 */
	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 Graphical 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 ConfirmPane(owner,row).init();
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			});
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

class MyCheckBoxRenderer extends JCheckBox implements TableCellRenderer {

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

	@Override
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		// TODO Auto-generated method stub
		return this;
	}
}


设置固定列宽的时候,一定要设置最大和最小列宽,否则无法固定。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值