2017-04-16 14 views
6

JTable var ve tablonun boş bir bölümüne tıklayarak tüm satırların seçiminin kaldırılmasına izin vermek istiyorum. Bu çok iyi çalışıyor.JTable: Satır sırasını temizlerken hücre çevresindeki kenarlığı kaldırın

Table deselection issue

Ben de bu sınırın kurtulmak istiyorum (: Ancak, ben table.clearSelection(); çağrı rağmen tablo hala daha önceden etkinleştirilmiş hücrenin etrafında bir sınır (örneğin hücreyi bakınız) gösterir Özellikle Mac'in doğal görünüm ve hislerinde, hücrelerin aniden siyahlaştığı yer dışında görünüyor.

Tam çalışan asgari örnek kod:

public class JTableDeselect extends JFrame { 
    public JTableDeselect() { 
     Object rowData[][] = { { "1", "2", "3" }, { "4", "5", "6" } }; 
     Object columnNames[] = { "One", "Two", "Three" }; 
     JTable table = new JTable(rowData, columnNames); 
     table.setFillsViewportHeight(true); 
     table.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       if (table.rowAtPoint(e.getPoint()) == -1) { 
        table.clearSelection(); 
       } 
      } 
     }); 
     add(new JScrollPane(table)); 
     setSize(300, 150); 
    } 
    public static void main(String args[]) throws Exception { 
     UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); 
     new JTableDeselect().setVisible(true); 
    } 
} 

[değiştir] buralarda bahsedildi table.getColumnModel().getSelectionModel().clearSelection(); eklemek için çalıştı. Ama bu da işe yaramıyor.

cevap

3

table.getColumnModel() eklemek için denenmiş getSelectionModel() clearSelection();..

table.clearSelection() yöntem yöntem ve TableColumnModel arasında clearSelection() yöntemi çağırır. Eğer ok tuşlarını kullanırsanız odak (0, 0 gidecek Şimdi

table.clearSelection(); 

ListSelectionModel selectionModel = table.getSelectionModel(); 
selectionModel.setAnchorSelectionIndex(-1); 
selectionModel.setLeadSelectionIndex(-1); 

TableColumnModel columnModel = table.getColumnModel(); 
columnModel.getSelectionModel().setAnchorSelectionIndex(-1); 
columnModel.getSelectionModel().setLeadSelectionIndex(-1); 

: Ayrıca "çapa ve kurşun" reset seçim modelinin endeksleri gerek seçimleri temizleyin ek olarak

), böylece tıklanan son hücre hakkındaki bilgileri kaybedersiniz.

Sadece seçim modelini temizlerseniz, satır bilgilerini kaybedersiniz, ancak sütun bilgileri kalır.

İstediğiniz efekti elde etmek için modellerden birini veya her ikisini temizlemeyi deneyin.

5

Sorununuz: Tablo hücreniz, seçim kaybolana rağmen netleme yapmaya devam ediyor ve bu nedenle kalınlaştırılmış bir kenarlık göstererek kendini gösteriyor. 'u bilmek olası bir çözüm, hücre seçimi kaybettiğinde hücrenin odağını kaldıran kendi oluşturucunuzu oluşturmaktır. Örneğin:

table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() { 
    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, 
      boolean isSelected, boolean hasFocus, int row, int column) { 
     if (!isSelected) { 
      hasFocus = false; 
     } 
     return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
    } 
}); 
+0

Teşekkürler! Basit ve etkili! – qqilihq

+0

@qqilihq, bu tablodaki tüm verilerin aynı oluşturucuyu kullandığını varsayar. Daha genel bir çözüm için, seçimi temizlemenin yanı sıra, seçim modelinin çapa/kurşun indekslerini de sıfırlamanız gerekir. O zaman özel bir oluşturucuya ihtiyacınız yoktur. – camickr

+0

@camickr: Bunun için teşekkürler. Cevabınız 1+ + –