Bir JTable'ı düzenlenemez hale getirme


Yanıtlar:


22

Bir TableModel.

Şöyle bir sınıf tanımlayın:

public class MyModel extends AbstractTableModel{
    //not necessary
}

Aslında isCellEditable()ise falsebunu ihmal edebilir, böylece varsayılan olarak. (bkz: http://docs.oracle.com/javase/6/docs/api/javax/swing/table/AbstractTableModel.html )

Ardından, setModel()yönteminizi kullanın JTable.

JTable myTable = new JTable();
myTable.setModel(new MyModel());

1
Bir public voidyöntemin bir boolean döndürmesini sağlayamazsınız .
Geo

1
Ayrıca yöntemisCellEditable
Matt

Belirttiğiniz yaklaşım işe yararken, AbstractTableModel'de isEditable gibi bir yöntem yoktur. Var olan, rowIndex ve coulmnIndex'i parametre olarak alan isCellEditable (int, int) yöntemidir. Kullanıcı, "isCellEditable" yöntemini geçersiz kılarak belirli bir satır / sütun için düzenlemeyi seçmeli olarak etkinleştirebilir / devre dışı bırakabilir veya tüm hücreler için düzenlemeyi devre dışı bırakmak için varsayılan uygulamayı kullanabilir.
sateesh

151

İsCellEditable yöntemini geçersiz kılabilir ve istediğiniz gibi uygulayabilirsiniz, örneğin:

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

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

table.setModel(tableModel);

veya

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

JTable'ınız kaybolursa not alın

Bunu JTablekullandığınızda kayboluyorsa, bunun nedeni büyük olasılıkla yapıcıyı kullanmanız gerektiğidir DefaultTableModel(Object[][] data, Object[] columnNames).

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

3
Bu aynı zamanda çift tıklama olaylarının JTable ile doğru şekilde çalışmasını sağlamak için bir çözümdür. Bir çift tıklama normalde düzenleme moduna geçerken bir hücre tarafından tüketilir ve bu, hücrenin bunu yapmasını engeller ve bunun yerine çift tıklamayı JTable'ın kendisine gönderir. Çözüm için teşekkürler Nelson!
anchorite

2
@Jop o zaman kodunuzun başka bir yerinde bir sorun var - bir tablo asla kaybolmaz çünkü tablonun modeli düzenlenebilir değildir ...
kleopatra

1
@DougHau Java bilmiyormuşsunuz gibi görünüyorsa veya çoğu dil boolean işlemler için aynı-ish sözdizimini kullandığından bu kadar iyi bir dildir ... bu bir boolean döndürür ... Gidip çok basit bir Java bulmanızı tavsiye ederim öğretici ve baştan başlayın. Bu şekilde hızlanmaya çalışmak, her şeyi yanlış öğrenmenize neden olacak.
searchengine27

1
@DougHauf, ==, nesneleri (solda ve sağda) karşılaştıran ve bir boole döndüren Eşittir işlevi için bir takma addır. Sanırım bu booleleri değerlendiriyorsa ve genellikle bu tür ifadelerle kullanılıyorsa, örneğin eğer (a == b) bir şey yaparsa ifadeyi kullandınız. A == b yazdırmayı deneyin veya bunu bir değişken için atayın ve sonucu anlayın.
nelson eldoro

1
Yukarıdaki düzeltme de benim için çalışmıyor. Tablonun sütun ve veri öğelerinin kaybolmasına neden olur. Tablom, table = new JTable (tempTable, columnNames); ile oluşturulur; burada tempTable bir String [] [] ve Sütun Adları bir String [] 'dir. Sorunun yeni DefaultTableModel () 'in tablo modeli için veri ve sütun adlarını belirtmemesinden kaynaklandığını düşünüyorum. Veri modelinde bunları nasıl belirtebilirim? Table.setModel (tableModel (tempTable, columnNames)); denedim, ancak bu "sembol bulunamıyor" hatasına neden oluyor.
user1164199

51
table.setDefaultEditor(Object.class, null);

2
Bu en iyi ve en kolay cevaptır. Elbette düzenleyiciyi null olarak ayarlamanız gerekir, böylece onu düzenleyemezsiniz.
LEMUEL ADANE

Bu, tek seçimle harika çalışıyor. Benim isteğim buydu.
Wesos de Queso

Bu CEVAP olmalı!
KrishPrabakar

36

sadece ekle

table.setEnabled(false);

benim için iyi çalışıyor.


1
Özel bir masa modeli kullanmıyorsanız bu harika!
Kingsolmn

27
Ancak bir hücre veya satır seçemezsiniz.
tianz

3
Bu, bazı L & F'lerde "gri" görünecektir.
stommestack

2
Bu işe yarıyor. Teşekkürler. Bununla birlikte, Nelson'ın veri modeli yönteminin tablonun sütun ve veri öğelerinin neden kaybolmasına neden olduğunu hala bilmek istiyorum.
user1164199

1
Benim için iyi çalışıyor!
Colby Cox

10

TableModel'i bir dizi değerden otomatik olarak oluşturuyorsanız ("yeni JTable (Vektör, Vektör)" ile), düzenleyicileri sütunlardan kaldırmak belki daha kolaydır:

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
}

Düzenleyiciler olmadan veriler düzenlenemez.


4
Uygun olmayan yerlerde -1 rastgele bilgisayar korsanlığı asla bir seçenek değildir
kleopatra

Lütfen, neden "uygun olmayan yerlerde rastgele bir bilgisayar korsanlığı" olduğunu açıklayabilir misiniz? SetDefaultEditor () belgesine göre : "Düzenleyici boşsa, bu sütun sınıfı için varsayılan düzenleyiciyi kaldırır."
freesoft

evet, ve Object için varsayılana geri döner ;-) Böylece düzenlemeyi gerçekten devre dışı bırakmazsınız (yalnızca sütunlardan biri Object tipindeyse yanlışlıkla), ayrıca özel bir düzenleyiciye sahip olabilecek herhangi bir sütunu da kaçırıyorsunuz. Orada olan kontrol hücre düzenlenebilirlikten için uygulanabilir anlamına API ve bu modelin kanı. Diğer her şey bilgisayar korsanlığı ve bu nedenle uygunsuz.
kleopatra

Senin değinmek istediğin noktayı anlıyorum. Ancak api'den anladığım kadarıyla, hızlı bir şekilde bir tablo oluşturursam ("yeni JTable (Vector, Vector)" ile), bu durumda tablonun tüm sütunları için varsayılan düzenleyicileri olacağıdır. Bu nedenle, "table.setDefaultEditor (column, null)" çalıştırırsam, varsayılan düzenleyiciyi sütundan kaldıracağım, böylece sütunun herhangi bir düzenleyicisi olmayacak ve sütun düzenlenemez. Olacak mı?
freesoft

Masayı bu şekilde yarattım new JTable(Vector, Vector)ve benim için çalıştım. Hücrede editöre ihtiyacım yok, bu yüzden benim oyum var.
Dani Sancas


2

yeni DefaultCellEditor sınıfı oluşturun:

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

ve setCellEditor kullanın:

JTable table = new JTable();
table.getColumn("columnName").setCellEditor(new Editor_name(new JCheckBox()));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.