2016-04-05 51 views
0

Özel bir TableModel, hücre/sütun seçimi devre dışı bırakılmış ve yalnızca satır seçimi etkinleştirilmiş (tek seçim) bir JScrollPane içinde bir JTable kullanıyorum. Bir satır seçtiğimde, zaman zaman, tıklama yaptığım hücredeki değer de komşu sütunlarında görünür (ve oradaki değerlerin üzerine yazar). Herkes bana bir ipucu verebilir mi, yanlış yaptığım ya da başka birinin bu problemle karşı karşıya kalması olabilir mi?Satırları seçerken JTable'ın garip davranışı

Yardımlarınız için şimdiden teşekkür ederiz!

DÜZENLEME: Bir SSCCE ekledim. Birkaç seçimden sonra, sorun oluşmalıdır. Satırların üzerinde gezinirken fareyi basılı tutarak, onun oluşumunu hızlandırabilirsiniz. Bir kez meydana gelirse, her seçim sırasında ortaya çıkar.

import java.awt.BorderLayout; 
import javax.swing.JFrame; 
import javax.swing.JScrollBar; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.ListSelectionModel; 
import javax.swing.WindowConstants; 
import javax.swing.table.DefaultTableModel; 

public class TableIssueSSCCE { 

    public TableIssueSSCCE() { 
     JFrame frame = new JFrame(); 
     frame.setSize(400, 400); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.setLayout(new BorderLayout()); 

     JTable table = new JTable(new DefaultTableModel()); 
     DefaultTableModel model = (DefaultTableModel) table.getModel(); 
     model.addColumn("Test1"); 
     model.addColumn("Test2"); 
     model.addColumn("Test3"); 
     model.addColumn("Test4"); 
     for (int i = 0; i < 1000; i++) { 
      model.addRow(new String[]{ 
       "Column1" + i, "Column2" + i, "Column3" + i, "Column4" + i}); 
     } 

     table.setFillsViewportHeight(true); 
     table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     table.setCellSelectionEnabled(false); 
     table.setColumnSelectionAllowed(false); 
     table.setRowSelectionAllowed(true); 
     table.setAutoCreateRowSorter(true); 
     JScrollPane tableContainer = new JScrollPane(table); 
     tableContainer.setVerticalScrollBar(new JScrollBar(JScrollBar.VERTICAL)); 
     tableContainer.setHorizontalScrollBar(new JScrollBar(JScrollBar.HORIZONTAL)); 
     frame.add(tableContainer, BorderLayout.CENTER); 

     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     new TableIssueSSCCE(); 
    } 
} 
+1

Tablonun varsayılan davranışını değiştiren herhangi bir kodunuz var mı? Herhangi bir dinleyici, CellEditors, CellRenderers vb? Özel bir TableModel ile – f1sh

+0

'- belki TableModel yanlış? DefaultTableModel'i aynı satır/sütun seçimiyle kullanmayı deneyin ve ne olduğunu görün. Bu basit bir hata ayıklama tekniğidir. Önce kodu varsayılan sınıflarla deneyin. Ardından, özel kodunuz çalışmıyorsa, sorunun nerede olduğunu öğrenin. Yukarıdaki önerilerin aynısı. Önce varsayılan oluşturucular kullanın. Ardından sorun oluşana kadar tek bir şeyi değiştirin, böylece hangi değişikliğin soruna neden olduğunu biliyorsunuz. – camickr

+0

StackOverflow'a Hoş Geldiniz! Gönderiniz için teşekkürler! Kod hatalarıyla ilgili sorular gönderirken, lütfen kodunuzun soruyla alakalı bölümlerini belirtin. – gariepy

cevap

1

Oracle'ın JRE'sine geçerek problemden kaçınabildim. Yani bu sorun OpenJDK ile ilgili gibi görünüyor.

1

Bazı gözlemler:

  • bir Salıncak programı aralıklı yaramazlık zaman

    , bazen here gösterilen yaklaşıma başvurmadan, yanlış senkronizasyon için seyir başlar. Ayrıca bkz. Initial Threads. Böyle hatalar yeniden zor olabileceğinden, bu güvenli olmak daha iyidir: here önerildiği gibi

    public static void main(String[] args) { 
        EventQueue.invokeLater(() -> { 
         new TableIssueSSCCE(); 
        }); 
    } 
    
  • yerine setSize() arasında, getPreferredScrollableViewportSize() geçersiz kılar.