2012-03-31 9 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 (nueva CursorAtStartFocusListener())..;Seleccionar todo el texto editable JComboBox y fijar la posición del cursor

Como puede ver en el código anterior, quiero seleccionar todo el texto en JComboBox editable y establecer la posición del cursor al inicio. Pero tengo un problema si primero escribo comp.setCaretPosition (0) y luego comp.selectAll(), el texto está seleccionado pero el cursor está al final del texto, de lo contrario, si primero escribo comp.selectAll() entonces comp.setCaretPosition (0), obtengo el cursor en la posición que quiero, pero el texto no está seleccionado. ¿Tienes alguna idea de cómo puedo hacer esto?

Respuesta

5

Caret y selectAll es mejor envolver en invokeLater, pero para JTextComponent (que puede derivar que desde JComboBox también) que tiene que decidir si desea utilizar

  • seleccionar todo el texto == selectAll()

o utilizar

  • seleccione Caret (de Document)

EDITAR

1) para editable JComboBox

Runnable doRun = new Runnable() { 

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

2) o derivar JTextField o JFormattedTextField de editable JComboBox

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

a continuación, añadir FocusListener por ejemplo

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

EDIT 2:

SSCCE para editar JComboBox,

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

EDITAR 3.

truco sucio podría ser

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

Este es el código no lo hacen que me quiero, simplemente establece "0" para el contenido de JComb oBox y selecciónelo – Karen

+0

No sé lo que quiere, solo hay dos maneras posibles 'setCaret' de' Document' o use 'selectAll', en ambos casos es' FocusListener' bastante asincrónico, entonces el código debe estar en ' invokeLater' – mKorbel

+1

Quiero seleccionar todo el texto en JComboBox editable y establecer la posición del cursor al inicio. – Karen

Cuestiones relacionadas