2012-08-10 70 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");