1

好的。所以我正在编写一个杂货结帐系统代码,在框架的右侧,我正在显示一个带有标签的 Jpanel。每次单击“扫描”按钮时,我都会在 JPanel 中添加一个新标签,以便每次单击时都会显示输出。但是,我的窗口中只能容纳这么多条目,如何合并滚动条以便滚动浏览杂货?

我尝试输入带有 BorderLayout 和所有标签 CENTER 的滚动条 EAST,但是,每次我单击该按钮时,它只会在相同的确切位置重新打印它,而不是顶部/向下,以便我可以滚动。(请记住,这是一个非常粗略的草稿。一旦我了解了 GUI 的细节,我将在代码下方合并逻辑)

这是我的代码:

public class Checkout extends JFrame implements ActionListener
{
private int numOfItems = 21;
private Integer[] itemCode = new Integer[numOfItems];
private StringBuffer[] itemDesc = new StringBuffer[numOfItems];
private Double[] unitPrice = new Double[numOfItems];
private Integer[] taxCode = new Integer[numOfItems];
private Integer[] quantity = new Integer[numOfItems];
private Integer[] reorderLevel = new Integer[numOfItems];
private double subTotal, tax, grandTotal;

private JButton scan = new JButton("Scan");
private JButton pay = new JButton("Finish & Pay");
private JButton readFile = new JButton("Read from File");

private JTextField itemNumber = new JTextField(4);
private JTextField itemQuantity = new JTextField(4);

private JLabel displayReceipt = new JLabel();
private JPanel p4;

public Checkout()
{
    setValues();

    JPanel p2 = new JPanel(new FlowLayout());
    p2.add(scan);
    p2.add(pay);
    p2.add(readFile);

    JPanel p1 = new JPanel(new FlowLayout());
    p1.add(new JLabel("Item Number:"));
    p1.add(itemNumber);
    p1.add(new JLabel("Item Quantity:"));
    p1.add(itemQuantity);
    p1.setBorder(new TitledBorder("Scan Items First. Then Hit 'Finish and Pay'"));

    JPanel p3 = new JPanel(new BorderLayout(5, 5));
    p3.add(p1, BorderLayout.NORTH);
    p3.add(p2, BorderLayout.CENTER);

    p4 = new JPanel(new GridLayout(0, 1, 0, 0));
    JScrollPane scroll = new JScrollPane(p4);

    add(p3, BorderLayout.WEST);
    add(p4, BorderLayout.CENTER);

    scan.addActionListener(this);
    pay.addActionListener(this);
    readFile.addActionListener(this);
}

public void setValues()
{
    String[] tokens = new String[6];
    String[][] multi = new String[numOfItems][6];

    try{BufferedReader textReader = new BufferedReader(new FileReader("inventory.txt"));

    for(int i = 0; i < numOfItems; i++) // Split the file
    {
        tokens = textReader.readLine().split("\t");
        for(int j = 0; j < tokens.length; j++)
        {
            multi[i][j] = tokens[j];
        }
    }

    for(int i = 0; i < numOfItems; i++)
    {
        itemCode[i] = (Integer.parseInt(multi[i][0]));
        itemDesc[i] = new StringBuffer(multi[i][1]);
        unitPrice[i] = (Double.parseDouble(multi[i][2]));
        taxCode[i] = (Integer.parseInt(multi[i][3]));
        quantity[i] = (Integer.parseInt(multi[i][4]));
        reorderLevel[i] = (Integer.parseInt(multi[i][5]));
    }}
    catch(Exception e){}
}

public void setQuantity(int item, int itemCount)
{
    for(int i = 0; i < numOfItems; i++)
    {
        if(itemCode[i].equals(item))
        {
            quantity[i] = quantity[i] - itemCount;
            subTotal = itemCount * unitPrice[i];
            if(quantity[i] < reorderLevel[i])
                itemDesc[i] = itemDesc[i].append("**MARKED FOR REORDER**\t");
        }
    }
}

public String toString()
{
    System.out.println("CUST TICKET");

    //for(int i = 0; i < numOfItems; i++)
        //return (itemCode[i] + "\t" + itemDesc[i] + "\t" + unitPrice[i] + "\t" + taxCode[i] + "\t" + quantity[i] + "\t" + reorderLevel[i]);
    System.out.println("SUBTOTAL\t" + subTotal);
    System.out.println("TAX\t\t" + tax);
    System.out.println("GRAND TOTAL\t" + grandTotal);

    return "";
}

public static void main(String[] args) throws Exception
{
    Checkout frame = new Checkout(); // Frame layout
    frame.setSize(600, 135);
    frame.setTitle("Computer Science 202: Final Project - Supermarket Checkout System");
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

    /*Scanner input = new Scanner(System.in);
    System.out.print("Please enter item number: ");
        Integer itemNumber = Integer.parseInt(input.nextLine());
    System.out.print("Please enter quantity: ");
        Integer quantity = Integer.parseInt(input.nextLine());

    System.out.println(frame.stockCheck(itemNumber, quantity));*/
}

public void actionPerformed(ActionEvent e)
{
    if(e.getSource() == scan)
    {
        try
        {
            Integer quantityOrdered = 1;

            Integer item = Integer.parseInt(itemNumber.getText());
            quantityOrdered = Integer.parseInt(itemQuantity.getText());

            for(int i = 0; i < numOfItems; i++)
            {
                if(itemCode[i].equals(item))
                {
                    if(quantityOrdered > 1)
                    {
                        p4.add(new JLabel(itemDesc[i] + "" + unitPrice[i]));
                        p4.add(new JLabel(quantityOrdered + "  @  " + unitPrice[i]));
                        p4.revalidate();
                        p4.repaint();
                    }
                    else
                    {
                        p4.add(new JLabel(itemDesc[i] + "\t" + unitPrice[i]));
                        p4.revalidate();
                        p4.repaint();
                    }
                }
            }
            setQuantity(item, quantityOrdered);
        }
        catch(Exception ex){}   
    }

    else if(e.getSource() == pay)
    {
        displayReceipt.setText(toString());
    }

    else if(e.getSource() == readFile)
    {
        System.out.println("READ FILE");
    }
}
}
4

0 回答 0