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.
Author: Lahiru Ashan, 2008-09-17

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 JTables.

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.

 31
Author: morsch,
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.

 1
Author: ,
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:41:49

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?

 1
Author: James A Wilson,
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
 1
Author: ShawnD,
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)

 0
Author: Richard Walton,
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 {
    }
}
 0
Author: Maxwell Cheng,
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