2011-10-31 25 views
8

Uygulamamda, this örneğine benzer bir java tablosu kullanıyorum. Sorunum, bir hücrenin değerini değiştirdiğimde (yukarıdaki örnekte bile olsa) farklı bir hücreye tıklayana kadar veri modeli güncellenmiyor. Modelin değişmeyeceği hücre değerini değiştirdikten sonra tablonun altındaki gri alana tıklıyorum bile. Sanırım farklı bir hücreye tıklayana kadar odaklanmış hücre kalması. Bunu nasıl önleyebilirim ve tablo hücresini tıklatmadan modeli güncelleyebilirim. Eğer masanın altındaki metin alanında masa içeriği görebilir örneği çalıştırdığınızda ben düzenlemek Yukarıdaki örnek kod var JTable Hücre Güncelleştirmesi çalışmıyor

peşin

teşekkürler sorunu

public class JTableDemo extends JApplet { 
    private JTextArea txt = new JTextArea(4, 20); 

    // The TableModel controls all the data: 
    class DataModel extends AbstractTableModel { 
    Object[][] data = { { "one", "two", "three", "four" }, 
     { "five", "six", "seven", "eight" }, 
     { "nine", "ten", "eleven", "twelve" }, }; 

    // Prints data when table changes: 
    class TML implements TableModelListener { 
     public void tableChanged(TableModelEvent e) { 
     txt.setText(""); // Clear it 
     for (int i = 0; i < data.length; i++) { 
      for (int j = 0; j < data[0].length; j++) 
      txt.append(data[i][j] + " "); 
      txt.append("\n"); 
     } 
     } 
    } 

    public DataModel() { 
     addTableModelListener(new TML()); 
     fireTableDataChanged(); 
    } 

    public int getColumnCount() { 
     return data[0].length; 
    } 

    public int getRowCount() { 
     return data.length; 
    } 

    public Object getValueAt(int row, int col) { 
     return data[row][col]; 
    } 

    public void setValueAt(Object val, int row, int col) { 
     data[row][col] = val; 
     System.out.println(val); 
     // Indicate the change has happened: 
     fireTableDataChanged(); 
    } 

    public boolean isCellEditable(int row, int col) { 
     return true; 
    } 
    } 

    public void init() { 
    Container cp = getContentPane(); 
    JTable table = new JTable(new DataModel()); 
    cp.add(new JScrollPane(table)); 
    cp.add(BorderLayout.SOUTH, txt); 
    } 

    public static void main(String[] args) { 
    run(new JTableDemo(), 350, 200); 
    } 

    public static void run(JApplet applet, int width, int height) { 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add(applet); 
    frame.setSize(width, height); 
    applet.init(); 
    applet.start(); 
    frame.setVisible(true); 
    } 
} 

yansıtacak. Bir hücreyi güncelledikten sonra aşağıdaki metin kutusunda görünmelidir. Ancak 'setValueAt' yöntemi, farklı bir hücreye tıklayana kadar çağrı yapmayacaktır. davranış beklenen

+1

Sorunuzu düzenleyebilir ve sorunu gösteren bir [SSCCE] (http://sscce.org) ekleyebilir misiniz? –

+0

SSCCE +1 – mKorbel

cevap

8

Varsayılan güncelleştirme mekanizması, yalnızca hücre editörü odağı kaybettiğinde değiştirir. Hücreden sekme yapmak veya farklı bir hücreye tıklamak, model değişimini tetikleyen hayati "odak kaybına" neden olabilir. olay işleyebileceğimiz orada etkin unsur vardır çünkü gri alanda tıklamak

etkisi yoktur - masa tıklama yok sayar.

Bunu değiştirmek isterseniz, kullanıcıya kullanıcıya "düzenlemenin yapıldığı" olduğunu bildiren bir olay bulmanız gerekir. Bunu nasıl biliyorsun?

[DÜZENLE] bir düğme (kullanıcıların düzenlemek "akış" bozabilir tablo hücresini, düzenleme kapmak fareyi tıklayabilirsiniz "Kaydet" amaç, kaydetmek tıklayın sonraki hücreyi tıklayın dönmek ekleyerek bu Not klavye, düzenle, ...)

+0

Kaydet butonunu bunun için nasıl kullanabilirim? Benim için çalışabileceğini hissediyorum .. – nath

+0

Sadece bir etiket "Kaydet" ile hiçbir şey yapmaz bir düğme ekleyin.Kleopatra'nın cevabından müşteri mülkiyeti ile birlikte, bu hile yapmalıdır. Ek bir fare tıklaması anlamına geldiğinden, kullanıcılarınızı büyük ölçüde rahatsız edeceğini unutmayın. Kişilerin "Alt + S" (klavyeden ayrılmadan) ile düzenlemeyi durdurabilmeleri için bir anımsatıcı eklemeyi deneyin. –

+1

no: a focusLost varsayılan olarak _does_uygulamayı tetiklemez (bu, yaşları uzun süredir devam eden bir sorun olsa da, THEY en azından bu davranışı isteğe bağlı olarak ayarlamak için desteklenene kadar). Aslında, sekme işlemi veya başka bir hücreye tıklanma işlemi, tabloyu – kleopatra

12

: Düzenlenen değer A.G. gibi açık bir kullanıcı hareketine kadar destek modeli taahhüt edilmez Enter tuşuna basmak ya da masaüstünde başka bir yere tıklamak için ...

Tek bir tuhaflık (bazı hatalar JTable :-) gibi), tablonun "dışına" odaklanırken düzenleme varsayılan olarak sonlandırılmadı .

table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); 

BTW (ilgisiz, sadece aklı için): o bunu yaparken zorlamak için, istediğiniz yapılandırmanız gerekir her zaman yerine DataChanged çekiç bir cellUpdated olacağını burada, en ince taneli olay türünü yangın .

+0

gibi görünüyorsunuz Pazartesileri çok seviyorum, müthiş ve değerli bir cevap +1 – mKorbel