【问题标题】:Java Currency Converter GUIJava 货币转换器 GUI
【发布时间】:2013-04-28 06:19:17
【问题描述】:

我正在尝试制作一个简单的 java 货币转换器 GUI。到目前为止,我有这个:(4 部分)

如何设置 jcombbox 中每个项目的值(例如每种货币),以便我可以使用它们来计算转换?

这是第一部分(1 个组合框):

import java.awt.*;
import java.awt.event.*; 
import javax.swing.*;
public class test extends JPanel
{
private JPanel panel;
private JLabel messageLabel;
private JTextField USDTextField;
private JPanel CurrencyPanel;         
private JComboBox CurrencyBox;       
private String[] Currency  = { "USD - United States Dollar",
                 "GBP - Great Britain Pound", "AUD - Australian Dollar",
                 "EUR- Euro"};
public currency1()
{
  setLayout(new BorderLayout(4,1));
  buildCurrencyPanel();
  add(CurrencyPanel, BorderLayout.CENTER);
  setVisible(true);
  setBorder(BorderFactory.createTitledBorder("Select currency"));

}
private void buildCurrencyPanel()
{
  CurrencyPanel = new JPanel();
  CurrencyBox = new JComboBox(Currency);
  CurrencyPanel.add(CurrencyBox);
}
 public static void main(String[] args)
{
   new currency1();
}
}

【问题讨论】:

  • 我以为您已经制作了一个用于从代码中消除并发问题的 GUI,“Java 并发转换器”。

标签: java swing converter jcombobox currency


【解决方案1】:

也许尝试使用 Map(例如 HashMap)而不是数组?键是货币名称,值是货币的值。所以而不是:

private String[] Currency  = { "USD - United States Dollar",
                 "GBP - Great Britain Pound", "AUD - Australian Dollar",
                 "EUR- Euro"};

我会成功的:

private Map<String, Double> Currency = new HashMap<>();
//This is an initialization block
{
   Currency.put("USD - United States Dollar", 4.44);
   Currency.put("GBP - Great Britain Pound", 5.55);
   //and so on...
}

