0

我的小型转换程序有一些我无法解决并需要帮助的问题:

  1. 我希望在用户选择货币之前将文本字段设置为 setEditable(false)。这样用户在选择货币之前无法在文本字段中输入任何内容
  2. 如果用户在 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);
    }
}
4

3 回答 3

2

如果您只想要数字,那么两种常见的方法是:

a) 使用 JFormattedTextField。

b) 将 DocumentFilter 添加到文本字段的 Document 中。

Swing 教程中对这两种方法进行了详细说明。请参阅“如何使用格式化文本字段”和“文本组件功能(实现文档过滤器)”部分。

于 2010-12-13T17:36:29.143 回答
0

您可能需要 KeyListener 来检查用户在文本框中输入的内容是否具有正确的格式。

于 2010-12-13T16:52:07.803 回答
0

你的例子真的很长,所以我不确定你现在在做什么。但要回答你的问题:

  1. 将文本框设置为不可编辑。将侦听器添加到您的选择中,并在选择货币时将文本框设置为可编辑。
  2. 使用 JFormattedTextField 来防止不需要的格式。
于 2010-12-13T17:38:15.587 回答