Много Методов класса не обрабатывают примитивы последовательным способом, к сожалению. Распространенный способ вокруг этого в forName состоит в том, чтобы иметь таблицу как;
private static final Map<String, Class> BUILT_IN_MAP =
new ConcurrentHashMap<String, Class>();
static {
for (Class c : new Class[]{void.class, boolean.class, byte.class, char.class,
short.class, int.class, float.class, double.class, long.class})
BUILT_IN_MAP.put(c.getName(), c);
}
public static Class forName(String name) throws ClassNotFoundException {
Class c = BUILT_IN_MAP.get(name);
if (c == null)
// assumes you have only one class loader!
BUILT_IN_MAP.put(name, c = Class.forName(name));
return c;
}
Вы не добавляете его в строку - вы добавляете его в ячейку. В этом руководстве описано, что вам нужно.
Вы можете добавить Компонент в качестве ячейки таблицы.
Прежде всего, вы должны реализовать класс, имеющий JButton в качестве родительского класса и два интерфейса, TableCellRenderer и TableCellEditor.
Причина который должен реализовывать TableCellEditor, предназначен для получения ActionEvent кнопки.
public class TableButton extends JButton implements TableCellRenderer, TableCellEditor {
private int selectedRow;
private int selectedColumn;
Vector<TableButtonListener> listener;
public TableButton(String text) {
super(text);
listener = new Vector<TableButtonListener>();
addActionListener(new ActionListener() {
public void actionPerformed( ActionEvent e ) {
for(TableButtonListener l : listener) {
l.tableButtonClicked(selectedRow, selectedColumn);
}
}
});
}
public void addTableButtonListener( TableButtonListener l ) {
listener.add(l);
}
public void removeTableButtonListener( TableButtonListener l ) {
listener.remove(l);
}
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row, int col) {
return this;
}
@Override
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int col) {
selectedRow = row;
selectedColumn = col;
return this;
}
@Override
public void addCellEditorListener(CellEditorListener arg0) {
}
@Override
public void cancelCellEditing() {
}
@Override
public Object getCellEditorValue() {
return "";
}
@Override
public boolean isCellEditable(EventObject arg0) {
return true;
}
@Override
public void removeCellEditorListener(CellEditorListener arg0) {
}
@Override
public boolean shouldSelectCell(EventObject arg0) {
return true;
}
@Override
public boolean stopCellEditing() {
return true;
}
}
Затем я добавил EventListener с именем TableButtonListener для обработки события кнопки, как показано ниже.
public interface TableButtonListener extends EventListener {
public void tableButtonClicked( int row, int col );
}
И использовать вышеупомянутый Renderer / Editor.
TableButton buttonEditor = new TableButton("Button");
buttonEditor.addButtonListener(new TableButtonListener() {
@Override
public void tableButtonClicked(int row, int col) {
// do something
}
});
TableColumn col = new TableColumn(1, 80);
col.setCellRenderer(buttonEditor);
col.setCellEditor(buttonEditor);
cols.addColumn(colPattern);
Если вы хотите отображать разные метки кнопок для каждой строки, вы должны вставить блок кода в getTableCellRendererComponent и getTableCellEditorComponent, чтобы изменить метку кнопки.
править: Код компилируется сейчас. Исправлена ошибка брекетинга в конструкторе TableButton.