3

我有我的商店类,其中我可以将商品添加到购物车,然后它将增加购物车商品编号和总金额。

我还有一个查看购物车按钮之类的东西,如果单击它,它将显示另一个框架,其中显示购物车中的物品。当我单击此购物车框架中的删除按钮时,我计划从前一框架中减少计数和总金额,但我在总价格所在的 jLabel 中使用的 setText 方法不起作用。

我从购物车框架中调用此方法,然后在我单击删除按钮时传递要删除的价格

public void updateTotalAmount(double deduct){
    System.out.println("updateTotalAmount - "+deduct);
    tAPriceL.setText(String.valueOf(deduct)); //Total amount price label
    cICountL.setText(String.valueOf(--cICount)); //cart item count label
}

system.out 行是唯一有效的语句,其余的则无效。

当我尝试像这样交换代码时。

public void updateTotalAmount(double deduct){
    tAPriceL.setText(String.valueOf(deduct)); //Total amount price label
    cICountL.setText(String.valueOf(--cICount)); //cart item count label
    System.out.println("updateTotalAmount - "+deduct);
}

system.out 现在不起作用,所以我猜 setText 部分有问题。

我无法弄清楚问题出在哪里。谁能帮我解决这个问题?

这是这个的摘要..对于主要商店类..示例我有 5000 件物品

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class NewClass extends JFrame implements ActionListener {

    JLabel tAPrice = new JLabel("5000");
    JButton viewcart = new JButton("view cart");

    public NewClass() {
        this.setLayout(new FlowLayout());
        add(tAPrice);
        add(viewcart);
        viewcart.addActionListener(this);
    }

    public static void main(String[] args) {
        NewClass n = new NewClass();
        n.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        n.setSize(1150, 730);
        n.setVisible(true);
    }

    public void update(double deduct) {
        System.out.println("updated");
        tAPrice.setText(String.valueOf(Double.parseDouble(tAPrice.getText())
            - deduct));
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == viewcart) {
            Cart2 c = new Cart2();
            c.setVisible(true);
            c.setSize(250, 230);
        }
    }
}

对于购物车类...例如,我想从总金额中删除 1000

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Cart2 extends JFrame implements ActionListener {

    JButton remove = new JButton("remove");

    public Cart2() {
        add(remove);
        remove.addActionListener(this);
    }

    public static void main(String[] args) {
        Cart2 r = new Cart2();
        r.setVisible(true);
        r.setSize(250, 230);
        r.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == remove) {
            NewClass nc = new NewClass();
            nc.update(1000);
        }
    }
}
4

4 回答 4

4

Cart2.actionPerformed()您分配 newNewClass()而不是使用NewClass. 尝试将实例传递NewClassCart2构造函数。

例如:

public class Cart2 extends JFrame implements ActionListener {
    JButton remove = new JButton("remove");
    NewClass newClass;

    public Cart2(NewClass newClass) {
        this.newClass = newClass;
        add(remove);

        remove.addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == remove) {
            // NewClass nc = new NewClass();
            newClass.update(1000);
        }
    }

}

然后在NewClass

@Override
public void actionPerformed(ActionEvent e) {
    if (e.getSource() == viewcart) {
        Cart2 c = new Cart2(this);
        c.setVisible(true);
        c.setSize(250, 230);
    }
}
于 2012-10-24T07:31:29.057 回答
3
  • 不要使用两个或更多JFrames,而不是在运行时,这是通往麻烦的道路

  • 这是CardLayout的工作

  • 把每一个都JComponents放在JPanel,那些JPanels放在Cards

  • (也许)然后只放置一个JButton用于整个 GUI

于 2012-10-24T07:37:45.980 回答
2

虽然可能不是最好的,但这可能会让人们陷入困境,并且是调试的早期测试:

tAPriceL.paintImmediately(tAPriceL.getVisibleRect());
cICountL.paintImmediately(cICountL.getVisibleRect());

编辑:留下这个,但在这种情况下不是解决方法。

于 2012-10-24T07:23:34.240 回答
2

那只是因为您没有更新正确的 NewClass 实例......在 Cart2 actionPerformed 中,您创建了一个新的 NewClass 实例并更新它。

您必须保留对 NewClass 框架实例的引用才能对其进行更新。

于 2012-10-24T07:32:18.950 回答