2012-08-10 69 views
0

我正在使用一列包含List<List<String>>的列。此栏应该向用户显示一个按钮。当他点击按钮时,需要对单元格的数据进行处理。JTable单元格中的按钮:在单元格中存储数据时保持标题不变

所有的作品真的没事用下面的代码:

JFrame testFrame = new JFrame("TEST"); 
    testFrame.setLayout(new BorderLayout()); 
    testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    List<List<String>> list = new ArrayList<List<String>>(); 
    list.add(new ArrayList<String>()); 
    list.get(0).add("Hello World"); 

    OptConstraintTableModel dm = new OptConstraintTableModel(
     new String[] {"Data with a button"}, new Class<?>[] {List.class}, new Object[][] { {list} } 
      ); 
    JTable table = new JTable(dm); 
    Action action_show = new AbstractAction() 
    { 
     private static final long serialVersionUID = 1L; 
     public void actionPerformed(ActionEvent e) 
     { 
      JTable table = (JTable)e.getSource(); 
      int modelRow = Integer.valueOf(e.getActionCommand()); 
      System.out.println(((List<List<String>>) table.getValueAt(modelRow,0)).get(0).get(0)); 
     } 
    }; 
    ButtonColumn button_show = new ButtonColumn(table, action_show, 0); 
    testFrame.add(table); 

    testFrame.pack(); 
    testFrame.setVisible(true); 

ButtonColumnhere采取何为TableModel的实现原理如下:

public class OptConstraintTableModel extends AbstractTableModel { 

/** 
* Default Serial Version UID 
*/ 
private static final long serialVersionUID = 1L; 

private String[] columnNames; 
private List<Object[]> data; 
private Class<?>[] values; 

/** 
* @param objects2 
* @param objects 
* 
*/ 
public OptConstraintTableModel(String[] columnNames, Class<?>[] values, Object[][] data) { 
    this.columnNames = columnNames; 
    this.values = values; 
    this.data = new ArrayList<Object[]>(); 
    for(Object[] row : data) { 
     this.data.add(row); 
    } 
} 

/** 
* Adds the given Object array as last row into the TableModel 
* @param objects the row to be added 
*/ 
public void addRow(Object[] objects) { 
    this.data.add(objects); 
    this.fireTableRowsInserted(data.size()-1, data.size()-1); 
} 

/* (non-Javadoc) 
* @see javax.swing.table.TableModel#getColumnCount() 
*/ 
@Override 
public int getColumnCount() { 
    return columnNames.length; 
} 

/* (non-Javadoc) 
* @see javax.swing.table.TableModel#getRowCount() 
*/ 
@Override 
public int getRowCount() { 
    return data.size(); 
} 

/* (non-Javadoc) 
* @see javax.swing.table.TableModel#getValueAt(int, int) 
*/ 
@Override 
public Object getValueAt(int row, int col) { 
    return data.get(row)[col]; 
} 

/* 
* (non-Javadoc) 
* @see javax.swing.table.AbstractTableModel#setValueAt(java.lang.Object, int, int) 
*/ 
public void setValueAt(Object aValue, int row, int column) { 
    data.get(row)[column] = aValue; 
} 

/* 
* (non-Javadoc) 
* @see javax.swing.table.AbstractTableModel#getColumnClass(int) 
*/ 
public Class<? extends Object> getColumnClass(int c) { 
    return values[c]; 
} 

/* 
* (non-Javadoc) 
* @see javax.swing.table.AbstractTableModel#getColumnName(int) 
*/ 
public String getColumnName(int col) { 
    return columnNames[col]; 
} 

/* 
* (non-Javadoc) 
* @see javax.swing.table.AbstractTableModel#isCellEditable(int, int) 
*/ 
public boolean isCellEditable(int row, int col) { 
    if (col == 1) return (Boolean) this.getValueAt(row, 0); 
    if (col == 3) return (Boolean) this.getValueAt(row, 2); 
    return true; 
} 

/** 
* Removes the indicated row from the table model 
* @param i  the index of the row to be delete 
*/ 
public void removeRow(int i) { 
    this.data.remove(i); 
    this.fireTableRowsDeleted(i, i); 
} 
} 

的问题是:我如何改变按钮的标题?此时,单元格的当前数据也显示为Button的标题,这不是非常用户友好的。我希望所有的按钮都带有“编辑”标题,我怎么能意识到这一点?

回答

1

即在ButtonColumn

renderButton.setText(value.toString()); 
renderButton.setIcon(null); 

做。如果你只是设置 “编辑” 的文本,而不是value.toString()所有按钮会显示'编辑'

这必须在方法getTableCellRendererComponent中完成。对于方法getTableCellEditorComponent中的editButton也必须做同样的事情,否则该值仍然显示在按钮上,而用户执行点击操作。

+0

这是一个快速回复,解决了我的问题,非常感谢! – Skrodde 2012-08-10 11:54:25

1

ButtonColumn类改写方法getTableCellRendererComponent()并设置你想要的按钮标题。

代替

renderButton.setText(value.toString()) 

renderButton.setText("Edit");