【问题标题】:Hexadecimal to binary to decimal GUI十六进制转二进制转十进制 GUI
【发布时间】:2014-01-07 00:40:45
【问题描述】:

我正在尝试为此制作一个 GUI。基本上,您按下一个按钮,然后将十六进制转换为二进制和十进制。我觉得我正在接近我的代码。到目前为止,我创建了一个驱动器类和一个面板类。我试图在我的面板类中创建将十六进制转换为二进制和十六进制转换为十进制的方法。我不断收到错误,我不知道为什么。我一直在关注我的其他代码,但我一直在努力将这些方法放在面板类的底部。我会向你展示我目前的课程。

驱动类:

import javax.swing.JFrame;


public class DriverConverter {

    //--------------------------------------------------------
    // GUI for Converter
    //--------------------------------------------------------
    public static void main(String[] args) {
    JFrame frame = new JFrame ("Hexadecimal to Binary and Decimal.");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
    frame.getContentPane().add(new ConverterPanel());
    frame.pack();
    frame.setVisible(true);

    }
}

这是我的面板类:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridLayout;
import java.awt.event.InputMethodListener;
import java.util.Scanner;
import java.text.NumberFormat;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class ConverterPanel extends JPanel {
    private JLabel[] binary;
    private JLabel decimal;
    private JLabel inputLabel, outputLabel, resultLabel, totalLabel, totalLabel2;
    private JButton BinaryConvert, DecimalConvert;
    private JTextField hexString;
    private Font convertFont;
    private double total;


    //-------------------------------------------------------------
    // Main GUI
    //-------------------------------------------------------------

    public ConverterPanel() {

        setLayout(new BorderLayout());
        setPreferredSize(new Dimension(400,300));

        hexString =  new JTextField();
        //hexadecimal.addActionListener(new ConvertListener());
        add(hexString);


        JLabel converterName = new JLabel ("Hexadecimal Converter");
        JPanel panelName = new JPanel();
        panelName.add(converterName);
        add(panelName, BorderLayout.NORTH);

        JPanel totalPanel = new JPanel();
        totalPanel.add(new JLabel ("Binary"));
        totalLabel = new JLabel ("------");
        totalPanel.add(totalLabel);
        add(totalPanel, BorderLayout.SOUTH);

        JPanel totalPanel2 = new JPanel();
        totalPanel2.add(new JLabel ("Decimal"));
        totalLabel2 = new JLabel ("------");
        totalPanel2.add(totalLabel);
        add(totalPanel2, BorderLayout.EAST);


    }

    // -------------------------------------------------------------
    // Equation  for Binary Conversion
    //--------------------------------------------------------------

    public void binaryConversion (double binary){

        try {
             Integer b = Integer.valueOf(hexString,16);
             Integer.toBinaryString(b);
           } catch (NumberFormatException ee) {
             ee.printStackTrace();
           }

    }

    // Equation for decimal conversion.

    public void decimalConversion (double decimal){

        String decimal = decimal.getText();
         try {
             Integer c = Integer.valueOf(hexString,16);
             Integer.parseInt(hexString, 16);
           } catch (NumberFormatException ee) {
             ee.printStackTrace();
           }



        //Integer c = Integer.valueOf("444", 16);
        //Integer.parseInt("444",16);
    }



}

我一直在底部试验这些方法。我一直在尝试创建它们而没有任何错误。我还尝试对 JTextField 使用 getText() 方法。我觉得我可以接近这一点,但是我创建这些将十六进制转换为二进制以及将二进制转换为十进制的方法的逻辑有些“错误”。我实际上知道标准编辑器中的代码。在编辑器中这对我来说很有意义,因为您所做的只是 system.out.println 结果。它正在为导致一些问题的 GUI 进行翻译。

任何帮助将不胜感激。我意识到这篇文章很长。我只是不确定我的错误在哪里。它可能在面板类的开头,或者就在结尾,所以我认为发布整个代码将有助于识别问题。我很感激你能给我的任何指导。我至少在正确的轨道上吗?我一直在努力得到这个。谢谢。

编辑:

好的,我刚刚在 JGrasp 中运行它,这些是我遇到的错误。它在 Eclipse 中运行。

Exception in thread "main" java.lang.NoClassDefFoundError: ConverterPanel
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2531)
    at java.lang.Class.getMethod0(Class.java:2774)
    at java.lang.Class.getMethod(Class.java:1663)
    at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)
Caused by: java.lang.ClassNotFoundException: ConverterPanel
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 6 more

