Чтение из файла и заполнение существующего JComboBox новыми данными - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь написать программу преобразования, в которой можно загрузить новый файл в программу и изменить преобразование (необходимо также включить проверку, если файл поврежден).В настоящее время у меня есть жестко запрограммированные преобразования, и я хочу расширить программу, чтобы она принимала коэффициенты преобразования из внешнего текстового файла.

Я новичок в программировании и не очень понимаю, как это сделать, может кто-то помочь?

public class CurrencyPanel extends JPanel{

//Declaring global variables which include buttons, labels, comboBox and a CheckBox
    private final static String[] conversionList = { "Euro (EUR)", "US Dollers(USD)", "Australian Dollars (AUD)", 
                                            "Canadian Dollars (CAD)", "Icelandic Króna (ISK)", "United Arab Emirates Dirham (AED)", 
                                            "South African Rand (ZAR)", "Thai Baht (THB)"};
    private JTextField inputField;
    private JLabel labelOutput, labelCount, labelReverse;
    private JCheckBox reverseCheck;
    private JComboBox<String> comboSelect;
    private int count = 0;


    public MainPanel mainPanel;

CurrencyPanel() {

    //initialising the convertListner to listener
            ActionListener listener = new ConvertListener();

            //setting comboBox to variable of list of conversions
            comboSelect = new JComboBox<String>(conversionList);
            comboSelect.setToolTipText("Select Conversion Type"); //ToolTip

            JLabel labelEnter = new JLabel("Enter value:"); //enter value label


            JButton convertButton = new JButton("Convert"); //convert button
            convertButton.addActionListener(listener); // convert values when pressed
            convertButton.setToolTipText("Press to convert value"); //ToolTip

            JButton clearButton = new JButton ("Clear"); //clear button
            clearButton.addActionListener(new ClearLabel()); //clear labels when button pressed
            clearButton.setToolTipText("Press to Clear Value & Conversion Counter"); //ToolTip

            labelOutput = new JLabel("---"); //label to be changed when conversion done
            inputField = new JTextField(5); //textField for the user to input
            inputField.addActionListener(listener); //Press return to do conversion
            labelOutput.setToolTipText("Conversion Value"); //ToolTip
            inputField.setToolTipText("Enter the value you wish to convert"); //ToolTip

            labelCount = new JLabel("Conversion Count: 0"); //Conversion count label to be changed when conversion occurs
            labelCount.setToolTipText("Amount of conversions made"); //ToolTip

            labelReverse = new JLabel("Reverse Conversion"); //ReverseConversion label
            reverseCheck = new JCheckBox(); //new CheckBox
            reverseCheck.setToolTipText("Check the box to reverse the conversion type"); //ToolTip

            //adding components to the panel
            add(comboSelect);
            add(labelEnter);
            add(inputField);
            add(convertButton);
            add(labelOutput);


            //setting size and colour of panel
            setPreferredSize(new Dimension(800, 100));
            setBackground(Color.cyan);

        }

            public void clearLabelMethod() {
                labelOutput.setText("---");
                inputField.setText("");
                count = 0;
                labelCount.setText("Conversion Count: 0");
            }




            //ActionListener to clear labels 
            private class ClearLabel implements ActionListener{
                @Override
                public void actionPerformed(ActionEvent e)
                {
                    labelOutput.setText("---");
                    inputField.setText("");
                    count = 0;
                    labelCount.setText("Conversion Count: 0");
                }
            }



        //ActionListener that does the main conversions
        private class ConvertListener implements ActionListener {


            @Override
            public void actionPerformed(ActionEvent event) {

                String text = inputField.getText().trim();

                //attempting to clear the combo box before repopulating
                comboSelect.removeAllItems();

                //try block to display message dialog
                try {   
                    Double.parseDouble(text); //checking to see if value is an double
                    if(inputField.getText().isEmpty()) 
                    { //if statement to check if inputField is empty


                    }
                }catch (Exception e) {
                    JOptionPane.showMessageDialog(null, "Please enter a valid number"); //message dialogue
                    return;
                }

                // if exception isn't thrown, then it is an integer
                if (text.isEmpty() == false) {

                    double value = Double.parseDouble(text); //converting double to string

                    // the factor applied during the conversion
                    double factor = 0;

                    // the offset applied during the conversion.
                    double offset = 0;

                    String symbol = null;


                    // Setup the correct factor/offset values depending on required conversion
                    switch (comboSelect.getSelectedIndex()) {

                    case 0: // Euro
                        factor = 1.359;
                        symbol = "€";
                        break;

                    case 1: // USD
                        factor = 1.34;
                        symbol = "$";
                        break;

                    case 2: // AUD
                        factor = 1.756;
                        symbol = "$";
                        break;

                    case 3: // CAD  
                        factor = 1.71;
                        symbol = "$";
                        break;

                    case 4: // ISK  
                        factor = 140.84;
                        symbol = "kr";
                        break;

                    case 5: // AED
                        factor = 4.92;
                        symbol = "د.إ";
                        break;

                    case 6: // ZAR  
                        factor = 17.84;
                        symbol = "R";
                        break;

                    case 7: // THB
                        factor = 43.58;
                        symbol = "฿";
                        break;
                    }


                    double result = 0;

                    if(mainPanel.reverseCheckMethod() == true) { //if the reverse check option is selected
                        result = value / factor - offset;   //do the opposite conversion

                    }else {
                        result = factor * value + offset; //if not then do regular conversion
                    }

                    DecimalFormat decFormat = new DecimalFormat("0.00"); //DecimalFormat of output
                    String formatted = decFormat.format(result); //formatting the result 2 decimal places

                    mainPanel.conCount();

                    labelOutput.setText(symbol+formatted); //setting the output label


                }
            }

        }

