2011-11-17 23 views
10

जब आप टाइपिंग शुरू करते हैं, तो क्लिक करने पर क्लिक किए गए स्थान पर कैरेट रखने के लिए जेटीबल का डिफ़ॉल्ट व्यवहार सामग्री को जोड़ना होता है। मैं इन दोनों चीजों का व्यवहार बदलना चाहता हूं, इसलिए जब मैं एक सेल संपादित करता हूं, या तो टाइप करके या क्लिक करके और फिर टाइप करके सामग्री को प्रतिस्थापित किया जाता है। जब मैं एक सेल पर क्लिक करता हूं और फिर कैरेट स्थिति बदलता हूं, हालांकि, मैं सामग्री को रहना चाहता हूं ताकि मैं इसे बदल सकूं।संपादित करते समय JTable सेल में सभी टेक्स्ट का चयन कैसे करें, लेकिन टाइप करते समय नहीं?

मुझे पता है कि जब सेल संपादित हो रहा है, तो सेल संपादक को बदलकर, सभी को चुनने के लिए, एक स्विंगउटिविटीज.inवोकलेटर के अंदर सभी का चयन करें (elsewhere देखें), लेकिन यह टाइपिंग व्यवहार को तोड़ने का कारण बनता है। जब मैं ऐसा करता हूं और सेल में टाइप करना शुरू करता हूं, तो पहले टाइप किए गए वर्ण को स्ट्रिंग में जोड़ दिया जाता है, फिर यह चुना जाता है (लेकिन चयन अदृश्य है!) और जब कोई अन्य अक्षर टाइप करते हैं तो सामग्री उस स्थान से बदल जाती है।

क्या हाइलाइट किए गए (लेकिन संपादन नहीं) सेल में टाइप करते समय तुरंत सामग्री को प्रतिस्थापित करने का कोई तरीका है, लेकिन सेल पर क्लिक करते समय सभी का चयन करें?

if (isSelected) { 
    this.selectAll(); 
} 

एक के रूप में एक तरफ, क्यों विस्तार नहीं AbstractCellEditor या DefaultCellEditor(JTextField textField):

public class TextFieldCellEditor extends JTextField implements TableCellEditor 
{ 
    private CellEditorListener cellEditorListener = null; 

    private boolean    isInteger   = false; 
    private Object    oldValue; 

    // Start editing 
    @Override 
    public Component getTableCellEditorComponent(JTable table, Object obj, boolean isSelected, int row, int column) 
    { 
     Color color2 = DefaultLookup.getColor(this, ui, "Table.alternateRowColor"); 
     super.setBackground(color2 != null && (row & 1) == 1? color2 : table.getBackground()); 
     super.setForeground(table.getForeground()); 
     super.setBorder(DefaultLookup.getBorder(this, ui, "Table.focusCellHighlightBorder")); 

     super.setText(obj.toString()); 

     isInteger = obj instanceof Integer; 
     if (isInteger) 
     { 
      super.setHorizontalAlignment(SwingConstants.RIGHT); 
      oldValue = obj; 
     } 

     // SwingUtilities.invokeLater(new Runnable() 
     // { 
     // public void run() 
     // { 
     // TextFieldCellEditor.this.selectAll(); 
     // } 
     // }); 

     return this; 
    } 

    // Retrieve e dited value 
    @Override 
    public Object getCellEditorValue() 
    { 
     if (isInteger) 
     { 
      // Try to convert to integer. If input is invalid, revert. 
      try 
      { 
       return new Integer(super.getText()); 
      } 
      catch (NumberFormatException e) 
      { 
       return oldValue; 
      } 
     } 
     return super.getText(); 
    } 

    @Override 
    public boolean isCellEditable(EventObject e) 
    { 
     return true; 
    } 

    @Override 
    public boolean shouldSelectCell(EventObject e) 
    { 
     return true; 
    } 

    @Override 
    public boolean stopCellEditing() 
    { 
     cellEditorListener.editingStopped(new ChangeEvent(this)); 
     return true; 
    } 

