Java JMenu和Jtextfield只处理数字而不是字符串

时间:2010-12-13 16:49:02

标签: java swing jtextfield actionlistener jmenu

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

  1. 我希望textfield为setEditable(false),直到用户选择了货币。这样用户在选择货币之前就无法在文本域中输入任何内容
  2. 如果用户在jtextfield中输入除number之外的任何内容,resultLabel应该给他们一条错误消息。
  3. 我花了一些时间尝试第一部分,但最终设置整个文本域无法使用。

    感谢 这是我的代码:

    /*
     *
     * 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);
        }
    }
    

3 个答案:

答案 0 :(得分:2)

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

a)使用JFormattedTextField。

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

Swing tutorial更详细地解释了这两种方法。请参阅“如何使用格式化文本字段”和“文本组件功能(实现文档过滤器)”部分。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

  1. 将文本框设置为不可编辑。 为您的选择添加一个监听器 选择货币时设置 文本框可编辑。
  2. 使用JFormattedTextField来防止 不想要的格式。