2012-03-31 43 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 (mới CursorAtStartFocusListener())..;Chọn tất cả văn bản trong chỉnh sửa JComboBox và thiết lập vị trí con trỏ

Như bạn thấy từ mã ở trên, tôi muốn chọn tất cả văn bản trong JComboBox có thể chỉnh sửa và đặt vị trí con trỏ ở đầu. Nhưng tôi có vấn đề nếu lần đầu tiên tôi viết comp.setCaretPosition (0) rồi comp.selectAll(), văn bản được chọn nhưng con trỏ nằm ở cuối văn bản, nếu không thì trước tiên tôi viết comp.selectAll() rồi comp.setCaretPosition (0), tôi nhận con trỏ ở vị trí mà tôi muốn nhưng văn bản không được chọn. Có ý tưởng nào về cách tôi có thể làm điều này?

Trả lời

5

CaretselectAll là tốt hơn để quấn vào invokeLater, nhưng đối với JTextComponent (bạn có thể lấy được rằng từ JComboBox quá), bạn phải quyết định nếu bạn muốn sử dụng

  • chọn tất cả văn bản == selectAll()

hoặc sử dụng

  • chọn Caret (từ Document)

EDIT

1) cho chỉnh sửa JComboBox

Runnable doRun = new Runnable() { 

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

2) hoặc lấy JTextField hoặc JFormattedTextField từ có thể chỉnh sửa JComboBox

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

sau đó thêm FocusListener ví dụ

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 cho chỉnh sửa 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; 
    } 
} 

EDIT 3.

bẩn hack có thể được

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

này được mã không làm điều đó tôi muốn, nó chỉ đặt "0" cho nội dung của JComb oBox và chọn nó – Karen

+0

Tôi không biết bạn muốn gì, chỉ có hai cách có thể 'setCaret' từ' Document' hoặc sử dụng 'selectAll', trong cả hai trường hợp là' FocusListener' khá không đồng bộ thì mã phải được gói vào ' invokeLater' – mKorbel

+1

Tôi muốn chọn tất cả văn bản trong JComboBox có thể chỉnh sửa và đặt vị trí con trỏ để bắt đầu. – Karen

Các vấn đề liên quan