0

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

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

4

2 回答 2

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处理十六进制输入。


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

于 2013-10-06T12:40:25.017 回答
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
}
于 2013-10-06T12:40:37.253 回答