2017-04-16 17 views
6

मेरे पास JTable है और तालिका के खाली हिस्से में क्लिक करके सभी पंक्तियों को अचयनित करने की अनुमति देना चाहते हैं। यह अब तक ठीक काम करता है। हालांकि, भले ही मैं table.clearSelection(); फोन तालिका अभी भी पता चलता पहले सक्षम सेल के चारों ओर एक सीमा (उदाहरण में सेल देखें):जेटीबल: पंक्ति चयन को साफ़ करते समय सेल के चारों ओर सीमा हटाएं

Table deselection issue

मैं भी इस सीमा से छुटकारा पाने के लिए करना चाहते हैं (यह विशेष रूप से मैक के मूल रूप और महसूस पर जगह से बाहर दिखता है, जहां कोशिकाएं अचानक काला हो जाती हैं)।

पूरी तरह से काम कर रहे कम से कम उदाहरण कोड:

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

[संपादित करें] table.getColumnModel().getSelectionModel().clearSelection(); जो यहाँ उल्लेख किया गया था जोड़ने की कोशिश की। लेकिन यह या तो मदद नहीं करता है।

उत्तर

3

table.getColumnModel() जोड़ने के लिए कोशिश की getSelectionModel() clearSelection();।।

table.clearSelection() विधि है कि विधि और TableColumnModel की clearSelection() विधि invokes।

चयन आप भी "लंगर और नेतृत्व" रीसेट चयन मॉडल की अनुक्रमित की जरूरत को मिटाने के अलावा: यदि आप तीर कुंजियों का उपयोग फोकस (0, 0 के लिए जाना जाएगा

table.clearSelection(); 

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

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

अब), तो आप क्लिक किए गए अंतिम सेल के बारे में जानकारी खो देते हैं।

यदि आप केवल चयन मॉडल को साफ़ करते हैं, तो आप पंक्ति की जानकारी खो देंगे लेकिन कॉलम जानकारी रहेगी।

एक या दोनों मॉडलों को आपके इच्छित प्रभाव प्राप्त करने के लिए समाशोधन के साथ प्रयोग।

5

आपकी समस्या: चयन तालिका खो जाने के बावजूद आपकी टेबल सेल पर अभी भी ध्यान केंद्रित किया गया है और इसलिए यह मोटा सीमा दिखाकर इसे दिखाता है। को जानना एक संभावित समाधान है जो अपना स्वयं का रेंडरर बनाना है जो सेल को फोकस करता है जब सेल चयन खो देता है। उदाहरण के लिए:

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

धन्यवाद! सरल और प्रभावी! – qqilihq

+0

@qqilihq, यह मानता है कि तालिका में सभी डेटा एक ही रेंडरर का उपयोग करता है। अधिक सामान्य समाधान के लिए, चयन को समाशोधन के अतिरिक्त, आपको चयन मॉडल के एंकर/लीड इंडेक्स को रीसेट करना होगा। फिर आपको कस्टम रेंडरर की आवश्यकता नहीं है। – camickr

+0

@camickr: इसके लिए धन्यवाद। 1+ आपके उत्तर –

संबंधित मुद्दे