在JFRAME中创建一个基数转换器

时间:2013-10-06 12:17:02

标签: java swing jframe converter

所以我有一个JFrame文件,其中包含3个文本框,一个“转换!”和一个“清除”按钮。 3个文本框用于输入十六进制数 - 十进制 - 二进制数。您可以输入与该特定数字基数相关的任何字段,并将该数字基数转换为其他2个数字基数。

我的问题是:如何检测我应该转换的数字基数?例如,如果有人进行了转换,并且想要再次转换,并且他为任何数字基数输入另一个值,以便其中2个值在数字基数中是等价的,而其中一个不是,那么程序就会陷入困境,因为它不会不知道要转换哪一个。我该如何解决这个问题。如果有人正在进行第一次转换,我将如何检测教科书中是否有文字。对不起,我是jframes的新手,我几乎不知道语法。

2 个答案:

答案 0 :(得分:1)

您可以为每个DocumentFilter添加JTextField来执行转换:

DocumentFilter hexFilter = new DocumentFilter(){

    @Override
    public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
        super.replace(fb, offset, length, text, attrs);
        String hexInput = hexTextField.getText();
        //process hex input
    }
};
((AbstractDocument) hexTextField.getDocument()).setDocumentFilter(hexFilter);

每次用户在文本字段中插入文本时,都会调用replace方法。

您只需从文本字段中获取输入并进行处理。

  

我遇到了这个问题,因为有3个文本字段,我不知道如何“检测”用户输入的文本框。

您可以为每个文本字段添加不同的DocumentFilter,这样您就可以随时了解用户正在写入的文本字段。

类似的东西:

((AbstractDocument) hexTextField.getDocument()).setDocumentFilter(hexFilter);
((AbstractDocument) octTextField.getDocument()).setDocumentFilter(octFilter);
((AbstractDocument) binTextField.getDocument()).setDocumentFilter(binFilter);

这样你就会知道binFilter处理二进制输入,octFilter处理八进制输入,hexFilter处理十六进制输入。


另一种选择是使用KeyListener,但AFAIK在文本字段中粘贴一些文字时不会做出反应。

答案 1 :(得分:0)

您可以在每个文本字段上放置一个监听器,并根据用户更改的字段更改其他文本字段。

我担心我不完全确定在文本字段发生变化后接收事件时必须添加哪个侦听器(InputMethodListener似乎没有触发任何内容而KeyListener在文本更改之前触发)所以在此示例中我将使用ActionListener,这意味着用户在输入数字后必须按“输入”。

final JTextField hex = new JTextField("hex");
final JTextField dec = new JTextField("dec");
ActionListener act = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == hex) {
            dec.setText(Integer.toString(Integer.parseInt(hex.getText(), 16)));
        } else if(e.getSource() == dec) {
            hex.setText(Integer.toHexString(Integer.parseInt(dec.getText())));
        }
    }
};
hex.addActionListener(act);
dec.addActionListener(act);

编辑:这意味着您不需要“转换!”但是,如果您真的想要那个,那么您需要跟踪上次编辑的文本字段。 你可以这样做:

JTextField lastEdited;
private void init() {
    //other init stuff
    final JTextField hex = new JTextField("hex");
    final JTextField dec = new JTextField("dec");
    KeyListener keyListener = new KeyAdapter() {
        @Override
        public void keyTyped(KeyEvent e) {
            lastEdited = (JTextField) e.getSource();
        }
    };
    hex.addKeyListener(keyListener);
    dec.addKeyListener(keyListener);
    JButton convert = new JButton("Convert!");
    convert.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if(lastEdited == hex) {
                dec.setText(Integer.toString(Integer.parseInt(hex.getText(), 16)));
            } else if(lastEdited == dec) {
                hex.setText(Integer.toHexString(Integer.parseInt(dec.getText())));
            }
        }
    });
    //other init stuff
}