I need help with my JAVA code. I need help with my btnProcessItem actionlistener
ID: 3878178 • Letter: I
Question
I need help with my JAVA code. I need help with my btnProcessItem actionlistener function. In this function when the button is pressed, it checks for if a string entered by a user equals an element in a 2d array. If the string matches an element, it proceeds with code without a problem. When the string doesn't match an element in the 2d array, the code displays a JOptionPane message saying the string entered doesn't match, and it resets the text field entry. However, when I click the 'ok' button in the JOptionPane, the JOptionPane doesn't disappear. I need this JOptionPane to disappear and allow the user to enter a new ID so that it can be processed and checked with the 2d array to see if it exist. I've posted my code below. I only need help with my btnProcessItem actionlistener function.
I would appreciate any help.
/*Name: Kenneth Gonzalez
* Course: CNT 4714 - Spring 2018
* Assignment Title: Program 1 - Event Driven Programming
* Date: Sunday January 28, 2018
*/
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.awt.event.ActionEvent;
import java.awt.Font;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.lang.String;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.awt.Color;
public class Project1GUI {
private JFrame frame;
private JTextField txtFieldNumOfItems;
private JTextField BookID;
private JTextField Quantity;
private JTextField BookInformation;
private JTextField Subtotal;
private JButton btnProcessItem;
private JButton btnConfirmItem;
private JButton btnViewOrder;
private JButton btnFinishOrder;
// JLabel lblBookID;
private int numOfItems;
int quantityOfBook;
private int count = 1;
private int subTotalCount = 0;
private double subTotalforItems = 0;
private static String array2DFromFile[][];
private static String arrayFromFile[];
String [][]array2 = null;
static int numRows;
static int numCols;
int count1 = 0;
int bookIDProc = 0;
double subTotal = 0;
String everything = null;
String ViewOrderOutput="";
String FinishOrderOutput="";
String text;
String numberList;
String s = null;
String result;
String discount = null;
ArrayList<String> numbers = new ArrayList<String>();
ArrayList<String> cart = new ArrayList<String>();
static ArrayList<String> list = new ArrayList<String>();
ArrayList<String> itemsForTransactionFile = new ArrayList<String>();
/**
* Launch the application.
*/
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
Project1GUI window = new Project1GUI();
window.frame.setVisible(true);
//Calling the start function that begins by reading in the file.
start();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public static void start()
{
//Parses the file and returns the elements in a 2D array.
array2DFromFile = ReadFile.convertTo2DArray();
numCols = array2DFromFile[0].length;
numRows = array2DFromFile.length;
//Add the elements of the 2D array to a 1D array so we can check if a BOOKID exist or doesn't exist.
for(int x = 0; x < numRows; x++)
{
for(int y = 0; y < numCols; y++)
{
list.add(array2DFromFile[x][y]);
}
}
arrayFromFile = new String[list.size()];
for(int i = 0; i < arrayFromFile.length; i++)
{
arrayFromFile[i] = list.get(i);
}
}
/**
* Create the application.
*/
public Project1GUI() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
@SuppressWarnings("deprecation")
private void initialize() {
frame = new JFrame();
frame.getContentPane().setBackground(Color.GREEN);
frame.setBounds(100, 100, 920, 432);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
txtFieldNumOfItems = new JTextField();
txtFieldNumOfItems.setBounds(370, 50, 376, 22);
frame.getContentPane().add(txtFieldNumOfItems);
txtFieldNumOfItems.setColumns(10);
BookID = new JTextField();
BookID.setBounds(370, 97, 376, 22);
frame.getContentPane().add(BookID);
BookID.setColumns(10);
Quantity = new JTextField();
Quantity.setBounds(370, 147, 376, 22);
frame.getContentPane().add(Quantity);
Quantity.setColumns(10);
BookInformation = new JTextField();
BookInformation.setBounds(370, 197, 376, 22);
frame.getContentPane().add(BookInformation);
BookInformation.setColumns(10);
BookInformation.setEditable(false);
Subtotal = new JTextField();
Subtotal.setBounds(370, 251, 376, 22);
frame.getContentPane().add(Subtotal);
Subtotal.setColumns(10);
Subtotal.setEditable(false);
JLabel lblItemsInOrder = new JLabel("Enter the number of items in this order: ");
lblItemsInOrder.setFont(new Font("Times New Roman", Font.PLAIN, 16));
lblItemsInOrder.setBounds(43, 53, 274, 19);
frame.getContentPane().add(lblItemsInOrder);
JLabel lblBookID = new JLabel("Enter BookID for item #" + count +":");
lblBookID.setFont(new Font("Times New Roman", Font.PLAIN, 16));
lblBookID.setBounds(43, 100, 274, 16);
frame.getContentPane().add(lblBookID);
JLabel lblQuantity = new JLabel("Enter quantity for item #" + count +":");
lblQuantity.setFont(new Font("Times New Roman", Font.PLAIN, 16));
lblQuantity.setBounds(43, 150, 274, 16);
frame.getContentPane().add(lblQuantity);
JLabel lblItemInfo = new JLabel("Item #" + count + " info:");
lblItemInfo.setFont(new Font("Times New Roman", Font.PLAIN, 16));
lblItemInfo.setBounds(43, 200, 274, 16);
frame.getContentPane().add(lblItemInfo);
JLabel lblSubtotal = new JLabel("Order Subtotal for " +subTotalCount+ " item(s):");
lblSubtotal.setFont(new Font("Times New Roman", Font.PLAIN, 16));
lblSubtotal.setBounds(43, 254, 274, 16);
frame.getContentPane().add(lblSubtotal);
btnProcessItem = new JButton("Process Item # " + count);
btnProcessItem.setBounds(43, 337, 131, 25);
frame.getContentPane().add(btnProcessItem);
//If Process Item button is pressed take certain actions
btnProcessItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0)
{
//Disable how many items the customer wants after they press the Process Item button.
numOfItems = Integer.parseInt(txtFieldNumOfItems.getText());
txtFieldNumOfItems.setEditable(false);
//Check to see if the ID entered is 5 characters long
if(count1 < numOfItems)
{
if(BookID.getText().length() == 5)
{
s = BookID.getText();
bookIDProc = Integer.parseInt(BookID.getText());
}
else if(BookID.getText().length() > 5)
{
JOptionPane.showMessageDialog(frame, "Please enter a five digit number!");
System.exit(0);
}
else if(BookID.getText().length() < 5)
{
JOptionPane.showMessageDialog(frame, "Please enter a five digit number!");
System.exit(0);
}
//Converts text user entered to int and assigns to quantityOfBook
quantityOfBook = Integer.parseInt(Quantity.getText());
//Checks if the bookID entered by the user matches the bookID from array that was read from a file
for(int x = 0; x < numRows; x++)
{
for(int y = 0; y < 1; y++)
{
//Checks that the string s entered by the user matches an item in the 2D array
if(array2DFromFile[x][0].equals(s))
{
if(quantityOfBook <= 4)
{
discount = ("0");
BookInformation.setText(array2DFromFile[x][0] + array2DFromFile[x][1] + array2DFromFile[x][2] +" " +quantityOfBook+" " + discount +"% "+ array2DFromFile[x][2]);
}
else if(quantityOfBook >= 5 && quantityOfBook <= 9)
{
discount = ("10");
BookInformation.setText(array2DFromFile[x][0] + array2DFromFile[x][1] + array2DFromFile[x][2] +" " +quantityOfBook+" " +discount +"% " +array2DFromFile[x][2]);
}
else if(quantityOfBook >= 10 && quantityOfBook <= 14)
{
discount = ("15");
BookInformation.setText(array2DFromFile[x][0] + array2DFromFile[x][1] + array2DFromFile[x][2] +" " +quantityOfBook+" " +discount+"% " +array2DFromFile[x][2]);
}
else if(quantityOfBook >= 15)
{
discount = ("20");
BookInformation.setText(array2DFromFile[x][0] + array2DFromFile[x][1] + array2DFromFile[x][2] +" " +quantityOfBook+" "+ discount+"% " +array2DFromFile[x][2]);
}
//Keeps track of how many items have been processed. Once the nth item has been processed some of the components become disabled
count1++;
if(count1 == numOfItems)
{
BookID.setEditable(false);
Quantity.setEditable(false);
lblQuantity.setVisible(false);
lblBookID.setVisible(false);
btnProcessItem.setText("Process Item");
btnProcessItem.setEnabled(false);
}
}
//If value is not found it will display the following message
else if(!list.contains(s))
{
/*This is where I have a problem. The message shows and when I click 'ok' the content is cleared from BookID and Quantity however
* the dialog message pane doesn't disappear. I need the code to allow the user to enter text to BookID and quantity and allow them to process
* the new ID they entered. I need to repeat this process everytime the user enters the wrong BookID, but it doesnt work. It stay stuck on
* with the message dialog.
*/
JOptionPane.showMessageDialog(frame, "BookID " +s+ " does not exist.");
//System.out.println("Hola");
BookID.setText("");
Quantity.setText("");
//System.exit(0);
}
}
}
/*Check to see if the Process JButton has been pressed; if pressed will disable Process button and enable the Confirm Item button. */
if(arg0.getSource() == btnProcessItem)
{
btnProcessItem.setEnabled(false);
if(btnProcessItem.isEnabled()==false)
{
btnConfirmItem.setEnabled(true);
}
}
//}
//Checks to see when we have reached the item count the user entered in the beginning. Once reached the program will disable the following features.
/*count1++;
if(count1 == numOfItems)
{
BookID.setEditable(false);
Quantity.setEditable(false);
lblQuantity.setVisible(false);
lblBookID.setVisible(false);
btnProcessItem.setText("Process Item");
btnProcessItem.setEnabled(false);
}*/
}
}
});
btnConfirmItem = new JButton("Confirm item #" + count);
btnConfirmItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent arg0)
{
btnViewOrder.setEnabled(true);
btnFinishOrder.setEnabled(true);
btnConfirmItem.setEnabled(false);
btnProcessItem.setEnabled(true);
s = BookID.getText();
for(int x = 0; x < numRows; x++)
{
for(int y = 0; y < 1; y++)
{
if(array2DFromFile[x][0].equals(s))
{
JOptionPane.showMessageDialog(frame, "Item # " +count+ " accepted");
BookID.setText("");
Quantity.setText("");
subTotal = Summation.subTotal(array2DFromFile[x][2], quantityOfBook);
subTotalforItems += subTotal;
String number = Double.toString(subTotalforItems);
subTotalCount++;
lblSubtotal.setText("Order Subtotal for " +subTotalCount+ " item(s):");
Subtotal.setText("$" +number);
StringBuilder builder = new StringBuilder();
BookInformation.setText(array2DFromFile[x][0] + array2DFromFile[x][1] + array2DFromFile[x][2] + " " +quantityOfBook + " "+ discount + " "+subTotal);
builder.append(array2DFromFile[x][0]).append(", ").append(array2DFromFile[x][1]).append(", ").append("$").append(array2DFromFile[x][2]).append(", ").append(quantityOfBook).append(", ").append(discount).append(", ").append("$").append(subTotal);
result = builder.toString();
itemsForTransactionFile.add(result);
}
}
}
text = BookInformation.getText();
cart.add(text);
numberList = Integer.toString(count);
numbers.add(numberList);
count = Integer.parseInt(numberList);
count++;
lblBookID.setText("Enter BookID for item #" + count +":");
lblQuantity.setText("Enter quantity for item #" + count + ":");
btnProcessItem.setText("Process Item # " + count);
btnConfirmItem.setText("Confirm item #" + count);
if(count1 == numOfItems)
{
btnProcessItem.setText("Process Item");
btnProcessItem.setEnabled(false);
btnConfirmItem.setText("Confirm Item");
}
}
});
btnConfirmItem.setBounds(186, 337, 131, 25);
frame.getContentPane().add(btnConfirmItem);
btnConfirmItem.setEnabled(false);
btnViewOrder = new JButton("View Order");
btnViewOrder.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent arg0)
{
for(int i =0; i<cart.size(); i++)
{
everything = cart.get(i).toString();
String everything2 = numbers.get(i).toString();
ViewOrderOutput += everything2 +". " + " " +everything+ " ";
}
JOptionPane.showMessageDialog(frame, ViewOrderOutput);
}
});
btnViewOrder.setBounds(329, 337, 131, 25);
frame.getContentPane().add(btnViewOrder);
btnViewOrder.setEnabled(false);
btnFinishOrder = new JButton("Finish Order");
btnFinishOrder.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
double TaxAmount = subTotalforItems * .06;
double orderTotal = TaxAmount + subTotalforItems;
Date today = new Date();
SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyMMddHHmmSS");
String date = DATE_FORMAT.format(today);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
LocalDateTime now = LocalDateTime.now();
JOptionPane.showMessageDialog(frame, dtf.format(now) + " Number of line items: " + count1 + " Item# / ID / Title / Price / Qty / Disc % / Subtotal: " +
" "+ ViewOrderOutput +" Order Subtotal: $" + subTotalforItems + " Tax Rate: 6% "+ "Tax Amount: $" + TaxAmount +
" Order total: $" +orderTotal +" Thanks for shopping at the Ye Olde Book Shoppe!");
ArrayList<String> newlist = new ArrayList<String>();
for(int x = 0; x < itemsForTransactionFile.size(); x++)
{
StringBuilder builder = new StringBuilder();
String result = null;
builder.append(date).append(", ").append(itemsForTransactionFile.get(x)).append(", ").append(now);
result = builder.toString();
newlist.add(result);
}
String []results = newlist.toArray(new String[newlist.size()]);
//Writes to transaction file
/*BufferedWriter outputWriter = null;
try {
outputWriter = new BufferedWriter(new FileWriter("transaction.txt"));
for(int x = 0; x < results.length; x++)
{
outputWriter.write(results[x]);
outputWriter.newLine();
}
outputWriter.flush();
outputWriter.close();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}*/
try {
File file = new File("transaction.txt");
if(!file.exists()) {
file.createNewFile();
}
FileWriter fw = new FileWriter(file, true);
BufferedWriter bw = new BufferedWriter(fw);
for(int x = 0; x < results.length; x++)
{
bw.write(results[x]);
bw.newLine();
}
bw.close();
}
catch(IOException ioe) {
ioe.printStackTrace();
}
}
});
btnFinishOrder.setBounds(472, 337, 131, 25);
frame.getContentPane().add(btnFinishOrder);
btnFinishOrder.setEnabled(false);
JButton btnNewOrder = new JButton("New Order");
btnNewOrder.setBounds(615, 337, 131, 25);
frame.getContentPane().add(btnNewOrder);
/*This JButton will exit the system when the user clicks it*/
JButton btnExit = new JButton("Exit");
btnExit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(e.getSource() == btnExit) System.exit(0);
}
});
btnExit.setBounds(758, 337, 131, 25);
frame.getContentPane().add(btnExit);
}
}
Explanation / Answer
Hello, the thing is that the code you have provided is incomplete as it depends on some other classes and methods (ReadFile, Summation etc). So I cannot run and provide you the output, but I have figured out the fault. Actually, you have put the JOptionPane dialog box display statement inside a for loop (accidentally or inattentively). So the dialog box will be displayed for n number of times (n = number of elements in the array array2DFromFile). So, when you click the close button, the dialog box actually closes, but still there are n-1 dialog boxes are open.
This is your code
for (int x = 0; x < numRows; x++) //for loop start
{
for (int y = 0; y < 1; y++)
{
// Checks that the string s entered by the user
// matches an item in the 2D array
if (array2DFromFile[x][0].equals(s))
{
if (quantityOfBook <= 4)
{
discount = ("0");
BookInformation
.setText(array2DFromFile[x][0]
+ array2DFromFile[x][1] +
array2DFromFile[x][2] + " "
+ quantityOfBook + " "
+ discount + "% " +
array2DFromFile[x][2]);
}
else if (quantityOfBook >= 5
&& quantityOfBook <= 9)
{
discount = ("10");
BookInformation
.setText(array2DFromFile[x][0]
+ array2DFromFile[x][1] +
array2DFromFile[x][2] + " "
+ quantityOfBook + " "
+ discount + "% "
+ array2DFromFile[x][2]);
}
else if (quantityOfBook >= 10
&& quantityOfBook <= 14)
{
discount = ("15");
BookInformation
.setText(array2DFromFile[x][0]
+ array2DFromFile[x][1] +
array2DFromFile[x][2] + " "
+ quantityOfBook + " "
+ discount + "% "
+ array2DFromFile[x][2]);
}
else if (quantityOfBook >= 15)
{
discount = ("20");
BookInformation
.setText(array2DFromFile[x][0]
+ array2DFromFile[x][1] +
array2DFromFile[x][2] + " "
+ quantityOfBook + " "
+ discount + "% "
+ array2DFromFile[x][2]);
}
// Keeps track of how many items have been
// processed. Once the nth item has been
// processed some of the components become
// disabled
count1++;
if (count1 == numOfItems)
{
BookID.setEditable(false);
Quantity.setEditable(false);
lblQuantity.setVisible(false);
lblBookID.setVisible(false);
btnProcessItem.setText("Process Item");
btnProcessItem.setEnabled(false);
}
}
// If value is not found it will display the
// following message
else if (!list.contains(s))
{
/*
* This is where I have a problem. The message
* shows and when I click 'ok'
*
* the content is cleared from BookID and
* Quantity however
*
* the dialog message pane doesn't disappear. I
* need the code to allow the
*
* user to enter text to BookID and quantity and
* allow them to process
*
* the new ID they entered. I need to repeat
* this process everytime the user
*
* enters the wrong BookID, but it doesnt work.
* It stay stuck on
*
* with the message dialog.
*/
JOptionPane.showMessageDialog(frame, "BookID "
+ s + " does not exist.");
// System.out.println("Hola");
BookID.setText("");
Quantity.setText("");
// System.exit(0);
}
}
} //for loop ends
As you can see, it’s clearly inside the for loop. Just get it outside and your code will work fine. Please copy the code highlighted in bold text and paste it after the end of for loop.
There are other dependent classes like ReadFile, Summation etc which is missing in the question, otherwise I would have done it myself completely.
Hope you are satisfied with the solution, in case if you have any doubts, feel free to drop a comment. Thanks.
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.