【问题讨论】:

  • 如果您不断收到错误,请告诉我们这些错误。还要阅读它们,因为 java 错误通常会告诉你出了什么问题 =)
  • 好吧,我使用 eclipse,我可以在编译之前看到错误,因为它以红色突出显示它们。对于十进制转换尝试,“十进制以红色突出显示,“getText”以红色突出显示,“valueOf”以红色突出显示,“parseInt”以红色突出显示。对于我的二进制转换尝试,只有“valueOf”以红色突出显示。我现在尝试编译,看看它会给我什么样的错误
  • @迈克。嗯...我刚刚尝试编译,但它没有给我一个错误。它显示了我到目前为止的 GUI。但是,我知道实际的逻辑是错误的,因为它以红色突出显示。
  • Eclipse 也有一个控制台,可以为您提供错误文本。如果您还没有查看,请确保将其打开,然后阅读 javac 错误输出
  • @麦克。出于某种原因,它没有在控制台中显示错误。但是我确实在“问题”部分看到了一些东西这是一个描述资源路径位置类型Integer类型中的方法valueOf(String,int)不适用于参数(JTextField,int)ConverterPanel.java第89行Java问题跨度>

标签: java swing binary hex converter


【解决方案1】:

对于编译器错误; 您的方法binaryConversion 有一个参数double decimal,它将隐藏名为decimal 的JLabel。这意味着您实际上是在double 上调用getText()。您还定义了称为十进制的字符串,这进一步混淆了编译器。 试试这个:

public void decimalConversion(double d) {

    String s = decimal.getText();
    try {
        Integer c = Integer.valueOf(s);
    } catch (NumberFormatException ee) {
        ee.printStackTrace();
    }
}

decimalConversion Integer.valueOf(hexString,16); 应该是 Integer.valueOf(hexString.getText(),16);


这是您可以做到的一种方法。这样您就可以输入文本并按回车键,它将被翻译成十进制和二进制并显示在标签上:

public class ConverterPanel extends JPanel {
    private JLabel binaryLabel = new JLabel();
    private JLabel decimalLabel = new JLabel();
    private JTextField  hexString = new JTextField();
    // omitted some variables

    public ConverterPanel() {

        setLayout(new BorderLayout());
        setPreferredSize(new Dimension(400, 300));
        setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        JLabel converterName = new JLabel("Hexadecimal Converter");
        hexString.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                convertInput();
            }
        });

        JPanel panelName = new JPanel(new GridLayout(1,2));
        panelName.add(converterName);
        panelName.add(hexString);
        add(panelName, BorderLayout.NORTH);


        JPanel totalPanel = new JPanel(new GridLayout(1,3));
        totalPanel.add(new JLabel("Binary"));
        totalLabel = new JLabel("------");
        totalPanel.add(totalLabel);
        totalPanel.add(binaryLabel);

        JPanel totalPanel2 = new JPanel(new GridLayout(1,3));
        totalPanel2.add(new JLabel("Decimal"));
        totalLabel2 = new JLabel("------");
        totalPanel2.add(totalLabel2);
        totalPanel2.add(decimalLabel);

        JPanel south = new JPanel(new GridLayout(2,1));
        south.add(totalPanel);
        south.add(totalPanel2);
        add(south, BorderLayout.SOUTH);

    }        

    private void convertInput() {

        try {
            Integer n = Integer.valueOf(hexString.getText(), 16);
            decimalLabel.setText(String.valueOf(n));
            binaryLabel.setText(Integer.toBinaryString(n));
        } catch (NumberFormatException ee) {
            ee.printStackTrace();
        }
    }
}

这是一个将文本从十六进制转换为整数和二进制的示例:

public class Test {
    public static void main(String[] args) {
        String string = "A3";
        int parseInt = Integer.parseInt(string, 16);
        System.out.println(parseInt);
        System.out.println(Integer.toBinaryString(parseInt));
    }
}

输出:

163
10100011

【讨论】:

  • 谢谢帕斯克。我会做出这些改变,看看会发生什么。这是有道理的。我在标准编辑器中更了解它。出于某种原因,GUI 逻辑仍然让我感到困惑
  • 是的,Java Swing 编程并不是最容易理解的东西。这是一个非常有用的资源的链接:docs.oracle.com/javase/tutorial/uiswing
  • 非常感谢帕斯克。我很感激。我肯定会研究这些教程。
  • 没问题!我很乐意提供帮助:-]
  • 多亏您的帮助,我才开始工作。我很感激。由于某种原因,我被禁止再问任何问题。我知道我做错了什么......
【解决方案2】:

您好,我在您的代码中发现了几个错误

1.-

首先,你要转换一个Textfield,当它应该是一个String时,你必须先用.getText()方法获取Textfield的值

public void binaryConversion (double binary){

        try {
             Integer b = Integer.valueOf(hexString.getText(),16);
             Integer.toBinaryString(b);
           } catch (NumberFormatException ee) {
             ee.printStackTrace();
           }

    }

2.其次,你试图给一个已经声明为方法参数的变量赋值,所以你应该更改方法变量的名称。

public void decimalConversion(double decimal) {

        String decimal2 = String.valueOf(decimal);
        try {
            Integer c = Integer.valueOf(hexString.getText(), 16);
            Integer.parseInt(hexString.getText(), 16);
        } catch (NumberFormatException ee) {
            System.out.println(ee.getMessage());
        } 
    }

并且在这个方法中也检查点 1

3.-

第三项,没有找到导致转化的事件,你应该为每个转化添加一个按钮并分配一个actionPerformed事件。

【讨论】:

  • 谢谢。这非常有用。