您的位置:首页 > 编程语言 > Java开发

Java实现JTable放置任意组件

2016-12-01 16:49 183 查看
要想在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);
}

}

界面截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jtable
相关文章推荐