Java JMenu и Jtextfield, которые обрабатывают только числа, а не строки - PullRequest
0 голосов
/ 13 декабря 2010

У моей маленькой конвертирующей программы есть несколько проблем, с которыми я не могу справиться и нуждаюсь в помощи:

  1. Я хочу, чтобы текстовое поле было установленоEditable (false), пока пользователь не выбрал валюту.так что пользователь не может ничего вводить в текстовое поле, пока не выберет валюту
  2. , если пользователь ввел в поле jtext что-либо, кроме числа, 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);
    }
}

Ответы [ 3 ]

2 голосов
/ 13 декабря 2010

Если вам нужны только цифры, то есть два общих подхода:

а) использовать JFormattedTextField.

b) добавить DocumentFilter к документу текстового поля.

Оба подхода более подробно описаны в учебнике Swing . См. Разделы «Как использовать поля форматированного текста» и «Функции текстового компонента (реализация фильтра документа)».

0 голосов
/ 13 декабря 2010

Ваш пример очень длинный, поэтому я не совсем уверен, что вы делаете сейчас Но чтобы ответить на ваши вопросы:

  1. Установите текстовое поле не редактируемым. Добавить слушателя к вашему выбору и когда валюта выбрана, установите текстовое поле для редактирования.
  2. Используйте JFormattedTextField для предотвращения ненужные форматы.
0 голосов
/ 13 декабря 2010

Возможно, вы захотите, чтобы KeyListener проверил, имеет ли то, что пользователь ввел в текстовое поле, правильный формат.

...