Java 在JFRAME中制作数字基转换器

Java 在JFRAME中制作数字基转换器,java,swing,jframe,converter,Java,Swing,Jframe,Converter,所以我有一个JFrame文件,它包含3个文本框、一个“转换”和一个“清除”按钮。这三个文本框用于输入十六进制--十进制--二进制的数字。您可以输入与该特定基数相关的任何字段,它会将该基数转换为其他两个基数 我的问题是:我如何检测我应该从哪个基数转换?例如,如果有人进行转换,并希望再次转换,他为任何基数输入另一个值,以便其中两个值在基数中相等,而另一个不相等,则程序将陷入混乱,因为它不知道要转换哪一个。我怎样才能解决这个问题。如果有人在做他们的第一次转换,我如何才能检测到教科书中是否有文本。很抱歉

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


我的问题是:我如何检测我应该从哪个基数转换?例如,如果有人进行转换,并希望再次转换,他为任何基数输入另一个值,以便其中两个值在基数中相等,而另一个不相等,则程序将陷入混乱,因为它不知道要转换哪一个。我怎样才能解决这个问题。如果有人在做他们的第一次转换,我如何才能检测到教科书中是否有文本。很抱歉,我是jframes新手,几乎不知道语法。

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

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



另一种选择是使用
键侦听器
,但在文本字段中粘贴一些文本时,它不会做出反应。

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

恐怕我不能完全确定在文本字段更改后必须添加哪个侦听器才能接收事件(InputMethodListener似乎没有触发任何内容,而KeyListener在文本更改前触发),因此在本例中,我将使用ActionListener,这意味着用户必须在键入数字后按“enter”

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
}

很抱歉,我对jframes还不熟悉,从我的理解来看,我几乎不知道语法,你的问题不在于
JFrame
s,而在于base-detection.hmm,我想你可以这么说。我真的有更多的逻辑问题,我甚至还没有开始OK,所以这个问题与基本检测有关,它与
JFrame
和GUI编程无关,我建议删除这一部分并讨论您的问题。您的问题以“我不知道如何检测基础”开始,以“如何制作GUI?”结束。对我来说,这让你的问题有点不清楚:)你完全确定我应该这么做吗?问题本身有点与JFrames有关。问题不在于基地探测本身。有3个文本框标记为“二进制”、“十进制”和“十六进制”,因此检测基数并不是一个真正的问题。问题是我真的不知道如何获得转换值,尽管我知道如何进行转换。我遇到这个问题是因为有3个文本字段,我不知道如何“检测”用户输入的文本框。如果我做try/catch,将会有更多的代码。。。谢谢:)嗯,好吧,我误解了这个问题。我在回答,是的。不过,你可能想了解一些格式的概念。哈哈哈,哦,老兄,非常感谢!我不是真的应该使用toHexString或其他自动转换为基数的方法,但我明白了。我应该在每个文本字段上使用侦听器,如果(decimalTextfield中的inputIsMade){Decimal2Hex();Decimal2Binary();}@Alowaniak,我想问你是否测试了它,因为它没有work@BackSlash我确实测试过那段代码,所以我看不出有什么不对劲。@Alowaniak现在你编辑了你的代码。如果您在第一次编写时尝试将
ActionListener
添加到文本字段中,当用户键入一些文本时,它没有反应,我的评论与该代码相关,现在它可以工作了。谢谢你,非常感谢你的帮助,但是我要和听众一起去,看看我对他的评论,告诉我我做的是否正确。我不打算复制粘贴代码,我只打算现在就使用听众。我要弄清楚,我以前从来没有用过它们,我5分钟前才知道。等等,为什么?我打算这样做。代码6方法prehand:binarythex();其他5个与之类似,还有3个if语句,if(动作在小数框中进行){然后调用方法DecimalToHex():&DecimalToBinary();}为什么不起作用?