可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I'm trying to make a simple java currency converter GUI. So far I have this :(4 parts)
![](https://www.manongdao.com/static/images/pcload.jpg)
How would I set the values for each item in the jcombbox (ex. each currency) so that I can use them to calculate the conversion?
Here's the first part (1 combobox):
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();
}
}
回答1:
Maybe try using Map (e.g. HashMap) instead of an array? The key would be a currency name and the value would be currency's value. So instead of:
private String[] Currency = { "USD - United States Dollar",
"GBP - Great Britain Pound", "AUD - Australian Dollar",
"EUR- Euro"};
I would make it:
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:
only comment, my view about Currency Converter
definition for Currency Pairs, by default is there Base and Variable Currency
definitions for Exange Rate
definition for Buy/Sale
definition for Base/Variable
(put all a.m. points together) then there are four possible combinations
buy Base (EUR 1,000.- at 1.31)
sell Base (EUR 1,000.- at 1.31)
buy Variable (USD 1,000.- at 1.311)
sell Variable (USD 1,000.- at 1.311)
GBP/USD has reverse calculations methods
回答3:
Suggestions of a possible solution:
- I would create a Currency class, one that has a String currencyName field and a double currencyRate field that holds its rate compared to some standard.
- I'd fill my JComboBox's model with objects of Currency.
- I'd give the JCOmboBox a cell renderer so that it shows the Currency name.
- I'd give my GUI a "convert" JButton
- In that button's action, I'd extract the selected Currencies from both combo boxes by calling
getSelectedItem()
and would use them to calculate an answer.
- Make sure that neither of the selected items are null before trying to calculate.
- Or this can be done via an ActionListener added to both combo boxes, but again I'd first have to make sure that the selected values are not null or that the selected indices are not -1.
回答4:
Create a Currency
class that contains a double value which is the currency's value (you choose how to calculate these).
Have the currency's toString()
return what should be displayed in the combo box, such as "USD - United States Dollar".
Now make sure your JComboBox
uses generics, so when you call getSelectedItem()
you don't have to cast it to Currency
, as in new JComboBox<Currency>()
. If you've got your project set on Java 6 you can still use JComboBox generics, even though that was added in Java 7 because of some fancy thing called type erasure. Look it up for details.
回答5:
I didn't see much in clicking on the URL you provided, so I'm hot sure if this would be an exact fit, but things like this are usually best addressed with Java enum
s. In particular you could use something like the following to store your conversion strings and rates (note that I picked arbitrary conversion rates - substitute the real rates for these):
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();
}
}
Then you could add these to your combobox like this:
for( Currency currency : Currency.values() ) {
CurrencyBox.addItem(currency);
}
回答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
}
Try this code
i have taken indian rupee as the base
it can convert
indian rupee
us dollar
british pound
japanese yen
euro
回答7:
Basically, the way I understand "Exchange rate" is, how much it costs to exchange one currency for another.
To me, that means that there is a need to associate one currency with another. This can be a "Currency Pair"
In addition to some of the previous suggestions (eg. Using an enum), as a brute force, a currency pair associated to an exchange rate can be used for the conversion.
For example (Note that the code below will need proper validation and scale/rounding):
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);
}
}