Java JMenu and Jtextfield that only handles numbers not strings
My small converting program has a few issues that I can't fix and need help with:
- I want the textfield to be setEditable(false) until the user has selected a currency. so that the user can't enter anything in the textfield until they've selected a currency
- if the user entered anything other than number in the jtextfield the resultLabel should give them an error message.
I've spent a while trying with the first part but i end up setting the whole textfield unedittable.
thanks here's my code:
/*
*
* 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);
}
}
If you only want numbers then the two common approaches are:
a) use a JFormattedTextField.
b) add a DocumentFilter to the Document of the text field.
Both approaches are explained more in the Swing tutorial. See the sections on "How to use Formatted Text Fields" and "Text Component Features (Implementing a Document Filter)".
You might want a KeyListener to check if what the user has entered into the text box has the right format.
Your example is really long so I am not sure exactly what you are doing now. But to answer your questions:
- Set the text box to not editable. Add a listener to your selection and when a currency is selected set the textbox to editable.
- Use a JFormattedTextField to prevent un-wanted formats.
精彩评论