如何在JTable中添加JList,请写个例子

我的思路是模仿DefaultCellEditor和DefaultTableCellRenderer写一个适配JList的CellEditor和CellRenderer但是... 我的思路是模仿DefaultCellEditor和DefaultTableCellRenderer写一个适配JList的CellEditor和CellRenderer但是源码的结构对我来说太复杂了,望达人能点拨点拨,有例子最好,不胜感激.
你好.可以再追问一个问题吗?getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) 这个函数是自动调用的还是我们有需要时才调用的?我对这个函数什么时候调用一直很疑惑...还有Renderer不是仅仅是一个渲染器吗,只负责表现,我是想把JLIST做为某一列的编辑器,可以获取JLIST中的选项..
展开
 我来答
Irreappearable
2010-02-08 · TA获得超过4956个赞
知道大有可为答主
回答量:1423
采纳率:25%
帮助的人:3139万
展开全部
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方法来绘制,而不是真的放一个组件上去,所以你的数据太多的话是没有办法显示的
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式