Чтение из файла и заполнение существующего JComboBox новыми данными
Я пытаюсь написать программу преобразования, в которой можно загрузить новый файл в программу и изменить преобразование (необходимо также включить проверку, если файл поврежден). В настоящее время у меня есть жестко запрограммированные преобразования, и я хочу расширить программу, чтобы она принимала коэффициенты преобразования из внешнего текстового файла.
Я новичок в программировании и не очень понимаю, как это сделать, кто-то может помочь?
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 ответ
Ну, вы хотите начать использовать пользовательский объект для хранения связанных данных.
Итак, вы бы начали с создания Currency
объект с 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()
метод вашего объекта Валюта для отображения текста в поле со списком.
Теперь 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() для текста, отображаемого в поле со списком. Вместо этого вы должны использовать пользовательский рендер. После того, как вы получили приведенные выше предложения, вы можете проверить: поле со списком с пользовательским рендерером для получения дополнительной информации по этой теме.