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);
}
}
界面截图:
例如:在某一行放置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);
}
}
界面截图:
相关文章推荐
- 很多人都想知道的,如何在table的任意单元格放置任意swing组件(附效果图)
- Java实现任意文件在bmp中的隐藏与导出
- 通用 Java 文件上传和下载组件的设计与实现
- Java平台要实现类似豆丁百度文科的文档在线阅读,总体思路是讲doc docx等文件格式利用jcom转换成pdf再用swftools转为swf。再用flexpaper组件显示swf。
- 使用java的html解析器jsoup和jQuery实现一个自动重复抓取任意网站页面指定元素的web应用
- 从n个数组中任意选取一个元素的所有组合的Java实现(组合问题)
- 求住 谁能帮我用java或c语言 实现一下公式 任意输入数字可出结果~~
- 原创:字符串和语句逆转的几种方式,可以任意组合,java实现
- 通用 Java 文件上传和下载组件的设计与实现
- 使用java的html解析器jsoup和jQuery实现一个自动重复抓取任意网站页面指定元素的...
- Java实现任意文件在bmp中的隐藏与导出
- java 实现任意位数相加!
- 使用 java 开源资源实现通用可靠的下载组件
- Java实现图片内容无损任意角度旋转
- Java JTable设置列宽实现表格不等宽
- Java实现任意文件在bmp中的隐藏与导出
- JAVA学习提高之---- FileUpload组件实现多文件上传(JSP+SERVLET)实现
- 运行期窗体、可视组件任意移动 调整大小功能实现组件
- maverick组件实现JAVA SSH协议初探
- Rational Functional Tester Proxy SDK 开发,第 2 部分: 使用 Proxy SDK 扩展 RFT 已支持 Java GUI 组件 Proxy 对象实现