如何在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中的选项.. 展开
你好.可以再追问一个问题吗?getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) 这个函数是自动调用的还是我们有需要时才调用的?我对这个函数什么时候调用一直很疑惑...还有Renderer不是仅仅是一个渲染器吗,只负责表现,我是想把JLIST做为某一列的编辑器,可以获取JLIST中的选项.. 展开
展开全部
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方法来绘制,而不是真的放一个组件上去,所以你的数据太多的话是没有办法显示的
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方法来绘制,而不是真的放一个组件上去,所以你的数据太多的话是没有办法显示的
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询