Nie możesz mieć public voidmetody zwracającej wartość logiczną.
Geo
1
Również metoda toisCellEditable
Matt
Chociaż określone podejście działa, nie ma takiej metody, jak isEditable w AbstractTableModel. Istnieje metoda isCellEditable (int, int), która przyjmuje rowIndex i coulmnIndex jako parametry. Użytkownik może wybiórczo włączyć / wyłączyć edycję dla określonego wiersza / kolumny, zastępując metodę „isCellEditable” lub użyć domyślnej implementacji, aby wyłączyć edycję dla wszystkich komórek.
sateesh
150
Możesz zastąpić metodę isCellEditable i zaimplementować ją tak, jak chcesz, na przykład:
Jest to również rozwiązanie umożliwiające poprawne działanie zdarzeń podwójnego kliknięcia z JTable. Podwójne kliknięcie jest zwykle używane przez komórkę, gdy przechodzi w tryb edycji, co powstrzyma komórkę przed zrobieniem tego i zamiast tego wyśle podwójne kliknięcie do samego JTable. Dzięki za rozwiązanie, Nelson!
anchorite
2
@Jop, więc coś jest nie tak w innym miejscu w twoim kodzie - tabela nigdy nie znika tylko dlatego, że modelu tabeli nie można edytować ...
kleopatra
1
@DougHauf wygląda na to, że nie znasz Javy, ani naprawdę żadnego języka, który dobrze, ponieważ większość języków używa tej samej składni dla operacji logicznych ... która zwraca wartość logiczną ... Polecam znaleźć bardzo podstawową Javę tutorial i zacznij od początku. Próba wskoczenia w swing w ten sposób skończy się na tym, że nauczysz się wszystkiego źle.
Searchengine 27
1
@DougHauf, == jest aliasem funkcji Equals, która porównuje obiekty (po lewej i prawej stronie) i zwraca wartość logiczną. Przypuszczam, że użyłeś instrukcji, jeśli oblicza wartości logiczne i zwykle jest używana z tego rodzaju wyrażeniami, na przykład jeśli (a == b) coś zrobisz. Spróbuj wydrukować a == b lub po prostu przypisz to do zmiennej i zrozum wynik.
nelson eldoro
1
Powyższa poprawka również nie działa dla mnie. Powoduje to zniknięcie kolumny i elementów danych w tabeli. Moja tabela jest tworzona za pomocą table = new JTable (tempTable, columnNames) ;, gdzie tempTable to String [] [], a Column Names to String []. Uważam, że problem jest spowodowany tym, że nowa DefaultTableModel () nie określa danych i nazw kolumn dla modelu tabeli. Jak określić je w modelu danych. Próbowałem table.setModel (tableModel (tempTable, columnNames));, ale to powoduje błąd „nie można znaleźć symbolu”.
-1 losowe hakowanie w nieodpowiednich lokalizacjach nigdy nie wchodzi w grę
kleopatra
Czy możesz wyjaśnić, dlaczego jest to „przypadkowe włamanie do nieodpowiednich lokalizacji”? Zgodnie z dokumentem setDefaultEditor () : „Jeśli edytor ma wartość null, usuwa domyślny edytor dla tej klasy kolumn”.
freesoft
tak, i wraca do wartości domyślnych dla Object ;-) Więc tak naprawdę nie wyłączasz edycji (tylko przypadkowo, jeśli jedna z kolumn jest typu Object), brakuje również kolumn, które mogą mieć niestandardowy edytor. Jest to API ma być realizowany do możliwości edycji komórek kontrola, a to modelu. Wszystko inne jest hakowaniem i jako takie jest nieodpowiednie.
kleopatra
Rozumiem co masz na myśli. Ale to, co zrozumiałem z interfejsu API, to to, że jeśli utworzę tabelę w szybki sposób (z "nowym JTable (Vector, Vector)"), to tabela będzie miała domyślne edytory dla wszystkich swoich kolumn. Jeśli więc uruchomię "table.setDefaultEditor (column, null)", to usunę domyślny edytor z kolumny, więc kolumna nie będzie miała żadnego edytora, a kolumna nie będzie edytowalna. Czy to będzie?
freesoft
Stworzyłem stół w ten sposób new JTable(Vector, Vector)i pracowałem dla mnie. Nie potrzebuję redaktora w żadnej komórce, więc masz mój głos.
Dani Sancas,
3
Użyłem tego i zadziałało: jest bardzo proste i działa dobrze.
Odpowiedzi:
Możesz użyć
TableModel
.Zdefiniuj klasę w ten sposób:
w rzeczywistości
isCellEditable()
jest tofalse
ustawienie domyślne, więc możesz je pominąć. (patrz: http://docs.oracle.com/javase/6/docs/api/javax/swing/table/AbstractTableModel.html )Następnie użyj
setModel()
metody swojegoJTable
.źródło
public void
metody zwracającej wartość logiczną.isCellEditable
Możesz zastąpić metodę isCellEditable i zaimplementować ją tak, jak chcesz, na przykład:
lub
Zwróć uwagę, jeśli twój JTable zniknie
Jeśli twój
JTable
znika, gdy go używasz, najprawdopodobniej musisz użyćDefaultTableModel(Object[][] data, Object[] columnNames)
konstruktora.źródło
źródło
poprostu dodaj
to działa dobrze dla mnie.
źródło
Jeśli tworzysz model TableModel automatycznie z zestawu wartości (z „nowym JTable (Vector, Vector)”), być może łatwiej będzie usunąć edytory z kolumn:
Bez edytorów danych nie będzie można edytować.
źródło
new JTable(Vector, Vector)
i pracowałem dla mnie. Nie potrzebuję redaktora w żadnej komórce, więc masz mój głos.Użyłem tego i zadziałało: jest bardzo proste i działa dobrze.
źródło
utwórz nową klasę DefaultCellEditor:
i użyj setCellEditor:
źródło