我的小型转换程序有一些我无法解决并需要帮助的问题:
- 我希望在用户选择货币之前将文本字段设置为 setEditable(false)。这样用户在选择货币之前无法在文本字段中输入任何内容
- 如果用户在 jtextfield 中输入了除数字以外的任何内容,则 resultLabel 应该给他们一条错误消息。
我花了一段时间尝试第一部分,但我最终将整个文本字段设置为不可编辑。
谢谢这是我的代码:
/*
*
* Currency Converter Window
* A currency converting program that accepts user defined amount
* and converts that amount in one of four currencies.
*
* Date
* @author
*
*/
import javax.swing.*;
import java.awt.event.*;
import java.awt.GridLayout;
public class CurrencyConverterWin extends JFrame
{
//three panels for the GUI
private JPanel inputPanel;
private JPanel resultPanel;
private JPanel menuPanel;
//labels that identify the fields
private JLabel promptLabel;
private JLabel resultLabel;
private JLabel selectLabel;
//menu for the list of currencies
private JMenu currencyMenu;
private JMenuBar currencyMenuBar;
//input field for user to enter currency
private JTextField inputField;
private JButton goButton;
//initial values for each currency to 1 sterling
private double euros = 1.22;
private double japaneseYen = 152.07;
private double russianRubles = 42.53;
private double usDollars = 1.55;
public CurrencyConverterWin() //constructor
{
super();
this.setSize(600, 150); //set size of the window
this.setLayout(new GridLayout(3, 1)); //split the grid with panels
this.setTitle("Currency Converter Window"); //set window title
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //close window
this.selectLabel = new JLabel("Select a currency to convert to: ", JLabel.RIGHT);
this.resultLabel = new JLabel(" ", JLabel.CENTER);
this.currencyMenu = new JMenu("(no currency selected)"); //create a menu of currencies
JMenuItem Euros = new JMenuItem("Euros"); //store the string Euros as a menu item
Euros.addActionListener(new java.awt.event.ActionListener() //add a listener to this item
{
public void actionPerformed(java.awt.event.ActionEvent evt) //listen for event
{
menuChanged(evt);
}
});
this.currencyMenu.add(Euros);
JMenuItem JapaneseYen = new JMenuItem("Japanese Yen"); //store the string Japanese Yen as a menu item
JapaneseYen.addActionListener(new java.awt.event.ActionListener() //add a listener to this item
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
menuChanged(evt);
}
});
this.currencyMenu.add(JapaneseYen);
JMenuItem RusRubbles = new JMenuItem("Russian Rubles"); //store the string russian rubles as a menu item
RusRubbles.addActionListener(new java.awt.event.ActionListener() //add a listener to this item
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
menuChanged(evt);
}
});
this.currencyMenu.add(RusRubbles);
JMenuItem USD = new JMenuItem("US Dollars"); //store the string US Dollars as a menu item
USD.addActionListener(new java.awt.event.ActionListener() //add a listener to this item
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
menuChanged(evt);
}
});
this.currencyMenu.add(USD);
currencyMenuBar = new JMenuBar(); //initialise a new menubar and add it to the currency menu
currencyMenuBar.add(currencyMenu);
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.resultLabel = new JLabel(" ", JLabel.CENTER);
this.inputField = new JTextField("", 8);
//this.amountField.setEditable(false); //need help with this part
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.inputField);
this.inputPanel.add(this.goButton);
this.add(this.inputPanel);
this.resultPanel = new JPanel();
this.resultPanel.add(this.resultLabel);
this.add(this.resultPanel);
}
/*
* change the state of the menu bar depending on the selected currency
*/
public void menuChanged(ActionEvent e)
{
if (e.getActionCommand().equals("Euros"))
{
currencyMenu.setText("Euros");
}
if (e.getActionCommand().equals("Japanese Yen")) {
currencyMenu.setText("Japanese Yen");
}
if (e.getActionCommand().equals("Russian Rubles")) {
currencyMenu.setText("Russian Rubles");
}
if (e.getActionCommand().equals("US Dollars")) {
currencyMenu.setText("US Dollars");
}
}
/*
* Events listeners for goButton
* when the goButton is clicked it should return the user's initial value
* plus the converted amount and some predefined strings.
*/
public void buttonClicked(ActionEvent evt)
{
if(currencyMenu.getText().equals("Euros"))
{
resultLabel.setText(inputField.getText() + " in sterling is " + EurosToSterling() + " Euros.");
}
if(currencyMenu.getText().equals("Japanese Yen"))
{
resultLabel.setText(inputField.getText() + " in sterling is " + JapaneseYenToSterling() + " Japanese Yen.");
}
if(currencyMenu.getText().equals("Russian Rubles"))
{
resultLabel.setText(inputField.getText() + " in sterling is " + RussianRublesToSterling() + " Russian Rubles.");
}
if(currencyMenu.getText().equals("US Dollars"))
{
resultLabel.setText(inputField.getText() + " in sterling is " + USDollarsToSterling() + " US Dollars.");
}
}
/*
* Functions for converting currencies
* get the user entry from inputField, convert it to a
* double and multiply it by the rate of a particular
* currency to a sterling.
*/
//calculate the rate for euros
double EurosToSterling()
{
double calcTotal = Double.parseDouble(inputField.getText()) * euros;
return calcTotal;
}
//calculate the conversion rate for japanese yen
double JapaneseYenToSterling()
{
double calcTotal = Double.parseDouble(inputField.getText()) * japaneseYen;
return calcTotal;
}
//calculate the rate for russian rubles
double RussianRublesToSterling()
{
double calcTotal = Double.parseDouble(inputField.getText()) * russianRubles;
return calcTotal;
}
//calculate the rate for us dollars
double USDollarsToSterling()
{
double calcTotal = Double.parseDouble(inputField.getText()) * usDollars;
return calcTotal;
}
/*
* main method to initialise CurrencyConverterWin
*/
public static void main(String[] args)
{
CurrencyConverterWin CurConWin = new CurrencyConverterWin();
CurConWin.setVisible(true);
}
}