Java实现JTable放置任意组件

本文介绍如何在Java的JTable中利用TableCellRenderer和TableCellEditor接口添加自定义组件,如JLabel。通过创建MyLabelRenderer并在表格特定列应用setCellRenderer方法,可以实现这一功能。此外,还可以在JPanel中设置布局并添加更多组件。虽然示例仅展示了界面,但完整的功能实现(TableCellEditor)仍有待补充。

要想在Table中某一行放置任意组件,要使用TableCellRenderer(单元格渲染器)接口和TableCellEditor(单元格编辑器)接口

例如:在某一行放置JLabel组件,首先创建MyLabelRenderer

import java.awt.Component;
import java.awt.Image;
import java.net.URL;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class MyLabelRenderer extends JLabel implements TableCellRenderer{

	@Override
	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
			int row, int column) {
		// TODO Auto-generated method stub
		
	URL url=MyButtonRenderer.class.getResource(value+".png");
        ImageIcon icon=new ImageIcon(url);
        icon.setImage(icon.getImage().getScaledInstance(22, 22, Image.SCALE_DEFAULT));
        setIcon(icon);
        
        setText(value.toString());
        
        setBorder(BorderFactory.createEmptyBorder(3,10,3,10));
		
		return this;
	}

}

然后在Table中使用setCellRenderer()函数将某一列设为JLabel

table.getColumnModel().getColumn(3).setCellRenderer(new MyLabelRenderer());//这里设置的是第4列

当然我们也可以将这个组件直接设置为JPanel,然后在panel里面设置排列方式,并放置其他组件

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class MyPanelRenderer extends JPanel implements TableCellRenderer{

	private JButton button;
	private JLabel label;
	
	int panelvalue;
	
	@Override
	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
			int row, int column) {
		// TODO Auto-generated method stub
		
		panelvalue=Integer.parseInt(value.toString());
		
		if(panelvalue==0){
			button=new JButton("panbutton");
			this.removeAll();
			this.setLayout(new BorderLayout());
			this.add(button,BorderLayout.EAST);
			this.setBackground(Color.ORANGE);
		}
		else{
			label=new JLabel(value.toString());
			this.removeAll();
			this.setLayout(new BorderLayout());
			this.add(label,BorderLayout.SOUTH);
			this.setBackground(Color.CYAN);
		}
		
		return this;
	}

}

下面是我写的小程序,只有界面,对应的组件功能(TableCellEditor)还没写微笑

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableModel;

public class TestPanelTable extends JFrame{

	private DefaultTableModel tablemodel;
	private JTable table;
	
	public TestPanelTable(){
		
		tablemodel=new DefaultTableModel(0, 3);
		
		table=new JTable(tablemodel);
		String[] tableHeads = { "序号","id","jbutton","JLabel","jprogress","jpanel"};
		tablemodel.setColumnIdentifiers(tableHeads);
		
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        table.setRowHeight(50);
        
        table.getColumnModel().getColumn(2).setCellEditor(new MyButtonCellEditor());
        table.getColumnModel().getColumn(2).setCellRenderer(new MyButtonRenderer());
        table.getColumnModel().getColumn(3).setCellEditor(new MyLabelCellEditor());
        table.getColumnModel().getColumn(3).setCellRenderer(new MyLabelRenderer());
        table.getColumnModel().getColumn(4).setCellEditor(new MyProgressCellEditor());
        table.getColumnModel().getColumn(4).setCellRenderer(new MyProgressRenderer());
        table.getColumnModel().getColumn(5).setCellRenderer(new MyPanelRenderer());
        
        
		for (int i = 1; i < 100; i++) {
			JButton jb=new JButton();
			jb.setText(String.valueOf(i));	
			String jbtext;
			if(i%3==0){
				jbtext="start";
			}
			else if(i%3==1){
				jbtext="suspend";
			}
			else{
				jbtext="stop";
			}
			Object[] objdata = { i, i, jbtext,jbtext,i,i%2};//我这里是通过传入的参数值来设置组件上的图片,或者进度条的数值,该数值就是对应TableCellRenderer中的value

			tablemodel.addRow(objdata);
		}
        
		this.add(new JScrollPane(table),BorderLayout.CENTER);
		this.setSize(new Dimension(500, 500));
		
	}
	
	public static void main(String[] args) {
		TestPanelTable t=new TestPanelTable();
		t.setVisible(true);
	}
	
}

界面截图:



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值