我的思路是模仿DefaultCellEditor和DefaultTableCellRenderer写一个适配JList的CellEditor和CellRenderer但是源码的结构对我来说太复杂了,望达人能点拨点拨,有例子最好,不胜感激.

解决方案 »

  1.   


    jtable.setModel(new javax.swing.table.DefaultTableModel(
    myArray,  tableList ) {
    private static final long serialVersionUID = 1L;
    boolean[] canEdit = new boolean[] { false, false, false,
    false, false, false, false, false,
     false, false, false,
    false, false, false, false, false, false, false};
    public boolean isCellEditable(int rowIndex, int columnIndex) {
    return canEdit[columnIndex];
    }
    });myArray 二维 
    tableList  一维
      

  2.   

    请问您想表达什么意思?好像跟JList无关吧,能说详细些么,谢谢
      

  3.   

    没什么困难的吧。
    renderer和editor核心都是要改写一个getXXXComponent方法。返回一个组件,然后根据这个组建描绘渲染器或者编辑器的样式。如果可以编辑,编辑器可能需要getEditorValue方法。大体上就是这些。没什么的啊?
      

  4.   


    ...我知道要改写..可就是不懂的怎么改写,我很疑惑的是getXXXComnent是什么时候调用的,是JTABLE要渲染的时候和确定单元格的编辑组件时候自动调用的还是需要人为的调用来返回指定的组件....可以麻烦您写个JLIST的例子吗?谢谢了.
      

  5.   

    这样啊~~
    强烈建议debug跟踪一下。这样可以很清晰的知道,哪些方法究竟是在哪里调用的
      

  6.   

    不清楚我理解的对不对,帮你临时写了个,还有点bug,你补补
    public class TestTableFrame extends JFrame { private JTable table; public static void main(String args[]) {
    EventQueue.invokeLater(new Runnable() {
    public void run() {
    try {
    TestTableFrame frame = new TestTableFrame();
    frame.setVisible(true);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    });
    } public TestTableFrame() {
    super();
    setBounds(100, 100, 500, 375);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JScrollPane scrollPane = new JScrollPane();
    getContentPane().add(scrollPane, BorderLayout.CENTER); table = new JTable(new TestModel());
    table.getColumnModel().getColumn(0).setCellEditor(new ListEditor());
    scrollPane.setViewportView(table);
    //
    } private class TestModel extends AbstractTableModel { private String[][] data = new String[][] { { "a", "b", "c" },
    { "a", "b", "c" }, { "a", "b", "c" } }; @Override
    public int getColumnCount() {
    return data[0].length;
    } @Override
    public int getRowCount() {
    return data.length;
    } @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
    return data[rowIndex][columnIndex];
    } @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    data[rowIndex][columnIndex] = (String) aValue;
    } @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
    return true;
    } @Override
    public Class<?> getColumnClass(int columnIndex) {
    return String.class;
    }
    } private class ListEditor extends AbstractCellEditor implements
    TableCellEditor {
    private JList list;
    private JScrollPane scroll = new JScrollPane();
    public ListEditor() {
    this(new String[]{"a", "b", "c", "d"});
    scroll.setViewportView(list);
    } public ListEditor(String data[]) {
    this.list = new JList(data);
    }
    public boolean isCellEditable(EventObject anEvent) {
    return true;
    } public Object getCellEditorValue() {
    return list.getSelectedValue();
    } public Component getTableCellEditorComponent(JTable jtable,
    Object object, boolean bool, int row, int col) {
    list.setSelectedValue(object, true);

    return scroll;
    }
    }
    }