【问题标题】:Adding $ sign into the textfield when the user enter in the field当用户在字段中输入时,将 $ 符号添加到文本字段中
【发布时间】:2014-02-01 08:31:24
【问题描述】:

任何人都知道如何在用户输入字段时自动将 $ 符号添加到文本字段中,并禁止用户取消 $ 符号。

【问题讨论】:

  • 什么,所以你不接受英镑、欧元、迪拉姆、谢克尔……?你是多么的排斥!我想我会把辛苦赚来的迪拉姆花在其他地方..
  • @AndrewThompson 别忘了印度卢比
  • @LittleChild 哦,当然不是……我才刚刚开始! ;)
  • @AndrewThompson 看看我的回答

标签: java swing textfield


【解决方案1】:

不是“严格地”你要问什么,而是以How to use for attend text fields 为例...

paymentField = new JFormattedTextField(NumberFormat.getCurrencyInstance());
paymentField.setValue(new Double(payment));
paymentField.setColumns(10);
paymentField.setEditable(false);

这样做的问题是用户可以删除$ 符号并且验证非常严格,这意味着输入到字段中的文本必须以$ 开头

另一种可能性是使用来自 Swing Labs、SwingX 库的 BuddySupport API

NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMinimumFractionDigits(2);
paymentField = new JFormattedTextField(nf);
paymentField.setValue(100d);
paymentField.setColumns(10);
paymentField.setEditable(false);
BuddySupport.addLeft(new JLabel("$"), paymentField);

这意味着$是一个独立于实际字段的组件,用户不能删除(但包含在字段中,因此不受父容器的布局管理器的影响)

【讨论】:

  • 有一个JFormattedTextField 吗?哇 ! xD
  • @LittleChild 问题在于,它不会严格满足 OP 的要求,因为用户可以删除 $ 符号......但是,NumberFormat 将考虑使用的符号语言环境;)
【解决方案2】:

可以通过添加一个来监视 java.awt.TextField 的更改 TextEvent 的 TextListener。在基于 JTextComponent 的组件中, 更改通过 DocumentEvent 从模型广播到 文档监听器。 DocumentEvent 给出了更改的位置 以及需要的更改类型。

您需要使用DocumentListener 并将其与一些Regex 结合使用才能发挥作用。如果给定点的文本与您想要的格式不匹配,请不要更新JTextField 或仅使用.charAt() 方法就可以了,但这取决于您

SSCCE 没有 DocumentListener

package stack;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class OhMyDollar {

    static JFrame frame;
    static JTextField field;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run(){
                frame = new JFrame("Useless Title");
                field = new JTextField("$", 30);
                frame.getContentPane().add(field);
                frame.pack();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);

                field.addKeyListener(new KeyListener(){

                    @Override
                    public void keyPressed(KeyEvent event) {

                    }

                    @Override
                    public void keyReleased(KeyEvent event) {

                    }

                    @Override
                    public void keyTyped(KeyEvent event) {
                        StringBuffer text = new StringBuffer(field.getText());
                        StringBuffer dollar = new StringBuffer("$");
                        if(field.getText().isEmpty() || text.charAt(0)!='$'){
                            field.setText(dollar.append(text).toString());
                        }
                    }
                });
            }
        });
    }
}

【讨论】:

  • KeyListener?更好的解决方案是亲自去DocumentFilter...
  • @MadProgrammer 查找DocumentFilter。不能怪男人用KeyListener 尝试它!我知道它不会考虑剪切复制粘贴 xD
  • MDP's Blog 示例,Text Component Features 了解详情 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
相关资源
最近更新 更多