Edytowalny Samouczek JTable
Czy są jakieś dobre książki lub strony internetowe, które idą nad tworzeniem JTable
? Chcę, aby jedna kolumna była edytowalna. Chciałbym umieścić odziedziczony komponent JCheckBox
(który stworzyliśmy tutaj) w jednej z kolumn tabeli, zamiast po prostu umieścić tabelę JCheckBox
w oparciu o to, że jest to edytowalne pole boolean
.
Mam JFC Swing Tutorial Second Edition książka, ale chciałbym tylko wiedzieć, czy są inne przykłady, które mógłbym rzucić okiem i nauczyć się radzić sobie z tabelami lepiej. Książka wydaje się po prostu wziąć java 'szlak' w Internecie i umieścić go w książce.
[4]}czytam ponownie te rzeczy, tylko jestem ciekaw, czy ktoś znalazł coś, co może pomóc bardziej.6 answers
Aby kolumna była edytowalna musisz nadpisać metodę isCellEditable
W TableModel
. Tworzenie TableModel
jest dość łatwe, jeśli dziedziczysz AbstractTableModel
i polecam go wszystkim, ale najprostszym JTable
s.
Jednak dostosowanie TableModel
jest tylko częścią tego, co musisz zrobić. Aby rzeczywiście uzyskać niestandardowy komponent w JTable
, Musisz ustawić niestandardowy renderer komórek. Aby użyć interaktywnego komponentu niestandardowego, musisz ustawić niestandardowy edytor komórek. W niektórych przypadkach wystarczy użyć nieco zmodyfikowanych wersje domyślnych klas dla tego.
Redakcja
Jeśli masz już własny komponent można łatwo zrobić za pomocą delegacji: Utwórz nową klasę implementującą {[7] } i zwróć nową instancję komponentu w metodzie getCellEditorComponent
. Parametry tej metody zawierają bieżącą wartość, a także współrzędne komórki, link do tabeli i zaznaczona jest komórka.
TableCellEditor
ma również metodę, która jest wywoływana, gdy użytkownik zatwierdza zmianę zawartości komórki (gdzie można zweryfikować dane wejściowe użytkownika i dostosować model) lub anuluje edycję. Pamiętaj, aby wywołać metodę stopEditing()
w edytorze, jeśli kiedykolwiek programowo przerwiesz edycję, w przeciwnym razie komponent edytora pozostanie na ekranie - debugowanie Zajęło mi jakieś 2 godziny.
Zauważ, że w obrębie JTable
redaktorzy i tylko redaktorzy otrzymują wydarzenia! Wyświetlanie przycisku można wykonać za pomocą renderera. Ale aby uzyskać działający przycisk, musisz zaimplementuj edytor z poprawnym EventListeners
zarejestrowanym. Rejestracja słuchacza na rendererze nie robi nic.
Renderery
Implementacja renderera nie jest konieczna do tego, co opisujesz w swoim pytaniu, ale zazwyczaj i tak to robisz, choćby w przypadku drobnych modyfikacji. Renderery, w przeciwieństwie do edytorów, mają kluczowe znaczenie dla szybkości. getTableCellRendererComponent
renderera jest wywoływany raz dla każdej komórki w tabeli! komponent zwracany przez renderer jest używany tylko do malowania komórki, a nie do interakcji, a tym samym może być "ponownie użyty" dla następnej komórki. Innymi słowy, powinieneś dostosować komponent (np. używając setText(...)
lub setFont(...)
, jeśli jest to TextComponent
) w rendererze, powinieneś , a nie tworzyć nowe instancje - to łatwy sposób na sparaliżowanie wydajności.
Caveats
Zauważ, że aby renderery i edytory działały, musisz powiedzieć JTable
Kiedy używać określonego renderera/edytora. Istnieją zasadniczo dwa sposoby, aby to zrobić. Ty może ustawić domyślny renderer/edytor komórek dla określonego typu za pomocą odpowiednich metod JTable
. Aby ten sposób zadziałał, twój TableModel
musi zwrócić dokładnie ten typ w metodzie getColumnClass(...)
! Domyślny model tabeli Nie zrobi to za Ciebie, zawsze zwraca Object.class
. Jestem pewien, że jeden z nich zaskoczył wielu ludzi.
Innym sposobem ustawienia edytora / renderera jest jawne ustawienie go na samej kolumnie, czyli uzyskanie TableColumn
za pomocą metody getTableColumn(...)
JTable
. Jest to o wiele bardziej rozbudowane, jednak jest to również jedyny sposób na posiadanie dwóch różnych rendererów / edytorów dla jednej klasy. Na przykład twój model może mieć dwie kolumny łańcucha klas, które są renderowane na zupełnie różne sposoby, może raz używając JLabel/DefaultRenderer
, a drugi używając JButton
, Aby uzyskać dostęp do bardziej rozbudowanego edytora.
JTable
ze swoimi niestandardowymi rendererami i edytorami jest niezwykle wszechstronny, ale jest również wiele do wzięcia i jest wiele rzeczy do zrobienia źle. Dobrze. szczęście!
Jak korzystać z tabel w Swing Tutorial {[74] } jest obowiązkową lekturą dla każdego, kto dostosowuje JTables. W szczególności, czytać i ponownie czytać koncepcje: Edytory i Renderery, ponieważ zwykle zajmuje trochę czasu, aby to "kliknąć". Przykłady niestandardowych rendererów i edytorów są również bardzo wartościowe.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-24 12:23:36
Klasa, którą chcesz rozszerzyć, aby stworzyć własne zachowanie, jest DefaultTableModel. To pozwoli Ci zdefiniować własne zachowanie. Przyzwoity samouczek można znaleźć na stronie sun.
Ten samouczek z java lobby jest łatwy do naśladowania. Internetowy Swing trail dla JTable, do którego się odwołujesz, wskazuje, że został zaktualizowany. Czy przeskanowałeś całość w poszukiwaniu możliwych lepszych (czy nowsze nie zawsze są lepsze) informacji?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 16:55:17
Jeśli próbujesz użyć prostej JTable
z 1 kolumną edytowalną i znasz lokalizację kolumny, zawsze możesz użyć domyślnego modelu tabeli i przeciążyć wywołanie isCellEditable
.
Coś takiego:
myTable.setModel(new DefaultTableModel(){
@Override
public boolean isCellEditable(int row, int column) {
if (column == x) {
return true;
} else
return false;
}
});
I dla pola wyboru Utwórz klasę renderer
MyCheckBoxRenderer extends JCheckBox implements TableCellRenderer
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-15 05:18:51
Niektóre przydatne klasy to:
Package javax.swing.table
:
TableModel
- Interfejs dla tablemodel
AbstractTableModel
- Ładna Klasa do rozszerzenia do tworzenia własnej tabeli z niestandardowymi strukturami danych
DefaultTableModel
- domyślny model tabeli, który może obsługiwać arrays[]
i Vectors
Aby wyłączyć edycję w dowolnej komórce, musisz nadpisać metodę isCellEditable(int row, int col)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-15 05:13:24
W modelu tabeli powinieneś zastąpić funkcje "isCellEditable" i "setValueAt", jak poniżej.
Kolumna 4 jest kolumną dla edytowalnych komórek.
Następnie po dwukrotnym kliknięciu komórki i wpisaniu czegoś,
zostanie wywołana metoda setValueAt() i zapisze wartość w polu DO,col4 modułu tabeli.
public ArrayList<XXXDO> tbmData = new ArrayList<XXXDO>(); //arraylist for data in table
@Override
public boolean isCellEditable(int row, int col) {
if (col == 4) {
return true;
} else {
return false;
}
}
@Override
public void setValueAt(Object value, int row, int col) {
if ((row >= 0) && (row < this.tbmData.size()) && (col >= 0) && (col < this.colNm.length)) {
if (col == 4) {
tbmData.get(row).col4= (String) value;
}
fireTableCellUpdated(row, col);
} else {
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-05 10:09:47