2012-08-10 2 views
0

List<List<String>>을 포함하는 하나의 열을 가진 JTable에서 작업하고 있습니다. 이 열은 사용자에게 버튼을 보여줘야합니다. 버튼을 클릭하면 셀의 데이터로 무언가가 끝납니다.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

것 '수정'표시

이것은 getTableCellRendererComponent 메소드에서 수행해야합니다. 메서드 getTableCellEditorComponent에있는 editButton에 대해서도 동일한 작업을 수행해야합니다. 그렇지 않으면 사용자가 버튼을 클릭하는 동안 해당 값이 버튼에 계속 표시됩니다.

+0

그것은 빠른 답장이었고 내 문제를 해결했습니다. 대단히 감사합니다! – Skrodde

1

ButtonColumn 클래스 재 작성 방법 getTableCellRendererComponent() 및 버튼 캡션을 설정하십시오. 대신 당신은 그냥 대신 value.toString() 모든 버튼의 텍스트로 "편집"을 설정하면 ButtonColumn 클래스

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

에서 이루어집니다

renderButton.setText(value.toString()) 

쓰기

renderButton.setText("Edit"); 
관련 문제