所以我想创建一个零售GUI。员工选择部门,输入项目名称,价格和折扣。他应该能够输入多个项目的数据,然后应该能够打印并且应该出现Jtable。我遇到的问题是编写代码以便能够为他输入的每个项目更新arraylist。我似乎每次都覆盖位置[0]并且它不存储新项目。我也不知道从哪里开始Jtable。我是Java的新手,所以非常感谢你给予的任何帮助。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class RetailGUI extends JFrame
{
// The following variables will reference the
// custom panel objects.
private DepartmentPanel department;
private ItemPanel item;
private PricePanel price;
private TitlePanel title; // To display a greeting
// The following variables will reference objects
// needed to add Next and Exit buttons.
private JPanel buttonPanel; // To hold the buttons
private JButton nextButton,
printButton,
exitButton; // To exit the application
/**
* Constructor
*/
public RetailGUI()
{
// Display a title.
super("Retail Calculator");
setSize(600, 250);
// Specify an action for the close button.
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
// Create a BorderLayout manager for
// the content pane.
setLayout(new BorderLayout());
// Create the custom panels.
title = new TitlePanel();
department = new DepartmentPanel();
item = new ItemPanel();
price = new PricePanel();
// Call the buildButtonPanel method to
// create the button panel.
buildButtonPanel();
// Add the components to the content pane.
add(title, BorderLayout.NORTH);
add(department, BorderLayout.WEST);
add(item, BorderLayout.CENTER);
add(price, BorderLayout.EAST);
add(buttonPanel, BorderLayout.SOUTH);
// Pack the contents of the window and display it.
//pack();
setVisible(true);
}
/**
* The buildButtonPanel method builds the button panel.
*/
private void buildButtonPanel()
{
// Create a panel for the buttons.
buttonPanel = new JPanel();
// Create the buttons.
nextButton = new JButton("Next");
printButton = new JButton("Print");
exitButton = new JButton("Exit");
// Register the action listeners.
nextButton.addActionListener(new RetailGUI.NextButtonListener());
printButton.addActionListener(new RetailGUI.PrintButtonListener());
exitButton.addActionListener(new RetailGUI.ExitButtonListener());
// Add the buttons to the button panel.
buttonPanel.add(nextButton);
buttonPanel.add(printButton);
buttonPanel.add(exitButton);
}
/**
* Private inner class that handles the event when
* the user clicks the Next button.
*/
private class NextButtonListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String departmentName,
finalItem;
float priceField,
discountField,
newPrice;
ArrayList DepartmentList = new ArrayList();
ArrayList ItemList = new ArrayList();
ArrayList PriceList = new ArrayList();
ArrayList DiscountList = new ArrayList();
ArrayList NewPriceList = new ArrayList();
departmentName = department.getDepartmentName();
finalItem = item.getItemName();
priceField = price.getPriceField();
discountField = price.getDiscountField();
newPrice = priceField - (priceField * (discountField/100));
DepartmentList.add(departmentName);
System.out.print(DepartmentList);
JOptionPane.showMessageDialog(null,"Department: " + departmentName + "\n" +
"Item Name: " + finalItem + "\n" +
"Orginal Price: $" + priceField + "\n" +
"Discount: " + discountField + "%" + "\n" +
"New Price: $" + newPrice + "\n");
}
}
private class PrintButtonListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
}
}
private class ExitButtonListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
// Exit the application.
System.exit(0);
}
}
}
答案 0 :(得分:3)
您已在ArrayList
actionPerformed
方法的NextButtonListener
方法中声明了Transaction
。
这意味着每次单击按钮时,您都会创建全新的,短暂的,列表,将项目添加到其中,然后丢弃结果(允许垃圾收集器在将来的某个时间接收它们)。
您需要将这些列表移动到范围级别,以便应用程序的各个部分可以看到它们(可能是类级字段?)。
而不是使用多个数组列表,这些列表很容易让列表彼此不同步,创建某种包含与事务相关的所有信息的数据对象会更好。
让我们说一个TransactionItem
对象,其中包含departmentname
个。每个项目都包含itemName
,originalPrice
,discount
和Transaction
(新价格是计算字段,无需存储)
TransactionItem
将包含 N Transaction
。
每次点击,您都会获得当前的TransactionItem
对象,并根据用户输入的值为其添加新的Transaction
。
这将允许您为JTable
提供支持功能,例如事务的总值,例如
在开发{{1}}视图时,这将变得非常容易。