2011-06-07 19 views
6

Özgün bir modele sahip bir JTable'ım var, AbstractTableModel. Ben getColumnClass yöntemini uyguladık Çünkübir JTable hücresine bir fare dinleyicisi ekleme onay kutusu olarak işlenen bir Boolean değeri tutan

public abstract class AbstractTable extends AbstractTableModel{ 

    public Class<? extends Object> getColumnClass(int c) {} 
} 

, Boole değerleri onay kutularını gibi tabloda oluşturulur. Onay kutusunun durum değişikliğini engellemek istiyorum ancak maalesef doğrudan bir fare dinleyicisi ekleyemiyorum, çünkü benim tarafımdan oluşturulmayan onay kutusunun kendisinde bir referansım yok.

Onay kutusu durum değişikliği olayını engellemek için bir fare dinleyicisi nasıl ayarlayabilirim?

DÜZENLEME:

@jzd yanıt doğrudur. SetValue yöntemindeki değişikliği yakalayabilirim. Ancak, bir fare dinleyicisi tabanlı yaklaşımın nasıl uygulanacağını bilmek isterim.

cevap

6
JTable içinde JCheckBox veya JRadioButton ile bağlantılarda bunu yapabilir

Özellikle, mantığı setValue() içine koymaktan kaçınmak istiyorum. iç veri yapısı güncelleme ve uygun bir olay yangın dışında seçilebilir bu değerler example olarak

, setValue() yöntem geçersiz değildir. ValueEditor, AbstractCellEditor ve ItemListener uygular, ValueRenderer ise JCheckBox genişler. Bu şekilde editör, editörün itemStateChanged() içindeki işleyicinin JCheckBox'unu dinleyebilir.

Ek: CellEditorListener Ekleme, JTree için here gösterilmektedir, başka bir yaklaşımdır. JTable'un kendisinin bir CellEditorListener olduğunu unutmayın.

+1

+1: evet, aradığım şey buydu. teşekkürler – Heisenbug

+0

iyi, gerçekten iyi bir, +1, – mKorbel

+1

+1 ... Bu hafta Swing ile bana inanılmaz derecede yardımcı olan 10 çöp kutusu olmalı! – The111

3

Fare dinleyicisi eklemek ek bir adım gibi görünüyor. Modelin setValue() yöntemindeki değişikliği engellemeyi öneririm.

setValue() yöntemini değiştiremezseniz, sonraki en iyi şey, değişiklikleri varsayılan blok düzenleyicisinden bile yakalamak ve gizlemek için iyi bir yöntem olmadığından değişiklikleri engelleyen CustomEditor şeklindedir. Ben @jzd tavsiyesi ile duramazlar

+0

Evet. Her neyse, bunun mümkün olup olmadığını ve bir fare dinleyicisi ile nasıl olduğunu bilmek isterim. Şu andan beri böyle yapıyorum. Masa modeli sınıfım biraz karmaşık. Tablo modelinin kendisinden durum değiştirilmekte olan eylemi gerçekleştirmek istediğim eylemi uzak tutmak için fare dinleyicisini kullanmak istiyorum. Özellikle mantığı setValue içine koymaktan kaçınmak istiyorum. Yine de teşekkürler – Heisenbug

+0

@Overbose, başka bir seçenek ile cevabı ile güncellendi. – jzd

+0

lütfen gönderimi gör – mKorbel

5

gerçekten hayır, beni düşünce TableMode#setValue gidiş

sağlamak değil düşünüyorum ama temelde iki seçenek

1) TableModelListener

2 vardır) AFAIK sadece TableCellEditor # isCellEditable

public boolean isCellEditable(EventObject getEvent) { 
    MouseEvent me = (MouseEvent) getEvent; 
    JTable table = (JTable) (me.getSource()); 
    Point point = me.getPoint(); 
    int column = table.columnAtPoint(point); 
    int row = table.rowAtPoint(point); 
    Rectangle rec = table.getCellRect(row, column, true); 
    //... 
} 
0

ben tam olarak aynı sorunu vardı ve ben de özel olarak onay kutusunu editörüne bir fare dinleyici istedi biliyorum, ama bir workarround "Veri Değişim Dinleme" bölümü altında here anlatıldığı bir TableModelListener olarak ekleyerek olabilir, ve değişikliği algıladığınızda davranışı taklit etmeyi deneyin, ancak farenin onay kutusunu veya farenin belirli eylemlerini (< gibi belirli şeylerin üzerindeyken) öğrenmek istiyorsanız>, kendinizinkini yapmak zorunda kalacağım. Bu davranışları uygulayan bir hücre editörünün uygulanması ...En azından bu ne yapardım?

Grettings! ...