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

被折叠的 条评论
为什么被折叠?



