2012-03-31 17 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

CaretselectAll使用したい場合は

  • は、すべてのテキスト== selectAll()
を選択 invokeLaterにラップに優れているが、 JTextComponent(あなたがその JComboBoxからあまりにも導き出すことができます)のためにあなたが決定しなければなりません

または

  • を選択し使用編集可能JComboBox

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

    2)

EDIT

1(Documentから))または追加を次に編集可能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(); 
     } 
    }; 

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

EDIT 3

汚いハックは

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

は、このコードがそのIを行うされていない可能性がありJCombの内容に "0"を設定するだけですoBoxを選択してそれを選択する – Karen

+0

何が必要なのかわからない、 'Document'から' setCaret'を使う方法や 'selectAll'を使う方法が2つあります。どちらの場合も' FocusListener'はかなり非同期で、 invokeLater' – mKorbel

+1

編集可能なJComboBox内のすべてのテキストを選択し、カーソル位置を開始位置に設定します。 – Karen

関連する問題