        public void loadFile() {

            int itemCount = comboSelect.getItemCount();
            for(int i=0;i<itemCount;i++) {
                comboSelect.removeAllItems();
            }

            try {
                BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("currency.txt"), "UTF8"));

                String line = null;

                while ((line = br.readLine()) != null) {
                     String[] values = line.split(",");

                     String currencyType = values[0];
                     String currencyValueTxt = values[1];
                     String currencySymbol = values[2];

                     Double conversionValue = Double.parseDouble(currencyValueTxt);

                     comboSelect.addItem(currencyType);

                     br.close();
                }

            }catch(Exception e) {
                JOptionPane.showMessageDialog(null, "File Error");
            }

        }
}

Файл валюты, о котором идет речь, зашифрован в UTF-8 и выглядит следующим образом:

Euro (EUR), 1.41, €
US Dollars (USD), 1.24, $
Australian Dollars (AUD), 1.86, $
Bermudan Dollar (BMD), 1.35, $
Icelandic króna (ISK),  141.24, kr
United Arab Emirates Dirham (AED), 4.12, د.إ
South African Rand (ZAR), 16.84, R
Thai Baht (THB), 42.58, ฿

1 Ответ

0 голосов
/ 23 ноября 2018

Итак, вы хотите начать использовать пользовательский объект для хранения связанных данных.

Итак, вы бы начали с создания Currency объекта с 3 свойствами:

  1. Имя
  2. Оценить
  3. Символ

Что-то вроде:

public class Currency
{
    private String name;
    private double rate;
    private String symbol;

    public Currency (String name, double rate, String symbol)
    {
        this.name = name;
        this.rate = rate;
        this.symbol = symbol;
    }

    // add getter methods here

    @Override
    public String toString()
    {
        return name;
    }
}

Затем вам нужно добавить методы получения, getName (), getRate ()и getSymbol (), чтобы вы могли получить доступ к данным из объекта.

Теперь вы можете добавить «жестко запрограммированные» объекты валюты в ваше поле со следующим кодом:

//comboSelect = new JComboBox<String>(conversionList);
comboSelect = new JComboBox<Currency>();
comboSelect.addItem( new Currency("Euro (EUR)", 1.23, "€") );
comboSelect.addItem( new Currency("US Dollar (USD), 1.23, "$") );
...

По умолчаниюсредство визуализации для поля со списком вызовет метод toString() вашего объекта Currency для текста, отображаемого в поле со списком.

Теперь код ActionListener для вашего поля со списком значительно упрощен:

Currency currency = (Currency)comboSelect.getSelectedItem();
factor = currency.getRate();
symbol = currency.getSymbol();

Нет необходимости в операторе switch.

В вашем текущем проекте у вас есть жесткий код имен в массиве, а символ скорости / символа жестко закодирован в ActionListener.С этим дизайном у вас есть все данные вместе в простой объект.

Итак, сначала приведите эту базовую логику в работу с жестко закодированными объектами Currency.

Затем, когда вы будете готовы создавать объекты динамической валюты, ваш цикл будет выглядеть примерно так:

while ((line = br.readLine()) != null) 
{
    String[] values = line.split(",");
    double rate = Double.parseDouble( values[1] );
    Currency currency = new Currency(values[0], rate, values[2]); 
    comboSelect.addItem( currency);

     //br.close(); you only close the file after reading all the lines of data
}

br.close();

Примечание: на самом деле не рекомендуется использовать метод toString () для отображения текста в поле со списком.Вместо этого вы должны использовать пользовательский рендер.После того как приведенные выше предложения сработают, вы можете проверить: Поле со списком с пользовательским рендерером для получения дополнительной информации по этой теме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...