java - 取消选择 JTextfield 上的默认选择

标签 java swing jtextfield caret getcaretpos

使用 JTextFields 时,我喜欢设置默认文本。

然后我运行程序,这个默认文本将自动被选中(至少当你只有一个字段时)。换句话说,如果我立即输入一个字母,默认文本将被删除并替换为新文本。

我的问题是如何更改默认设置以允许我在不删除默认文本的情况下键入字母?我希望将字母添加到默认文本的末尾。

这是我的代码:

    public class ButtonsNText extends JPanel implements ActionListener, KeyListener {

private JTextField TextLine;
private JToggleButton UpperCaseButton;
private JToggleButton LowerCaseButton;
private JCheckBox ContinuousButton;
private ButtonGroup myButtonGroup;

public ButtonsNText(){
    TextLine = new JTextField(10);
    add(TextLine); TextLine.setName("TextLine");
    TextLine.setText("default text"); 
    TextLine.setCaretPosition(TextLine.getText().length());
    TextLine.addKeyListener(this);
    myButtonGroup = new ButtonGroup();
    UpperCaseButton = new JToggleButton("Upper case");
    add(UpperCaseButton);UpperCaseButton.setName("UpperCaseButton");
    LowerCaseButton = new JToggleButton("Lower case");
    add(LowerCaseButton); LowerCaseButton.setName("LowerCaseButton");
    ContinuousButton = new JCheckBox("Continuous?");
    add(ContinuousButton); ContinuousButton.setName("ContinuousButton");
    myButtonGroup.add(UpperCaseButton); myButtonGroup.add(LowerCaseButton);
    UpperCaseButton.addActionListener(this);
    LowerCaseButton.addActionListener(this);
    ContinuousButton.addActionListener(this);

}
public static void main(String[] args) {
    JFrame frame = new JFrame("Hello world example");
    frame.add(new ButtonsNText());
    frame.pack();
    frame.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
    if(e.getSource() == UpperCaseButton){
        TextLine.setText(TextLine.getText().toUpperCase());
    }
    else if(e.getSource() == LowerCaseButton){
        TextLine.setText(TextLine.getText().toLowerCase());
    }
}
@Override
public void keyReleased(KeyEvent k) {
    if(ContinuousButton.isSelected()){
        if(UpperCaseButton.isSelected()){
            int pos = TextLine.getCaretPosition();
            TextLine.setText(TextLine.getText().toUpperCase());
            TextLine.setCaretPosition(pos);
        }
        else if(LowerCaseButton.isSelected()){
            int pos = TextLine.getCaretPosition();
            TextLine.setText(TextLine.getText().toLowerCase());
            TextLine.setCaretPosition(pos);

        }
    }
    int key = k.getKeyCode();
    if(key == KeyEvent.VK_ENTER){
        if(UpperCaseButton.isSelected()){
            TextLine.setText(TextLine.getText().toUpperCase());
        }
        else if(LowerCaseButton.isSelected()){
            TextLine.setText(TextLine.getText().toLowerCase());
        }
    }
}

我已经尝试过 isFocusable()、setFocusable()、setCaterPosition() 和其他类似的方法,但在这里我认为我需要一种不同的方法。

最佳答案

只需为获得的焦点添加一个 FocusListener,它将与 tfield2.setCaretPosition(tfield2.getDocument().getLength()); 一起为您完成 在这里查看代码以获取帮助:

import java.awt.event.*;

import javax.swing.*;

public class TextFieldExample extends JFrame
{
    public TextFieldExample()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        JPanel contentPane = new JPanel();
        JTextField tfield = new JTextField(10);
        final JTextField tfield2 = new JTextField(10);
        tfield2.setText("default text");
        tfield2.addFocusListener(new FocusListener()
        {
            public void focusGained(FocusEvent fe)
            {
                tfield2.setCaretPosition(tfield2.getDocument().getLength());
            }

            public void focusLost(FocusEvent fe)
            {
            }
        });

        contentPane.add(tfield);
        contentPane.add(tfield2);

        setContentPane(contentPane);

        pack();
        setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new TextFieldExample();
            }
        });
    }
}

关于java - 取消选择 JTextfield 上的默认选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9213670/

相关文章:

java GUI简单登录后端mysql

java - Swing 中 JTextField 消失的问题

java - 将代码从 Java 转换为 Android Studio(显示值)

java - 如何将带有 ArrayList 的 bundle 从 Fragment 传递到 Activity

java - 无法在 GridLayout/FlowLayout 中正确设置 BoxLayout(JPanel)

java - 使 Swing 组件垂直对齐

java - 如何将 JTextField 中的内容保存到文件中

java - 使用基于java的注释的Spring自动线bean

java - 流式传输不同的数据类型

java - 从文件中读取并在 textarea java 中显示