Java: Как использовать слушателей на Jmenuitem и Jbutton для расчета ставок
-
10-10-2019 - |
Вопрос
Я пишу конвертер валюты, но у меня есть небольшие проблемы с какулированием обменного курса для каждой валюты. По сути, я хочу, чтобы пользователь выбирал Currecy сначала, а затем ввел кнопку «Go», чтобы вычислить скорость. Но у меня проблемы со слушателями на Jmenuitem и Jbutton. Я объявил двух слушателей для Menuitem и Jbutton. Как я могу использовать слушателя на кнопке, чтобы найти выбор, сделанный на Menuiten, чтобы он сделал правильный расчет Currecy?
Спасибо.
КОД:
private class selectionListener implements ActionListener
{
double EuroToSterling(double euro)
{
double total = Double.parseDouble(amountField.getText());
return total;
}
public void actionPerformed(ActionEvent e)
{
if (e.getActionCommand().equals("Euros"))
// result = EuroToSterling(10*euro);
currencyMenu.setLabel("Euros");
// answerLabel.setText("this" + EuroToSterling(1.22*2));
if (e.getActionCommand().equals("Japanese Yen"))
currencyMenu.setLabel("Japanese Yen");
}
}
private class GoButtonListener implements ActionListener
{
public void actionPerformed(ActionEvent evt)
{
//please help with this section
Решение
Попробуйте это с евро. Должен дать вам место, чтобы начать.
/*
*
* Currency converting
*
*/
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JTextField;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.JComboBox;
import javax.swing.UIManager;
public class CurrencyConverterWin extends JFrame {
private JLabel promptLabel;
private JTextField amountField;
private JButton goButton;
private JPanel inputPanel;
private JPanel answerPanel;
private JLabel answerLabel;
private JLabel selectLabel;
private JComboBox currencyMenuBar;
private JPanel menuPanel;
private double result = 0.0;
private double euro = 1.22257;
private double japYen = 152.073;
private double rusRuble = 42.5389;
private double usd = 1.5577;
public CurrencyConverterWin() {
super();
this.setSize(500, 200);
this.setTitle("Currency Converter Window");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new GridLayout(3, 1));
this.selectLabel = new JLabel("Select a currency to convert to: ", JLabel.RIGHT);
this.answerLabel = new JLabel(" ", JLabel.CENTER);
currencyMenuBar = new JComboBox(new String[]{"Euros","Japanese Yen","Russian Rubles","US Dollars"});
this.menuPanel = new JPanel();
this.menuPanel.add(this.selectLabel);
this.menuPanel.add(this.currencyMenuBar);
this.add(this.menuPanel);
this.promptLabel = new JLabel("(select a currency first) ", JLabel.RIGHT);
this.answerLabel = new JLabel(" ", JLabel.CENTER);
this.amountField = new JTextField("", 8);
this.goButton = new JButton("GO");
goButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
buttonClicked(evt);
}
});
this.inputPanel = new JPanel();
this.inputPanel.add(this.promptLabel);
this.inputPanel.add(this.amountField);
this.inputPanel.add(this.goButton);
this.add(this.inputPanel);
this.answerPanel = new JPanel();
this.answerPanel.add(this.answerLabel);
this.add(this.answerPanel);
}
double EuroToSterling() {
double total = Double.parseDouble(amountField.getText()) * euro;
return total;
}
double JapYenToSterling()
{
double japToSterlingTotal = Double.parseDouble(amountField.getText()) * japYen;
return japToSterlingTotal;
}
//String currencyEntered = yearField.getText();
public void buttonClicked(ActionEvent evt) {
if(currencyMenuBar.getSelectedItem().equals("Euros"))
{
answerLabel.setText(EuroToSterling() + " Euros");
}
if(currencyMenuBar.getSelectedItem().equals("Japanese Yen"))
{
answerLabel.setText(JapYenToSterling() + " Japanese Yen");
}
}
public static void main(String[] args) {
try{UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");}
catch (Exception e){e.printStackTrace();}
CurrencyConverterWin win = new CurrencyConverterWin();
win.setVisible(true);
}
}
Другие советы
Обычный подход заключается в том, что слушатель меню меняет состояние приложения (т.е. вызывает метод, который сохранит обменный курс в поле).
Затем код расчета может прочитать это значение и использовать его.
Я также предложил бы вам использовать JCombobox для хранения валют. Вы создадите объект для хранения как названия валюты, так и коэффициента конверсии. Затем, когда вам нужно вычислить конвертированную сумму, вы получаете выбранную элемент из комбо и используете его коэффициент конверсии в своем расчете. С таким подходом вы можете легко расширить количество валют, которые вы поддерживаете.
Проверить: Как использовать элемент карты как текст jcombobox Для примера, чтобы заставить вас начать использовать объект в комбо -поле.
Я лично добавил бы перечисление, чтобы обозначить тип преобразования валюты. например:
public enum ConversionType {
DOLLARS,
EUROS,
RUBLES
//ETC...
}
Используя это, вы можете сохранить переменную состояния в классе:
private ConversionType fromType;
Это то, что вы установили в своем выборе слушателя.
Оттуда дело в том, чтобы сделать различные преобразования в вашем слушателе вашего действия на основе переменной состояния (OutType). Что-то вроде этого:
if( fromType== EUROS ) {
convertEurosToSterling( value1, value2 );
}
Это своего рода общий подход - я надеюсь, что это поможет.