    @Override 
    public void cancelCellEditing() 
    { 
     cellEditorListener.editingCanceled(new ChangeEvent(this)); 
    } 

    @Override 
    public void addCellEditorListener(CellEditorListener celleditorlistener) 
    { 
     cellEditorListener = celleditorlistener; 
    } 

    @Override 
    public void removeCellEditorListener(CellEditorListener celleditorlistener) 
    { 
     if (cellEditorListener == cellEditorListener) cellEditorListener = null; 
    } 
} 
+0

यह कार्यान्वयन अमान्य है: ए) एक से अधिक श्रोता जोड़ने का समर्थन नहीं करता है b) _internal_ कारणों (जैसे एंटरप्राइज़ करने की तरह) के लिए बंद/रद्द होने पर अपने श्रोता को सूचित नहीं करता है, क्या आवश्यक है इसका विचार प्राप्त करने के लिए DefaultCellEditor का स्रोत देखें – kleopatra

+0

से अधिक ks। ठीक कर दिया। –

उत्तर

2

अपने getTableCellEditorComponent() कार्यान्वयन में, निम्नलिखित जोड़ें:

यहाँ कोड मैं CellEditor के लिए उपयोग है? How to Use Tables: Using Other Editors भी देखें।

परिशिष्ट: Table Select All Renderer और Table Select All Editor भी देखें।

+0

धन्यवाद। मैंने सोचा था कि चुना गया हमेशा सत्य होगा क्योंकि मैं सेल पर नेविगेट किया था, या तो कीबोर्ड या माउस के साथ, इसलिए मैंने इसे अनदेखा कर दिया। –

+0

मैंने अतीत में सारेलेल एडिटर को विस्तारित करने के साथ प्रयोग किया लेकिन अंततः इस पर बस गया। डुनो अब और क्यों। –

+0

मैंने श्रोताओं की वजह से इसे फिर से बदल दिया (ऊपर टिप्पणी देखें) और यह कि 'ui'' JTextField' के अंदर सुरक्षित है, इसलिए मैंने इसे इस तरह से किया है। नरक, मुझे यह भी पता नहीं है कि मैंने 'यूआईएमएनेजर' के बजाय हतोत्साहित वर्ग 'डिफॉल्ट लुकअप' का उपयोग क्यों किया (संभवतः इंटर्ननेट से कुछ नोब कोड कॉपी किया) –

0

साफ समाधान मैं इस मामले के लिए मिल सकता है JTable के editCellAt के ऊपर लिख और कैसे संपादित ट्रिगर किया गया था के CellEditor सूचित करने के लिए किया गया था:

@Override 
public boolean editCellAt(int row, int column, EventObject e) { 
    cellEditor.setKeyTriggered(e instanceof KeyEvent); 
    return super.editCellAt(row, column, e); 
} 

और यहाँ प्रासंगिक CellEditor कोड है:

public class MyCellEditor extends DefaultCellEditor { 

    private boolean keyTriggered; 

    public MyCellEditor() { 
     super(new JTextField()); 
     final JTextField textField = (JTextField) getComponent(); 
     textField.addFocusListener(new FocusAdapter() { 
      @Override 
      public void focusGained(FocusEvent e) { 
       SwingUtilities.invokeLater(new Runnable() { 
        @Override 
        public void run() { 
         if (!keyTriggered) { 
          textField.selectAll(); 
         } 
        } 
       }); 
      } 
     }); 
    } 

    public void setKeyTriggered(boolean keyTriggered) { 
     this.keyTriggered = keyTriggered; 
    } 

    @Override 
    public Component getTableCellEditorComponent(
      JTable table, Object value, boolean isSelected, int row, int column) { 
     final JTextField textField = (JTextField) 
       super.getTableCellEditorComponent(table, value, isSelected, row, column); 
     textField.selectAll(); 
     return textField; 
    } 
} 
संबंधित मुद्दे