【讨论】:

    【解决方案2】:

    仅评论,我对货币转换器的看法

    1. 货币对的定义,默认有基础货币和可变货币

    2. 外汇汇率的定义

    3. 买卖定义

    4. 基/变量的定义

    5. (将所有上午点放在一起)那么有四种可能的组合

      • 购买基础(1,000 欧元。- 1.31)

      • 卖出基数(1,000 欧元。- 1.31 时)

      • 购买变量(1,000 美元。- 1.311)

      • 卖出变量(1,000 美元。- 1.311)

    6. GBP/USD 有反向计算方法

    【讨论】:

      【解决方案3】:

      可能的解决方案的建议:

      • 我将创建一个 Currency 类,该类具有一个 String currencyName 字段和一个双 currencyRate 字段,该字段与某个标准相比保持其汇率。
      • 我会用 Currency 对象填充我的 JComboBox 模型。
      • 我会给 JCOmboBox 一个单元格渲染器,以便它显示货币名称。
      • 我会给我的 GUI 一个“转换”JButton
      • 在该按钮的操作中,我会通过调用 getSelectedItem() 从两个组合框中提取选定的货币,并使用它们来计算答案。
      • 在尝试计算之前,请确保所选项目都不为空。
      • 或者这可以通过添加到两个组合框的 ActionListener 来完成,但是我首先必须确保所选值不为空或所选索引不为 -1。

      【讨论】:

        【解决方案4】:

        创建一个包含双精度值的 Currency 类,该值是货币的值(您可以选择如何计算这些值)。

        让货币的toString() 返回组合框中应显示的内容,例如“USD - 美国美元”。

        现在确保您的JComboBox 使用泛型,因此当您调用getSelectedItem() 时,您不必将其转换为Currency,如new JComboBox&lt;Currency&gt;()。如果您的项目设置在 Java 6 上,您仍然可以使用 JComboBox 泛型,即使它是在 Java 7 中添加的,因为有一些称为类型擦除的奇特事物。查看详情。

        【讨论】:

          【解决方案5】:

          我在点击您提供的 URL 时没有看到太多内容,所以我很确定这是否完全适合,但此类问题通常最好使用 Java enums 来解决。特别是,您可以使用类似以下的内容来存储您的转换字符串和汇率(请注意,我选择了任意转换率 - 用实际汇率代替这些):

          public enum Currency {
              USD(1.0,"United States Dollar"),
              GPB(0.9,"Great Britain Pound"),
              AUD(0.8,"Australian Dollar"),
              EUR(0.7,"Euro");
          
              private double conversionRatio;
              private String description;
          
              private Currency(double conversionRatio, String description) {
                  this.conversionRatio = conversionRatio;
                  this.description = description;
              }
          
              public double getConversionRatio() {
                  return conversionRatio;
              }
          
              public String getDescription() {
                  return description;
              }
          
              public void toString() {
                      return new StringBuilder(name()).append(" - ").append(getDescription()).toString();
              }
          
          }
          

          然后您可以像这样将这些添加到您的组合框中:

          for( Currency currency : Currency.values() ) {
               CurrencyBox.addItem(currency);
          }
          

          【讨论】:

          • 您不想将转换率硬编码到枚举中,因为它们会波动并且会波动。最好创建一个没有转化率的枚举,然后也许使用 EnumMap 来保存与每个 Conversion 枚举项关联的速率。
          • 我不一定同意这一点。这一切都取决于程序的规范。如果它是为了保持最新的转换率,那么我会同意你的看法。但是在看这个时,我并没有想到是这种情况,并选择提供静态解决方案。但为了清楚起见 - 让我们问一下......@user2348024,如果不重建项目(即在运行时从配置文件读取或通过 Web 服务检索等),转换率是否需要更改?
          • 可能。我已经对你投了赞成票,因为我喜欢你使用枚举的一般建议。
          • 感谢各位的帮助。我是 Java 新手,我不想使用所有这些东西,否则我的教授会认为我在复制/粘贴,因为我们还没有学会这一点。但是由于第一个回复说可以使用 ActionListener(我们有点熟悉)来完成,我想我会这样做。再次感谢
          【解决方案6】:
          package convert;
          
          public class CConverter extends javax.swing.JFrame {
          
              // Currency Values {Rupee,Dollar,Pound,Yen,Euro} 
          double curr1[] = {0,1,0.015,0.012,1.67,0.014};
          double curr2[] = {0,1,0.015,0.012,1.67,0.014}; 
          
          /**
           * Creates new form CConverter
           */
          public CConverter() {
              initComponents();
          }
          
          /**
           * This method is called from within the constructor to initialize the form.
           * WARNING: Do NOT modify this code. The content of this method is always
           * regenerated by the Form Editor.
           */
          @SuppressWarnings("unchecked")
          // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
          private void initComponents() {
          
              jLabel1 = new javax.swing.JLabel();
              jcmbCurrency1 = new javax.swing.JComboBox<>();
              jcmbCurrency2 = new javax.swing.JComboBox<>();
              jtxtAmount = new javax.swing.JTextField();
              jlblConversion = new javax.swing.JLabel();
              jbtnConvert = new javax.swing.JButton();
              jbtnReset = new javax.swing.JButton();
              jtxtConversion = new javax.swing.JTextField();
              jbtnExit = new javax.swing.JButton();
          
              setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
          
              jLabel1.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
              jLabel1.setText("Currency Converter");
          
              jcmbCurrency1.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Choose One", "INDIA Rupee", "US Dollar", "UK Pound", "JAPAN Yen", "Euro" }));
          
              jcmbCurrency2.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Choose Other", "INDIA Rupee", "US Dollar", "UK Pound", "JAPAN Yen", "Euro" }));
          
              jtxtAmount.setText("Amount");
          
              jlblConversion.setText("Conversion");
          
              jbtnConvert.setText("CONVERT");
              jbtnConvert.addActionListener(new java.awt.event.ActionListener() {
                  public void actionPerformed(java.awt.event.ActionEvent evt) {
                      jbtnConvertActionPerformed(evt);
                  }
              });
          
              jbtnReset.setText("RESET");
              jbtnReset.addActionListener(new java.awt.event.ActionListener() {
                  public void actionPerformed(java.awt.event.ActionEvent evt) {
                      jbtnResetActionPerformed(evt);
                  }
              });
          
              jtxtConversion.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
              jtxtConversion.setForeground(new java.awt.Color(0, 0, 204));
              jtxtConversion.setText("Converted Value");
          
              jbtnExit.setText("Exit");
              jbtnExit.addActionListener(new java.awt.event.ActionListener() {
                  public void actionPerformed(java.awt.event.ActionEvent evt) {
                      jbtnExitActionPerformed(evt);
                  }
              });
          
              javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
              getContentPane().setLayout(layout);
              layout.setHorizontalGroup(
                  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                  .addGroup(layout.createSequentialGroup()
                      .addGap(0, 0, Short.MAX_VALUE)
                      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                          .addComponent(jLabel1)
                          .addGroup(layout.createSequentialGroup()
                              .addComponent(jbtnConvert)
                              .addGap(18, 18, 18)
                              .addComponent(jbtnReset, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                          .addComponent(jcmbCurrency1, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                          .addComponent(jcmbCurrency2, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                          .addComponent(jtxtAmount)
                          .addComponent(jlblConversion, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                          .addComponent(jtxtConversion))
                      .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                  .addGroup(layout.createSequentialGroup()
                      .addGap(158, 158, 158)
                      .addComponent(jbtnExit)
                      .addContainerGap(191, Short.MAX_VALUE))
              );
              layout.setVerticalGroup(
                  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                  .addGroup(layout.createSequentialGroup()
                      .addGap(22, 22, 22)
                      .addComponent(jLabel1)
                      .addGap(28, 28, 28)
                      .addComponent(jcmbCurrency1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                      .addGap(18, 18, 18)
                      .addComponent(jcmbCurrency2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                      .addGap(18, 18, 18)
                      .addComponent(jtxtAmount, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                      .addGap(38, 38, 38)
                      .addComponent(jlblConversion)
                      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                      .addComponent(jtxtConversion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                      .addGap(18, 18, 18)
                      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                          .addComponent(jbtnConvert)
                          .addComponent(jbtnReset))
                      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                      .addComponent(jbtnExit)
                      .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
              );
          
              pack();
          }// </editor-fold>                        
          
          private void jbtnConvertActionPerformed(java.awt.event.ActionEvent evt) {                                            
              // TODO add your handling code here:
          
          
              double amt = Double.parseDouble(jtxtAmount.getText());
          
              int obj1 = jcmbCurrency1.getSelectedIndex();
              int obj2 = jcmbCurrency2.getSelectedIndex();
          
              if (obj1 == obj2){
                  String samecur = "Both the currencies cannot be the same";
                  jtxtConversion.setText(samecur);
              }
              else {
                  double res = (amt/curr1[obj1])*curr2[obj2];
          
                  String conv = String.format("%.2f",res);
                  jtxtConversion.setText(conv);
              }
          
          }                                           
          
          private void jbtnResetActionPerformed(java.awt.event.ActionEvent evt) {                                          
              // TODO add your handling code here:
              jtxtAmount.setText(null);
              jtxtConversion.setText(null);
              jcmbCurrency1.setSelectedIndex(0);
              jcmbCurrency2.setSelectedIndex(0);
          }                                         
          
          private void jbtnExitActionPerformed(java.awt.event.ActionEvent evt) {                                         
              // TODO add your handling code here:
              System.exit(0);
          }                                        
          
          /**
           * @param args the command line arguments
           */
          public static void main(String args[]) {
              /* Set the Nimbus look and feel */
              //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
              /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
               * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
               */
              try {
                  for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                      if ("Nimbus".equals(info.getName())) {
                          javax.swing.UIManager.setLookAndFeel(info.getClassName());
                          break;
                      }
                  }
              } catch (ClassNotFoundException ex) {
                  java.util.logging.Logger.getLogger(CConverter.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
              } catch (InstantiationException ex) {
                  java.util.logging.Logger.getLogger(CConverter.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
              } catch (IllegalAccessException ex) {
                  java.util.logging.Logger.getLogger(CConverter.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
              } catch (javax.swing.UnsupportedLookAndFeelException ex) {
                  java.util.logging.Logger.getLogger(CConverter.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
              }
              //</editor-fold>
          
              /* Create and display the form */
              java.awt.EventQueue.invokeLater(new Runnable() {
                  public void run() {
                      new CConverter().setVisible(true);
                  }
              });
          }
          
          // Variables declaration - do not modify                     
          private javax.swing.JLabel jLabel1;
          private javax.swing.JButton jbtnConvert;
          private javax.swing.JButton jbtnExit;
          private javax.swing.JButton jbtnReset;
          private javax.swing.JComboBox<String> jcmbCurrency1;
          private javax.swing.JComboBox<String> jcmbCurrency2;
          private javax.swing.JLabel jlblConversion;
          private javax.swing.JTextField jtxtAmount;
          private javax.swing.JTextField jtxtConversion;
          // End of variables declaration                   
          }
          

          试试这个代码 我以印度卢比为基础 它可以转换 印度卢比 美元 英镑 日圆 欧元

          【讨论】:

            【解决方案7】:

            基本上,我理解"Exchange rate" 的方式是,将一种货币兑换成另一种货币需要多少钱。

            对我来说,这意味着需要将一种货币与另一种货币关联起来。这可以是“货币对

            除了前面的一些建议(例如,使用枚举)之外,作为蛮力,可以使用与汇率相关联的货币对进行转换。

            例如(请注意,下面的代码将需要适当的验证和缩放/舍入):

            import javax.swing.*;
            import java.awt.*;
            import java.awt.event.ActionEvent;
            import java.awt.event.ActionListener;
            import java.math.BigDecimal;
            import java.text.NumberFormat;
            import java.util.HashMap;
            import java.util.Locale;
            import java.util.Map;
            
            import static javax.swing.JFrame.EXIT_ON_CLOSE;
            
            public class Main extends JPanel {
                enum Currency {
                    USD("United States Dollar"),
                    GBR("Great Britain Pound"),
                    AUD("Australian Dollar"),
                    EUR("Euro");
            
                    private String description;
            
                    Currency(String description) {
                        this.description = description;
                    }
            
                    @Override public String toString() {
                        return this.name() + " - " + this.description;
                    }
                }
            
                class CurrencyPair {
                    private final Currency from;
                    private final Currency to;
            
                    public CurrencyPair(Currency from, Currency to) {
                        this.from = from;
                        this.to = to;
                    }
            
                    @Override public boolean equals(Object o) {
                        if (this == o) return true;
                        if (o == null || getClass() != o.getClass()) return false;
            
                        CurrencyPair that = (CurrencyPair) o;
                        if (from != that.from) return false;
                        return to == that.to;
                    }
            
                    @Override public int hashCode() {
                        int result = from.hashCode();
                        result = 31 * result + to.hashCode();
                        return result;
                    }
                }
            
                private final Map<CurrencyPair, BigDecimal> exchangeRates = new HashMap<CurrencyPair, BigDecimal>() {{
                    put(new CurrencyPair(Main.Currency.USD, Main.Currency.USD), BigDecimal.valueOf(1));
                    put(new CurrencyPair(Main.Currency.AUD, Main.Currency.AUD), BigDecimal.valueOf(1));
                    put(new CurrencyPair(Main.Currency.EUR, Main.Currency.EUR), BigDecimal.valueOf(1));
                    put(new CurrencyPair(Main.Currency.GBR, Main.Currency.GBR), BigDecimal.valueOf(1));
            
                    put(new CurrencyPair(Main.Currency.USD, Main.Currency.GBR), BigDecimal.valueOf(0.75));
                    put(new CurrencyPair(Main.Currency.USD, Main.Currency.AUD), BigDecimal.valueOf(1.33));
                    put(new CurrencyPair(Main.Currency.USD, Main.Currency.EUR), BigDecimal.valueOf(0.89));
            
                    put(new CurrencyPair(Main.Currency.EUR, Main.Currency.USD), BigDecimal.valueOf(1.12));
                    put(new CurrencyPair(Main.Currency.EUR, Main.Currency.AUD), BigDecimal.valueOf(1.49));
                    put(new CurrencyPair(Main.Currency.EUR, Main.Currency.GBR), BigDecimal.valueOf(0.85));
            
                    put(new CurrencyPair(Main.Currency.AUD, Main.Currency.USD), BigDecimal.valueOf(0.74));
                    put(new CurrencyPair(Main.Currency.AUD, Main.Currency.EUR), BigDecimal.valueOf(0.67));
                    put(new CurrencyPair(Main.Currency.AUD, Main.Currency.GBR), BigDecimal.valueOf(0.57));
            
                    put(new CurrencyPair(Main.Currency.GBR, Main.Currency.USD), BigDecimal.valueOf(1.33));
                    put(new CurrencyPair(Main.Currency.GBR, Main.Currency.EUR), BigDecimal.valueOf(1.18));
                    put(new CurrencyPair(Main.Currency.GBR, Main.Currency.AUD), BigDecimal.valueOf(1.76));
            
                }};
            
                public Main() {
                    super(new FlowLayout(FlowLayout.LEADING));
            
                    // Amount
                    JTextField amountInput = new JTextField(20);
                    JPanel amount = new JPanel();
                    amount.add(amountInput);
                    amount.setBorder(BorderFactory.createTitledBorder("Enter Ammount"));
                    add(amount, BorderLayout.CENTER);
            
                    // From
                    JPanel from = new JPanel();
                    JComboBox fromOptions = new JComboBox(Currency.values());
                    from.add(fromOptions);
                    from.setBorder(BorderFactory.createTitledBorder("Select currency"));
                    add(from, BorderLayout.CENTER);
            
                    // To
                    JComboBox toOptions = new JComboBox(Currency.values());
                    JPanel to = new JPanel();
                    to.add(toOptions);
                    to.setBorder(BorderFactory.createTitledBorder("Convert to"));
                    add(to, BorderLayout.CENTER);
            
                    // Convert Action
                    JLabel convertText = new JLabel();
                    JButton convertCmd = new JButton("Convert");
                    convertCmd.addActionListener(convertAction(amountInput, fromOptions, toOptions, convertText));
                    JPanel convert = new JPanel();
                    convert.add(convertCmd);
                    convert.add(convertText);
                    add(convert);
                }
            
                private ActionListener convertAction(
                        final JTextField amountInput,
                        final JComboBox fromOptions,
                        final JComboBox toOptions,
                        final JLabel convertText) {
            
                    return new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                            // TODO: Needs proper validation
                            String amountInputText = amountInput.getText();
                            if ("".equals(amountInputText)) { return; }
            
                            // Convert
                            BigDecimal conversion = convertCurrency(amountInputText);
                            convertText.setText(NumberFormat
                                    .getCurrencyInstance(Locale.US)
                                    .format(conversion));
                        }
            
                        private BigDecimal convertCurrency(String amountInputText) {
                            // TODO: Needs proper rounding and precision setting
                            CurrencyPair currencyPair = new CurrencyPair(
                                    (Currency) fromOptions.getSelectedItem(),
                                    (Currency) toOptions.getSelectedItem());
                            BigDecimal rate = exchangeRates.get(currencyPair);
                            BigDecimal amount = new BigDecimal(amountInputText);
                            return amount.multiply(rate);
                        }
                    };
                }
            
            
                public static void main(String[] args) {
                    JFrame frame = new JFrame();
                    frame.getContentPane().add(new Main());
                    frame.setTitle("Currency Thing");
                    frame.setSize(500, 500);
                    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            
            
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多