2012-03-29 15 views
23

Po utworzeniu komponentu JTable edycja komórek jest domyślnie włączona. Jak mogę uniemożliwić użytkownikowi edycję zawartości JTable?Wyłącz edycję użytkownika w JTable

+2

Zobacz [* Jak korzystać z tabel *] (http://docs.oracle.com/javase/tutorial/uiswing/components/table.html). – trashgod

Odpowiedz

33

JTable używa obiektu AbstractTableModel. To jest rzecz, którą przekazujesz do konstruktora JTable. Możesz napisać własną AbstractTableModel następująco

public class MyTableModel extends AbstractTableModel { 

     public boolean isCellEditable(int row, int column){ 
      return false; 
     } 

} 

a następnie zainicjować JTable jak

JTable myTable = new JTable(new MyTableModel()); 
+0

Próbowałem tego kodu, aby uniknąć sytuacji, w której użytkownik może edytować zawartość komórki, która działa. Jednak pozwala to również uniknąć zmiany zawartości komórki przez aplikację, czy istnieje jakieś obejście tego konkretnego scenariusza? – clement

+3

Wygląda na to, że po prostu podanie wartości boolowskiej nie było wystarczające dla projektantów ... – pauluss86

39

Można utworzyć JTable przy użyciu następującego kodu:

JTable jTable = new JTable() { 
     private static final long serialVersionUID = 1L; 

     public boolean isCellEditable(int row, int column) {     
       return false;    
     }; 
    }; 

zasadzie to, co robimy tu unieważniając isCellEditable i zawsze zwraca false od niego. Spowoduje to utworzenie JTabel non editabe.

+0

Jeśli to wszystko, co robię, nie widzę problemu z używaniem anonimowej klasy. – Chase

+3

to powinna być lepsza odpowiedź. Nie znajduję tutaj niczego złego w używaniu klasy anon. Dodatkowo użytkownik może używać innego 'TableModel' w innej lokalizacji. Awansuj! – instinct

+2

+1 @institute, ponieważ nie ma to wpływu na model tabeli, jest to znacznie lepsza odpowiedź, według mnie. Pytanie: czy serialVersionUID jest naprawdę potrzebny? – Paul

4

Hi Pracuję dużo na java więc dam ci mój sposób: Istnieje dwie możliwości, pierwsza pod netbeans. Przejdź do dostosowywania kodu i wykonaj go w następujący sposób:

JTArticleJPAddArrticle = new javax.swing.JTable(); 

JTArticleJPAddArrticle.setBackground(new java.awt.Color(204, 204, 255)); 

JTArticleJPAddArrticle.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] { 

}, 
new String [] { 
    "Reference","Libellé","Marque","Prix d'achat","Prix de vente","Quantité","Total","Etat" 
} 
){ 
public boolean isCellEditable(int rowIndex, int columnIndex) { 
    return false; 
} 
}); 



jScrollPane8.setViewportView(JTArticleJPAddArrticle); 

Moim innym sposobem jest zrobienie instancji modelu tabeli. To jest drugi sposób:

model=new DefaultTableModel(head, 0){ 

    @Override 
    public boolean isCellEditable(int i, int i1) { 
     return false; //To change body of generated methods, choose Tools | Templates. 
    } 

    }; 
jtable.setmodel(model); 

Ciesz się, że działa dobrze dla mnie. Wszystko, co chcę zrobić, to pomóc wam wyjść, ponieważ wcześniej bardzo mi pomogło.

+0

Oba są w ten sam sposób.Drugi fragment kodu zawiera mniej nieistotnego kodu, co czyni go lepszym rozwiązaniem. –

+0

@MicahStairs w procesie wykonywania, pierwszy jest lepszy, ponieważ klasa zostanie skompilowana łatwo, a druga to nadpisanie, które zajmie trochę więcej czasu, ale w widoku projektu dla programisty drugi jest łatwiejszy do utrzymania kod; –

10
myTable.setDefaultEditor(Object.class, null); 
+2

Może mógłbyś wyjaśnić te prace i wymienić wady? Wygląda na to, że semantyka różni się od poprzednich odpowiedzi - tj. ustawiasz edytor pusty. Być może jest to wolniejsze, ponieważ zapewnienie, że tabela jest edytowalna, wymaga zastosowania dłuższej ścieżki kodu? –

+1

To jest prosta odpowiedź, której szukałem. Może nie być najlepszym osiągnięciem, ale jego prostota jest tego warta. – Cristian

2

Czy Bogate prosto:

JTable table = new JTable(); 
table.setEnabled(false); 

O JComponent.setEnabled(boolean) to Sayes:

Zestawy czy składnik ten jest włączony. Włączony komponent może reagować na dane wprowadzone przez użytkownika, natomiast komponent, który nie jest włączony, nie może odpowiedzieć na dane wprowadzone przez użytkownika. Niektóre składniki mogą zmieniać swoją reprezentację wizualną, gdy są wyłączone, aby przekazać użytkownikowi informację zwrotną, że nie mogą odbierać danych wejściowych.

Jeśli chodzi o JTable, nie wydaje się, aby w ogóle dostarczył wizualnej informacji zwrotnej. Z dodatkiem możliwości klikania nagłówków kolumn. W mojej implementacji aplikacja może nadal zmieniać zawartość komórek.

+0

Ups. Właśnie zobaczyłem, że użytkownik Siddhu przyszedł z tym samym rozwiązaniem tutaj: http://stackoverflow.com/questions/1990817/how-to-make-a-jtable-non-editable?noredirect=1&lq=1. nie wiem, czy powinienem go tutaj usunąć, czy też go zostawić, ponieważ nie wiem, które pytanie może zostać usunięte jako duplikat. Niestety, noob tutaj: o – brat

+0

Problem polega na tym, że użytkownik nie może zobaczyć, czy dowolny wiersz lub komórka jest zaznaczona, nawet po kliknięciu. Zauważyłem, że użycie 'setDefaultEditor()' jest lepsze niż to, ponieważ zapewnia wizualną informację zwrotną, gdy użytkownik wybierze dowolny wiersz lub komórkę. – anotherGatsby

0
 tm = new javax.swing.table.DefaultTableModel() 
       { 
         public Class<?> getColumnClass(int column) 
         { 
         switch(column) 
         { 
         case 0: 
          return String.class; 
         case 1: 
          return String.class; 
         case 2: 
          return String.class; 
         case 3: 
          return String.class; 
         case 4: 
          return String.class; 
         case 5: 
           return String.class; 
          case 6: 
           return String.class; 
          case 7: 
           return String.class; 
          case 8: 
           return String.class; 
          case 9: 
            return String.class; 
           case 10: 
            return String.class; 
           case 11: 
            return Boolean.class; 

          default: 
          return String.class; 
         } 
         } 

         @Override 
         public boolean isCellEditable(int row, int column) { 
         /* Set the 11th column as editable and rest non- 
           editable */ 
          if(column==11){ 
           return true; 
          }else{ 
//all other columns to false 
         return false; 
          } 
         } 
        }; 
    table = new javax.swing.JTable(tm); 
+0

Proszę [edytuj] (https://stackoverflow.com/posts/49110309/edit) swoją odpowiedź, aby wyjaśnić, dlaczego ten fragment kodu odpowiada na pytanie. –