Cara membuat JTable tidak dapat diedit

Jawaban:

22

Anda dapat menggunakan file TableModel.

Tentukan kelas seperti ini:

public class MyModel extends AbstractTableModel{
    //not necessary
}

sebenarnya isCellEditable()secara falsedefault sehingga Anda dapat mengabaikannya. (lihat: http://docs.oracle.com/javase/6/docs/api/javax/swing/table/AbstractTableModel.html )

Kemudian gunakan setModel()metode Anda JTable.

JTable myTable = new JTable();
myTable.setModel(new MyModel());
JCasso
sumber
1
Anda tidak dapat memiliki public voidmetode yang mengembalikan boolean.
Geo
1
Juga metodenya adalahisCellEditable
Matt
Meskipun pendekatan yang Anda tentukan berfungsi, tidak ada metode seperti isEditable di AbstractTableModel. Apa yang ada adalah metode isCellEditable (int, int) yang menggunakan rowIndex dan coulmnIndex sebagai parameter. Pengguna dapat secara selektif mengaktifkan / menonaktifkan pengeditan untuk baris / kolom tertentu dengan mengganti metode "isCellEditable" atau dapat menggunakan implementasi default untuk menonaktifkan pengeditan untuk semua sel.
sateesh
150

Anda dapat mengganti metode isCellEditable dan mengimplementasikan sesuai keinginan Anda, misalnya:

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

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

table.setModel(tableModel);

atau

//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);

Catatan jika JTable Anda menghilang

Jika Anda JTablemenghilang saat Anda menggunakan ini kemungkinan besar karena Anda perlu menggunakan DefaultTableModel(Object[][] data, Object[] columnNames)konstruktor sebagai gantinya.

//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
sumber
3
Ini juga merupakan solusi untuk membuat acara klik ganda bekerja dengan benar dengan JTable. Sebuah klik ganda biasanya dikonsumsi oleh sel saat masuk ke mode edit, dan ini akan mencegah sel melakukan itu dan sebagai gantinya mengirim klik ganda ke JTable itu sendiri. Terima kasih atas solusinya, Nelson!
pertapa
2
@Jop maka ada sesuatu yang salah di tempat lain dalam kode Anda - tabel tidak pernah hilang hanya karena model tabel tidak dapat diedit ...
kleopatra
1
@DougHauf tampaknya Anda tidak tahu Java, atau benar-benar bahasa apa pun yang baik karena sebagian besar bahasa menggunakan sintaks yang sama untuk operasi boolean ... yang mengembalikan boolean ... Saya akan merekomendasikan Anda mencari Java yang sangat dasar tutorial dan mulai dari awal. Mencoba melompat ke ayunan seperti ini akan berakhir dengan Anda mempelajari segala sesuatu yang salah.
searchengine27
1
@DougHauf, == adalah alias untuk fungsi Sama dengan yang membandingkan objek (di kiri dan kanan) dan mengembalikan boolean. Saya kira Anda telah menggunakan pernyataan jika yang mengevaluasi boolean dan biasanya digunakan dengan ekspresi semacam ini misalnya jika (a == b) melakukan sesuatu. Cobalah untuk mencetak a == b atau cukup tetapkan ini untuk variabel dan pahami hasilnya.
nelson eldoro
1
Perbaikan di atas juga tidak berhasil untuk saya. Ini menyebabkan kolom tabel dan elemen data menghilang. Tabel saya dibuat dengan table = new JTable (tempTable, columnNames) ;, dimana tempTable adalah String [] [] dan Column Names adalah String []. Saya yakin masalah ini disebabkan oleh DefaultTableModel () baru yang tidak menentukan nama data dan kolom untuk model tabel. Bagaimana cara menentukannya dalam model data. Saya mencoba table.setModel (tableModel (tempTable, columnNames)) ;, tetapi itu menyebabkan kesalahan "tidak dapat menemukan simbol".
pengguna1164199
50
table.setDefaultEditor(Object.class, null);
Oleg Mikhailov
sumber
2
Ini adalah jawaban terbaik dan termudah. Tentu saja, Anda harus mengatur editor ke null sehingga Anda tidak dapat mengeditnya.
LEMUEL ADANE
Ini bekerja sangat baik dengan satu pilihan. Yang merupakan permintaan saya.
Wesos de Queso
Ini harus menjadi JAWABAN!
KrishPrabakar
36

tambahkan saja

table.setEnabled(false);

itu bekerja dengan baik untuk saya.

Siddhu
sumber
1
Ini bagus jika Anda tidak menggunakan model tabel kustom!
Kingsolmn
27
Tapi Anda tidak akan bisa memilih sel atau baris.
tianz
3
Ini akan terlihat "diklik" di beberapa L & F.
Stommestack
2
Itu bekerja. Terima kasih. Namun, saya masih ingin tahu mengapa metode model data nelson menyebabkan kolom tabel dan elemen data tidak berfungsi.
pengguna1164199
1
Bekerja dengan baik untuk saya!
Colby Cox
10

Jika Anda membuat TableModel secara otomatis dari sekumpulan nilai (dengan "JTable baru (Vektor, Vektor)"), mungkin lebih mudah untuk menghapus editor dari kolom:

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
}

Tanpa editor, data tidak akan dapat diedit.

freesoft
sumber
4
-1 peretasan acak di lokasi yang tidak tepat tidak pernah menjadi pilihan
kleopatra
Tolong, dapatkah Anda menjelaskan mengapa ini adalah "peretasan acak di lokasi yang tidak tepat"? Menurut dokumen setDefaultEditor () : "Jika editor null, hapus editor default untuk kelas kolom ini."
freesoft
ya, dan kembali ke default untuk Object ;-) Jadi Anda tidak benar-benar menonaktifkan pengeditan (hanya secara tidak sengaja jika salah satu kolom berjenis Object), Anda juga kehilangan kolom yang mungkin memiliki editor kustom. Ada adalah api dimaksudkan untuk diimplementasikan untuk editability sel kontrol, dan itulah model. Segala sesuatu yang lain meretas dan karenanya tidak pantas.
kleopatra
Saya mengerti maksud Anda. Tetapi yang saya pahami dari api adalah, jika saya membuat tabel dengan cara cepat (dengan "JTable baru (Vektor, Vektor)"), maka tabel tersebut akan memiliki editor default untuk semua kolomnya. Jadi, jika saya menjalankan "table.setDefaultEditor (kolom, null)", maka saya akan menghapus editor default dari kolom, sehingga kolom tersebut tidak akan memiliki editor apa pun, dan kolom tersebut tidak dapat diedit. Akankah?
freesoft
Saya telah membuat tabel seperti itu new JTable(Vector, Vector)dan bekerja untuk saya. Saya tidak perlu editor di sel mana pun, jadi Anda memiliki hak pilih.
Dani Sancas
3

Saya menggunakan ini dan berhasil: sangat sederhana dan berfungsi dengan baik.

JTable myTable = new JTable();
myTable.setEnabled(false);
pengguna3518835
sumber
2
Pemilihan tidak mungkin dilakukan.
h3xStream
Solusi Sederhana dan Baik
Nuwan Harshakumara Piyarathna
Pertanyaan tentang editable tidak diaktifkan. Mengaktifkan tidak menyelesaikan tujuan
shaILU
2

buat kelas DefaultCellEditor baru:

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

dan gunakan setCellEditor:

JTable table = new JTable();
table.getColumn("columnName").setCellEditor(new Editor_name(new JCheckBox()));
Ehsan Jelodar
sumber