2012-03-31 10 views
5
public class CursorAtStartFocusListener extends FocusAdapter { 

@Override 
public void focusGained(java.awt.event.FocusEvent evt) { 
    Object source = evt.getSource(); 
    if (source instanceof JTextComponent) { 
     JTextComponent comp = (JTextComponent) source; 
     comp.setCaretPosition(0); 
     comp.selectAll(); 
    } 
} } 

jComboBox.getEditor() getEditorComponent() addFocusListener (नई CursorAtStartFocusListener())।।संपादन योग्य JComboBox में सभी पाठ और सेट कर्सर की स्थिति का चयन करें

जैसा कि आप ऊपर दिए गए कोड से देखते हैं, मैं संपादन योग्य JComboBox में सभी टेक्स्ट चुनना चाहता हूं और शुरुआत में कर्सर की स्थिति सेट करना चाहता हूं। लेकिन मुझे पहली बार comp.setCaretPosition (0) लिखने में समस्या है, तो comp.selectAll(), पाठ का चयन किया गया है लेकिन कर्सर पाठ के अंत में है, अन्यथा अगर मैं पहले comp.selectAll() लिखता हूं तो comp.setCaretPosition (0), मुझे उस स्थिति में कर्सर मिलता है जो मैं चाहता हूं लेकिन पाठ का चयन नहीं किया गया है। कोई विचार है कि मैं यह कैसे कर सकता हूं?

उत्तर

5

Caret और selectAllinvokeLater में लपेटकर के लिए बेहतर है, लेकिन JTextComponent के लिए (आप कि JComboBox भी से निकाले जाते हैं कर सकते हैं) आप आप उपयोग करना

  • सभी पाठ == selectAll()
चयन करना चाहते हैं तय करने के लिए है

या का उपयोग

  • चयन Caret (Document से)

संपादित

1) संपादन योग्य JComboBox

Runnable doRun = new Runnable() { 

    @Override 
    public void run() { 
     myComboBox.getEditor().setItem(0); 
     myComboBox.getEditor().selectAll(); 
     myComboBox.requestFocus(); 
    } 
}; 
SwingUtilities.invokeLater(doRun); 

2 के लिए) या से संपादन योग्य JComboBox

((JTextField) myComboBox.getEditor().getEditorComponent()) 

JTextField या JFormattedTextField निकाले जाते हैं तो जोड़ने FocusListener उदा

private FocusListener focsListener = new FocusListener() { 

     @Override 
     public void focusGained(FocusEvent e) { 
      dumpInfo(e); 
     } 

     @Override 
     public void focusLost(FocusEvent e) { 
      //dumpInfo(e); 
     } 

     private void dumpInfo(FocusEvent e) { 
      //System.out.println("Source : " + name(e.getComponent())); 
      //System.out.println("Opposite : " + name(e.getOppositeComponent())); 
      //System.out.println("Temporary: " + e.isTemporary()); 
      final Component c = e.getComponent(); 
      if (c instanceof JFormattedTextField) { 
       EventQueue.invokeLater(new Runnable() { 

        public void run() { 
         ((JFormattedTextField) c).requestFocus(); 
         ((JFormattedTextField) c).setText(((JFormattedTextField) c).getText()); 
         ((JFormattedTextField) c).selectAll(); 
        } 
       }); 
      } else if (c instanceof JTextField) { 
       EventQueue.invokeLater(new Runnable() { 

        public void run() { 
         ((JTextField) c).requestFocus(); 
         ((JTextField) c).setText(((JTextField) c).getText()); 
         ((JTextField) c).selectAll(); 
        } 
       }); 
      } 
     } 

     private String name(Component c) { 
      return (c == null) ? null : c.getName(); 
     } 
    }; 

संपादित करें 2:

संपादन योग्य JComboBox के लिए SSCCE,

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import javax.swing.*; 

public class ComboRendererTest { 

    public ComboRendererTest() { 
     JComboBox comboBox = new JComboBox(); 
     comboBox.setPrototypeDisplayValue("XXXXXXXXXXXXXXXX"); 
     comboBox.addItem(new Double(1)); 
     comboBox.addItem(new Double(2.25)); 
     comboBox.addItem(new Double(3.5)); 
     comboBox.setRenderer(new TwoDecimalRenderer(comboBox.getRenderer())); 
     comboBox.setEditable(true); 

     JComboBox comboBox1 = new JComboBox(); 
     comboBox1.setPrototypeDisplayValue("XXXXXXXXXXXXXXXX"); 
     comboBox1.addItem(new Double(1)); 
     comboBox1.addItem(new Double(2.25)); 
     comboBox1.addItem(new Double(3.5)); 
     comboBox1.setRenderer(new TwoDecimalRenderer(comboBox.getRenderer())); 
     comboBox1.setEditable(true); 

     JFrame frame = new JFrame(); 
     frame.add(comboBox, BorderLayout.NORTH); 
     frame.add(comboBox1, BorderLayout.SOUTH); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) throws Exception { 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     SwingUtilities.invokeLater(new Runnable() { 

      public void run() { 
       ComboRendererTest comboRendererTest = new ComboRendererTest(); 
      } 
     }); 
    } 
} 

class TwoDecimalRenderer extends DefaultListCellRenderer { 

    private ListCellRenderer defaultRenderer; 

    public TwoDecimalRenderer(ListCellRenderer defaultRenderer) { 
     this.defaultRenderer = defaultRenderer; 
    } 

    @Override 
    public Component getListCellRendererComponent(JList list, Object value, 
      int index, boolean isSelected, boolean cellHasFocus) { 
     Component c = defaultRenderer.getListCellRendererComponent(
       list, value, index, isSelected, cellHasFocus); 
     if (c instanceof JLabel) { 
      c.setBackground(Color.red); 
     } else { 
      c.setBackground(Color.red); 
      c = super.getListCellRendererComponent(
        list, value, index, isSelected, cellHasFocus); 
     } 
     return c; 
    } 
} 

संपादित करें 3.

गंदा हैक हो सकता है

JTextComponent editor = ((JTextField) myComboBox.getEditor().getEditorComponent()); 
editor.setCaretPosition(getLength()); 
editor.moveCaretPosition(0); 
+0

इस कोड है कि मैं ऐसा नहीं कर रहा है चाहते हैं, यह सिर्फ जेकॉम्ब की सामग्री के लिए "0" सेट करें ओबॉक्स और इसे चुनें – Karen

+0

मुझे नहीं पता कि आप क्या चाहते हैं, 'दस्तावेज़' से 'सेट कैरेट' केवल दो संभावित तरीके हैं या 'selectAll' का उपयोग करें, दोनों मामलों में' फोकस लिस्टर 'सुंदर असीमित है, फिर कोड को' invokeLater' – mKorbel

+1

मैं संपादन योग्य JComboBox में सभी टेक्स्ट चुनना चाहता हूं और शुरुआत में कर्सर की स्थिति सेट करना चाहता हूं। – Karen

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