选择可编辑JComboBox中的所有文本并设置光标位置 [英] Select all text in editable JComboBox and set cursor position

查看:193
本文介绍了选择可编辑JComboBox中的所有文本并设置光标位置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


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(new
CursorAtStartFocusListener());

jComboBox.getEditor().getEditorComponent().addFocusListener(new CursorAtStartFocusListener());

正如你从上面的代码中看到的,我想选择所有可编辑的文本JComboBox并将光标位置设置为开始。
但是我有问题,如果我先写comp.setCaretPosition(0)然后comp.selectAll(),文本被选中,但光标在文本结束,否则如果我先写comp.selectAll()然后comp .setCaretPosition(0),我得到光标在我想要的位置,但文本没有选择。
有任何想法我该如何做这件事?

As you see from code above I want to select all text in editable JComboBox and set cursor position to the start. But I have problem if I first write comp.setCaretPosition(0) then comp.selectAll(), the text is selected but cursor is on the end of text, otherwise if I first write comp.selectAll() then comp.setCaretPosition(0), I get cursor in position that I want but text isn't selected. Have any idea how can I do this thing?

推荐答案

$ c>和 selectAll 最好包装到 invokeLater ,但 JTextComponent (你可以从 JComboBox 派生)你必须决定是否要使用

Caret and selectAll is better to wrapping into invokeLater, but for JTextComponent (you can derive that from JComboBox too) you have to decide if you want to use


  • 选择所有文本== selectAll()

  • select all text == selectAll()

或使用


  • 选择 Caret (来自 / code>)

  • select Caret (from Document)

EDIT

1) JComboBox

Runnable doRun = new Runnable() {

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

2)或派生 JTextField c $ c> JFormattedTextField 来自可编辑的 JComboBox

2) or derive JTextField or JFormattedTextField from editable JComboBox

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

/ p>

then add FocusListener e.g.

    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:

SSCCE JComboBox,

SSCCE for editable 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;
    }
}

编辑3。

dirty hack可以

dirty hack could be

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

这篇关于选择可编辑JComboBox中的所有文本并设置光标位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