4

ユーザーがJButtonをクリックしたときに、関数がJList内の選択された項目と、JTextField内の値を渡す関数を実装しています。

私はいくつかのリスナーを使用しています。ただし、ユーザーがボタンを2回押すと、addcartbtn内で実行されるループactionPerformedが2回呼び出され、望ましくない結果が生成されるようです。ユーザーが3回押すと、関数は3回呼び出されたように見えます。

   list.addListSelectionListener(new ListSelectionListener() {

        Map<String, Integer> cartlist = new HashMap<String, Integer>();

        public void valueChanged(final ListSelectionEvent e) {
            if (e.getValueIsAdjusting()) {
                System.out.println("test0");
                final ArrayList<String> cartArrayList = new ArrayList<String>();
                addcartbtn.addActionListener(new ActionListener() {

                    public void actionPerformed(final ActionEvent e2) {

                        System.out.println("test2");
                        String itemselected = "";
                        System.out.println("Index is " + e.getLastIndex());
                        String itemname = (String) hashmap.get(e.getLastIndex());
                        itemselected = itemname;

                        //System.out.println(itemselected);
                        try {
                            int insertedquantity = Integer.parseInt(quantity.getText());
                            cartlist.put(itemselected, insertedquantity);
                            //shoppingcart.revalidate();
                            String element = itemselected + " " + String.valueOf(insertedquantity);

                            cartArrayList.add(element);

                            System.out.println(element);
                            //System.out.println(counter);
                            shoppingcart.setListData(cartArrayList.toArray());
                            shoppingcart.revalidate();
                            shoppingcart.repaint();
                            System.out.println("---------");

                        } catch (NumberFormatException ex) {
                            System.out.println("Not a number!");
                        }
                    }
                });
            }
        }
    });

助けてくれてありがとう!

4

2 に答える 2

3

ListSelectionListener内にActionListenerを追加しないでください-意味がありません。目的もなく、多くのリスナーを追加することになります。実際、ボタンが押されたときにのみアクションを実行したい場合は、ListSelectionListenerの理由はまったくわかりません。JButtonに一度追加されたActionListenerを、おそらくコンストラクターまたはセットアップメソッドで使用するだけです。

また、インデントを少し少なくすると、コードが読みやすくなる場合があります。
編集:元の投稿のコードのインデントを減らしました。

于 2012-05-12T10:10:20.180 に答える
3

JListで選択が行われるたびに、新しいアクションリスナーをaddcartbtnに追加します(addCartButton、BTWという名前の場合ははるかに読みやすくなります)。リスナーは一度だけ追加する必要があります。

于 2012-05-12T10:11:01.997 に答える