/ / JTable set disabled checkbox look for uneditable cell - java, swing, jtable, boolean, jcheckbox

JTable set disabled checkbox look for uneditable cell - java, swing, jtable, boolean, jcheckbox

mam JTable z kolumną wartości logicznych. W zależności od stanu przechowywanego w modelu sprawiam, że niektóre lub wszystkie z nich są nieedytowalne (model "s" isCellEditable() zwraca false). Jednak to nie sprawia, że JTable Boolean Renderer, aby uczynić pola wyboru jako wyłączone dla komórki nieedytowalnej.

Czy istnieje sposób na osiągnięcie tego innego niż pisanie niestandardowego renderowania Boolean?

Jeśli muszę napisać mój własny renderer, jaką klasę powinienem rozszerzyć poza JCheckbox? Po prostu trzeba wyłączyć pole wyboru przed renderowaniem i nie chcę implementować całego kodu renderowania i obsługiwać wybranego wyglądu i innych rzeczy.

Odpowiedzi:

3 dla odpowiedzi № 1

Nie powoduje to jednak renderowania logicznego JTable w celu wyrenderowania pól wyboru jako wyłączonych dla komórki nieedytowalnej.

Jest to poprawne, ponieważ jest to domyślne zachowanie renderera: JCheckBox jest nieedytowalny, ale nie wyłączone.

Czy istnieje sposób na osiągnięcie tego innego niż pisanie niestandardowego renderowania Boolean?

Nie, o ile wiem.

Czy muszę napisać własny renderer, jaką klasę powinienem rozszerzyć poza JCheckbox?

Nie jest obowiązkowe rozszerzanie jakiejkolwiek klasy do implementacji TableCellRenderer berło. Możesz doskonale mieć JCheckBox jako członek klasy renderer, w rzeczywistości kompozycja jest preferowana w stosunku do dziedziczenia.

Po prostu trzeba wyłączyć pole wyboru przed renderowaniem i nie chcę implementować całego kodu renderowania i obsługiwać wybranego wyglądu i innych rzeczy.

To nie jest takie trudne i możesz kontrolować, co się dzieje. Weźmy przykład poniżej:

class CheckBoxCellRenderer implements TableCellRenderer {

private final JCheckBox renderer;

public CheckBoxCellRenderer() {
renderer = new JCheckBox();
renderer.setHorizontalAlignment(SwingConstants.CENTER);
}

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Color bg = isSelected ? table.getSelectionBackground() : table.getBackground();
renderer.setBackground(bg);
renderer.setEnabled(table.isCellEditable(row, column));
renderer.setSelected(value != null && (Boolean)value);
return renderer;
}
}

Zobacz te pytania i odpowiedzi, aby uzyskać powiązany problem: JXTable: użyj TableCellEditor i TableCellRenderer dla konkretnej komórki zamiast całej kolumny


0 dla odpowiedzi nr 2

Bez czynnego przykładu trudno powiedziećDokładnie to, co jest nie tak, ale wygląda na to, że zapomniałeś wywołać zdarzenie modyfikacji tabeli, aby powiadomić JTable, że musi się odświeżyć. Potrzebujesz czegoś takiego w swoim modelu, gdy dokonasz zmiany:

fireTableChanged(new TableModelEvent(sourceModel, firstRow, lastRow, tableCol));

Istnieją różne zdarzenia zmiany tabeli, które można uruchamiać, oraz różne parametry, które można przekazać do konstruktora TableModelEvent. Więcej informacji można znaleźć w Javadocs tutaj: http://docs.oracle.com/javase/8/docs/api i tutoriale Java tutaj: http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#fire. Będziesz musiał przeczytać je, aby ustalić, które z nich są odpowiednie dla twoich szczególnych okoliczności.

Wątpię, aby wymagany był niestandardowy rendererz boolowski.