Jak uczynić JTable nieedytowalnym

Odpowiedzi:

22

Możesz użyć TableModel.

Zdefiniuj klasę w ten sposób:

public class MyModel extends AbstractTableModel{
    //not necessary
}

w rzeczywistości isCellEditable()jest to falseustawienie 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 swojego JTable.

JTable myTable = new JTable();
myTable.setModel(new MyModel());
JCasso
źródło
1
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:

//instance table model
DefaultTableModel tableModel = new DefaultTableModel() {

    @Override
    public boolean isCellEditable(int row, int column) {
       //all cells false
       return false;
    }
};

table.setModel(tableModel);

lub

//instance table model
DefaultTableModel tableModel = new DefaultTableModel() {

   @Override
   public boolean isCellEditable(int row, int column) {
       //Only the third column
       return column == 3;
   }
};

table.setModel(tableModel);

Zwróć uwagę, jeśli twój JTable zniknie

Jeśli twój JTableznika, gdy go używasz, najprawdopodobniej musisz użyć DefaultTableModel(Object[][] data, Object[] columnNames)konstruktora.

//instance table model
DefaultTableModel tableModel = new DefaultTableModel(data, columnNames) {

    @Override
    public boolean isCellEditable(int row, int column) {
       //all cells false
       return false;
    }
};

table.setModel(tableModel);
nelson eldoro
źródło
3
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”.
user1164199
50
table.setDefaultEditor(Object.class, null);
Oleg Michajłow
źródło
2
To najlepsza i najłatwiejsza odpowiedź. Oczywiście musisz ustawić edytor na null, więc nie będziesz mógł go edytować.
LEMUEL ADANE
Działa to świetnie w przypadku pojedynczego wyboru. Co było moim wymaganiem.
Wesos de Queso
To powinna być ODPOWIEDŹ!
KrishPrabakar
36

poprostu dodaj

table.setEnabled(false);

to działa dobrze dla mnie.

Siddhu
źródło
1
Jest to świetne rozwiązanie, jeśli nie używasz niestandardowego modelu stołu!
Kingsolmn,
27
Ale nie będziesz mógł wybrać komórki ani wiersza.
tianz
3
W niektórych L & F będzie to wyglądało na „wyszarzone”.
stommestack
2
To działa. Dzięki. Jednak nadal chciałbym wiedzieć, dlaczego metoda modelu danych firmy Nelson powoduje zniknięcie kolumny tabeli i elementów danych.
user1164199
1
U mnie dobrze działa!
Colby Cox,
10

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:

JTable table = new JTable(my_rows, my_header);

for (int c = 0; c < table.getColumnCount(); c++)
{
    Class<?> col_class = table.getColumnClass(c);
    table.setDefaultEditor(col_class, null);        // remove editor
}

Bez edytorów danych nie będzie można edytować.

freesoft
źródło
4
-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.

JTable myTable = new JTable();
myTable.setEnabled(false);
user3518835
źródło
2
Wybór nie będzie możliwy.
h3xStream
Proste i przyjemne rozwiązanie
Nuwan Harshakumara Piyarathna
Pytanie dotyczy edytowalności nie jest włączone. Włączenie nie rozwiązuje celu
shaILU
2

utwórz nową klasę DefaultCellEditor:

public static class Editor_name extends DefaultCellEditor {
  public Editor_name(JCheckBox checkBox) {
   super(checkBox);
  }
  @Override
  public boolean isCellEditable(EventObject anEvent) {
    return false;
  }
}

i użyj setCellEditor:

JTable table = new JTable();
table.getColumn("columnName").setCellEditor(new Editor_name(new JCheckBox()));
Ehsan Jelodar
źródło