2009-04-02 9 views
13

मैं प्रत्येक कॉलम के लिए एक सामग्री प्रदाता, लेबल प्रदाता, ICellModifier और TextCellEditors के साथ TableViewer का उपयोग कर रहा हूं।ग्रहण TableViewer का उपयोग करके, मैं तीर कुंजी के साथ कक्षों को नेविगेट और संपादित कैसे करूं?

जब उपयोगकर्ता सेल का चयन करता है तो मैं तीर कुंजी नेविगेशन और सेल संपादन कैसे जोड़ सकता हूं? मैं इसे जितना संभव हो उतना स्वाभाविक व्यवहार करना चाहता हूं।

ऑनलाइन के कुछ उदाहरण को देखने के बाद, वहाँ एक पुराना तरीका (एक TableCursor के साथ) और एक नए तरीके (TableCursorCellEditors साथ मिश्रण नहीं है ??) हो रहा है।

वर्तमान में, मेरे TableViewer कर्सर के बिना केवल पहले कॉलम में स्क्रॉल होगा। अंतर्निहित एसडब्ल्यूटी तालिका कर्सर को शून्य के रूप में दिखा रही है।

क्या TableViewer का CellEditors और कीबोर्ड के माध्यम से सेल नेविगेशन का उपयोग करके एक अच्छा उदाहरण है?

धन्यवाद!

उत्तर

0
+0

प्रश्न का उत्तर देने के लिए प्रतीत नहीं होता है। उदाहरण स्निपेट सूची को ऊपर और नीचे जाने के अलावा, तीर कुंजियों के माध्यम से नेविगेशन का समर्थन नहीं करता है –

3

अगर वहाँ एक अच्छा उदाहरण है मैं नहीं जानता। मैं TableViewer के शीर्ष पर काम कर रहे अपने आवेदन के लिए मूल तालिका व्यवहार होने के लिए कस्टम कोड व्यवहार करने के लिए कस्टम कोड के समूह का उपयोग करता हूं। (ध्यान दें कि हम अभी भी इस बिंदु पर 3.2.2 लक्ष्यीकरण रहे हैं, इसलिए हो सकता है चीज़ें बेहतर मिल गया है या नहीं तो बदल गया है।) कुछ मुख्य बातें:

  • मैं अपने TableViewer पर setCellEditors() है।
  • प्रत्येक CellEditor पर नियंत्रण पर, मैं स्थापित करता हूं जो मैं उचित TraverseListener मानता हूं। उदाहरण के लिए, पाठ कोशिकाओं के लिए के लिए:

    cellEditor = new TextCellEditor(table, SWT.SINGLE | getAlignment()); 
    cellEditor.getControl().addTraverseListener(new TraverseListener() { 
        public void keyTraversed(TraverseEvent e) { 
         switch (e.detail) { 
         case SWT.TRAVERSE_TAB_NEXT: 
          // edit next column 
          e.doit = true; 
          e.detail = SWT.TRAVERSE_NONE; 
          break; 
    
         case SWT.TRAVERSE_TAB_PREVIOUS: 
          // edit previous column 
          e.doit = true; 
          e.detail = SWT.TRAVERSE_NONE; 
          break; 
    
         case SWT.TRAVERSE_ARROW_NEXT: 
          // Differentiate arrow right from down (they both produce the same traversal @*$&#%^) 
          if (e.keyCode == SWT.ARROW_DOWN) { 
           // edit same column next row 
           e.doit = true; 
           e.detail = SWT.TRAVERSE_NONE; 
          } 
          break; 
    
         case SWT.TRAVERSE_ARROW_PREVIOUS: 
          // Differentiate arrow left from up (they both produce the same traversal @*$&#%^) 
          if (e.keyCode == SWT.ARROW_UP) { 
           // edit same column previous row 
           e.doit = true; 
           e.detail = SWT.TRAVERSE_NONE; 
          } 
          break; 
         } 
        } 
    }); 
    

