再次,就是在循环的时候,把list或者map中的值取出来放到JTable里面
如: for(int i=0i<list.size()i++){
JTable table = new JTable()
.....//这个地方就可以创建JTable的 列和行了,或者你在里面定义好字符串然后在列表外面把他们加进去
}
getTableCellRendererComponent是自动调用的,是在JTable的绘制过程中对每个单元调用的。renderer只是渲染器,只能把东西画出样子来,不是真的组件,不能让你选中的。编辑器是editor,也是可以自定义的,但是好像是要单击一下单元格才会出现的,你总不能让他一直是在编辑状态吧。所以就像我之前讲过的问题,在表格的某单元格内放一个JList不是太好,你不如用一个ComboBox作为editor,点击一下出现下拉列表框,这样就可以选择,也可以节省表格占用的空间,而且渲染器也不需要了。具体例子也是要好多句语句的,还是建议参考Core Java吧
===============================================================
JTable的源码的确是太复杂了,我几次想看明白都没成功。。
对于你的问题我有个问题,你知道JTable的存储的是 Object,就是说他什么都能放,所以你是想真的放一个JList进去呢?还是放一个比如说String数组进去,然后显示的时候变成JList的样子。如果是前者的话,代码会变的有些奇怪,我是这个写的,首先创建自己的渲染器:
class JListTableCellRenderer implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
return (JList) value
}
}
因为就直接存了JList,所以返回就可以了,但是如果你存数组的话,就可以这么写:
class ArrayTableCellRenderer extends JList implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
this.setListData((Object[]) value)
return this
}
}
然后你得有一个可以得到一列数据类型的TableModel:
DefaultTableModel model = new DefaultTableModel(5, 1) {
@Override
public Class<?>getColumnClass(int columnIndex) {
if (columnIndex == 0) return JList.class
return super.getColumnClass(columnIndex)
}
}
或者返回Object[].class
然后告诉JTable以上的信息:
JTable table = new JTable(model)
table.setDefaultRenderer(JList.class, new JListTableCellRenderer())
这么做的局限是你的某一列一定要是JList对象,但是这个不是问题,这个很容易就可以改,像这样:
static class MyTableCellRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
if (true /* some condition */)
return (JList) value
else return super.getTableCellRendererComponent(table,
value, isSelected, hasFocus, row, column)
}
}
然后把这个设置为整个table的renderer
以上做法可以参考core java
问题在于,你的JList一定要保证足够的表格高度来显示,因为JTable的机制是调用CellRenderer返回的组件的paint方法来绘制,而不是真的放一个组件上去,所以你的数据太多的话是没有办法显示的
import java.util.ArrayListimport java.util.Arrays
import java.util.List
import javax.swing.table.AbstractTableModel
public class BookTableModel extends AbstractTableModel {
private List<Book> data = new ArrayList<Book>()
@Override
public int getRowCount() {
return data.size()
}
@Override
public int getColumnCount() {
//根据实际情况返回列数
return 3
}
@Override
public String getColumnName(int column) {
//根据实际情况返回列名
if (column == 0)
return "ID"
else if (column == 1)
return "ISBNNum"
return "Name"
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Book book = data.get(rowIndex)
if (columnIndex == 0)
return book.getId()
else if (columnIndex == 1)
return book.getISBNNum()
return book.getName()
}
public void setData(List<Student> data) {
if (data == null)
throw new IllegalArgumentException("参数data不能为null。")
this.data = data
fireTableDataChanged()
}
} BookTableModel tableModel = new BookTableModel ()
JTable table = new JTable(tableModel)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)