JAVA中怎么把list或map里的值动态添加至JTable

JAVA中怎么把list或map里的值动态添加至JTable,第1张

首先,循环list或者map

再次,就是在循环的时候,把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.ArrayList

import 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)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11521545.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存