(ड्रॉप-डाउन तालिका सेल के लिए, मैं छोड़ दिया पकड़ने और बजाय ऊपर और नीचे की दायाँ तीर।)

  • मैं भी एक TraverseListener जोड़ने TableViewer के नियंत्रण के लिए जिसका काम सेल संपादन शुरू करना है यदि कोई व्यक्ति पूरी पंक्ति के दौरान "वापसी" हिट करता है।

    // This really just gets the traverse events for the TABLE itself. If there is an active cell editor, this doesn't see anything. 
    tableViewer.getControl().addTraverseListener(new TraverseListener() { 
        public void keyTraversed(TraverseEvent e) { 
         if (e.detail == SWT.TRAVERSE_RETURN) { 
          // edit first column of selected row 
         } 
        } 
    }); 
    
  • अब, कैसे वास्तव में मैं को नियंत्रित संपादन एक और कहानी है। मेरे मामले में, मेरा पूरा TableViewer (और उसमें प्रत्येक कॉलम का प्रतिनिधित्व) एक कस्टम ऑब्जेक्ट में ढीला रूप से लपेटा गया है जिसमें उपर्युक्त टिप्पणियां करने के तरीके हैं। अंततः उन विधियों के कार्यान्वयन tableViewer.editElement() पर कॉल करना समाप्त कर देते हैं और फिर यह देखने के लिए tableViewer.isCellEditorActive() जांचते हैं कि सेल वास्तव में संपादन योग्य था (इसलिए यदि हम नहीं तो अगले संपादन योग्य व्यक्ति को छोड़ सकते हैं)।

  • मुझे प्रोग्रामेटिक रूप से "संपादन छोड़ने" में सक्षम होने के लिए भी उपयोगी पाया गया है (उदाहरण के लिए जब एक पंक्ति में अंतिम सेल से बाहर टैब्स हो)।

    private void relinquishEditing() { 
         // OMG this is the only way I could find to relinquish editing without aborting. 
         tableViewer.refresh("some element you don't have", false); 
        } 
    

: दुर्भाग्य से एक ही तरीका है मुझे लगता है कि एक भयानक चीजें हैं जो वांछित "दुष्प्रभाव" का उत्पादन के लिए स्रोत के माध्यम से spelunking के आधार पर अपने विशेष संस्करण के साथ काम करने के लिए निर्धारित हैक है क्या करने के लिए के साथ आ सकता है क्षमा करें, मैं कोड का एक और पूरा हिस्सा नहीं दे सकता, लेकिन वास्तव में, मुझे सामान की एक पूरी मिनी-प्रोजेक्ट जारी करना होगा, और मैं अब ऐसा करने के लिए तैयार नहीं हूं। उम्मीद है कि यह आपको जाने के लिए "जंपस्टार्ट" पर्याप्त है।

0

मैं इसे इस JFace Snippet के आधार पर काम कर रहा है, लेकिन मैं यह भी संबंधित वर्गों के एक जोड़े को कॉपी करने के लिए किया था:

  • org.eclipse.jface.snippets.viewers.TableCursor
  • org.eclipse.jface
  • org.eclipse.jface.snippets.viewers.AbstractCellCursor

और मैं बिल्कुल याद नहीं है जहां मैं उन्हें मिल गया .snippets.viewers.CursorCellHighlighter। यह एक org.eclipse.swt.custom.TableCursor भी है, लेकिन मैं इसे काम करने के लिए नहीं मिल सका। एक ColumnViewerEditorActivationStrategy और TableViewerEditor जोड़ने -

0

लाइनों के बीच Example of enabling Editor Activation on a Double Click.

सामान पर एक नज़र [128 110] है। मेरे मामले में, मैं एक क्लिक को संपादन शुरू करना चाहता था, इसलिए मैंने लाइन 115 को बदल दिया: कॉलम व्यूअर एडिटर एक्टिवेशन इवेंट। MOUSE_DOUBLE_CLICK_SELECTION ColumnViewerEditorActivationEvent.MOUSE_CLICK_SELECTION में। इसे मेरे टेबल व्यूअर में जोड़ने के बाद, टैब कुंजी संपादक से सक्षम फ़ील्ड से फ़ील्ड पर जायेगी।

2

यहाँ क्या मेरे लिए काम किया है:

TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(tableViewer,new FocusCellOwnerDrawHighlighter(tableViewer)); 
ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(tableViewer) { 
    protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) { 
     return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL 
      || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION         
      || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR) 
      || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC; 
     } 
}; 

संपादन करते समय मैं टैब के साथ सभी दिशाओं में नेविगेट कर सकते हैं, और संपादन मोड में नहीं आसपास जब तीर।

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

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