JCheckBox w JTable

0

Witam

Mam komponent JTable który prezentuje dane z bazy. Jedną kolumnę ukryłem bo nie chcę by była widoczna. Chcę natomiast dodać nową kolumnę, w której będą się znajdowały komponenty typu JCheckBox. Zrobiłem coś takiego (w oparciu o tutorial ze strony Sun'a)

TableColumnModel tcm = tranDisplayedPosTable.getColumnModel();
tcm.removeColumn(tcm.getColumn(0));

TableColumn checkColumn = new TableColumn();
checkColumn.setHeaderValue("Do faktury");
checkColumn.setCellEditor(new DefaultCellEditor(checkBox));

tcm.addColumn(checkColumn);

Niestety wyświetla mi dodatkową kolumnę ale z wartościami z kolumny, którą ukryłem, nie z checkBox'ami
Dlaczego tak jest. Jeśli ktoś wie proszę o pomoc. Dzięki

Pozdrawiam

0

Pewności nie mam ale chyba nie tędy droga.

Najprościej byłoby aby twój model danych (TableModel) zawierał tą "nową kolumnę".
Wtedy przesłaniasz metodę getColumnClass z TableModel'u aby zwracała Boolean dla tej "nowej kolmny" i te checkBox'y będą z automatu wyświetlane.
Pewnie to czytałeś, ale rzuć jeszcze raz okiem na ten fragment: http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#editrender

Natomiast jeśli musi to być zrobione w ten sposób, który przytoczyłeś to powinieneś użyć TableCellRenderara' a nie tylko TableCellEditor'a. Czyli chyba coś w tym stylu:

TableColumn checkColumn = new TableColumn(); // ta "nowa kolumna" to pierwsza kolumna ??
checkColumn.setHeaderValue("Do faktury");
checkColumn.setCellRenderer(new CheckBoxCellRenderer());
checkColumn.setCellEditor(new DefaultCellEditor(checkBox));

W ten sposób będziesz musiał dodatkowo stworzyć klasę CheckBoxCellRenderer, która te chekcBox'y bedzie rysowała.
Czyli z kolei ten fragment raz jeszcze: http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#renderer

Pewnie da się to jeszcze jakoś inaczej zrobić, ale ja mam tylko takie pomysły.

0

Dzięki za pomoc. Jesli kogos to interesuje to zrobiłem to w nastepujacy sposób:

tranPositionTable.setModel(dm[1]);
tranPositionTable.setFocusable(false);

TableColumn tc = new TableColumn();
tc.setHeaderValue("Do faktury");
tc.setCellRenderer(new CheckBoxRenderer());

TableColumnModel tcm = tranPositionTable.getColumnModel();
tcm.removeColumn(tcm.getColumn(0));
tcm.addColumn(tc);

private class CheckBoxRenderer extends JCheckBox implements TableCellRenderer
{
public CheckBoxRenderer()
{
super();
}

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
	if (isSelected)
	{
		this.setBackground(tranPositionTable.getSelectionBackground());
		this.setForeground(tranPositionTable.getSelectionForeground());
	}
	else
	{
		this.setBackground(tranPositionTable.getBackground());
		this.setForeground(tranPositionTable.getForeground());
	}
					
	return this;
}

}

0

Witam

Chciałem wrócić to problemu osadzenia check box'a w JTable. Powyższy kod działa (check box'y są poprawnie wyświetlane) ale nie moge zaznaczać ani odznaczać checkbox'ów w poszczególnych rekordach, wiem że trzeba uzyć metody setCellEditor jednakże nie wiem do końca jak zaimplementować metody klasy ktrej obiekt bedzie uzyty jako parametr metody setCellEditor. Czy ktoś może mi pomóc??

Pozdrawiam

0

Ogólnie działa to tak:

Tabela wyświetla komórkę przez TableCellRenderer'a (metoda: getTableCellRendererComponent)
O edycji m.in. decyduje TableModel (metoda: isCellEditable)
Jak zaczyna się edycja, komórka jest wyświetlana przez TableCellEditor (metoda: getTableCellEditorComponent)
Jak kończy się edycja, nowa wartość jest zwracana przez TableCellEditor (metoda: getCellEditorValue)
Nową wartość zapisuje TableModel (metoda: setValueAt)

Jak chcesz użyć DefaultCellEditor'a to:
Prawdopodobnie coś on tam różnego zwraca po edycji w zależności czy ten checkBox został zaznaczony czy odznaczony. Czyli w TableModelu (u ciebie dm[1]) przesłaniasz metodę setValueAt(Object value, int row, int column) i zapisujesz sobie nową wartość (value) w... bazie (?). (prawdopodobnie - bo nie wiem czym dokładnie będzie to value - trzeba by w google poszukac)

Jak chcesz zrobić swojego TableCellEditora to możesz np tak:

public class ChecBoxEditor extends AbstractCellEditor implements TableCellEditor {

    private CheckBoxRenderer renderer;

    public CheckBoxRenderer() {
        renderer = new CheckBoxRenderer();
    }

    public Component getTableCellEditorComponent(
            JTable table,
            Object value,
            boolean isSelected,
            int row,
            int column) {

        return renderer.getTableCellRendererComponent(table, value, isSelected, true, row, column);
    }

    public Object getCellEditorValue() { 
        if(renderer.isSelected()) return new Boolean(true);
        return new Boolean(false);
    }
}

Pamiętaj, że tutaj też musisz w TableModelu przesłonić metodę setValueAt(Object value, int row, int column). To value to jest właśnie ten Boolean z CheckBoxEditor'a.

1 użytkowników online, w tym zalogowanych: 0, gości: 1