Java 通过JList调整价格

Java 通过JList调整价格,java,swing,jlist,Java,Swing,Jlist,因此,我将一个对象数组(来自枚举)添加到JList中。说Jlist有一个ListSelectionListener。Jlist是默认设置,因此您可以选择多个项目(虽然只有2个),我目前的设置是这样的(有括号,我刚刚删除了它们): 它不能准确地去除价格。它只是不断地添加,然后偶尔删除 主要问题是,ListSelectionListener不会向您提供有关某个项目是否已被选中的信息。这意味着您必须从值0开始,循环当前选定的项目,从头开始计算新的计数,例如 import java.awt.Border

因此,我将一个对象数组(来自枚举)添加到JList中。说Jlist有一个ListSelectionListener。Jlist是默认设置,因此您可以选择多个项目(虽然只有2个),我目前的设置是这样的(有括号,我刚刚删除了它们):


它不能准确地去除价格。它只是不断地添加,然后偶尔删除

主要问题是,
ListSelectionListener
不会向您提供有关某个项目是否已被选中的信息。这意味着您必须从值
0
开始,循环当前选定的项目,从头开始计算新的计数,例如

import java.awt.BorderLayout;
import java.io.IOException;
import java.text.NumberFormat;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class Test {

    enum Item {
        PEARS(100.0),
        APPLES(25.0),
        ICECREAME(225.30);

        private double price;

        private Item(double price) {        
            this.price = price;
        }

        public double getPrice() {
            return price;
        }

        @Override
        public String toString() {
            return name();
        }

    }

    public static void main(String[] args) throws IOException {
        new Test();
    }

    public Test() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JLabel tally = new JLabel("0");
                DefaultListModel<Item> model = new DefaultListModel<>();
                model.addElement(Item.PEARS);
                model.addElement(Item.APPLES);
                model.addElement(Item.ICECREAME);
                JList<Item> listOfItems = new JList<>(model);
                listOfItems.addListSelectionListener(new ListSelectionListener() {
                    @Override
                    public void valueChanged(ListSelectionEvent e) {
                        if (e.getValueIsAdjusting()) {
                            return;
                        }
                        double price = 0;
                        for (Item item : listOfItems.getSelectedValuesList()) {
                            price += item.getPrice();
                        }
                        tally.setText(NumberFormat.getCurrencyInstance().format(price));
                    }
                });

                JFrame frame = new JFrame("Test");
                frame.add(new JScrollPane(listOfItems));
                frame.add(tally, BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true); 
            }
        });
    }

}
导入java.awt.BorderLayout;
导入java.io.IOException;
导入java.text.NumberFormat;
导入javax.swing.DefaultListModel;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JList;
导入javax.swing.JScrollPane;
导入javax.swing.SwingUtilities;
导入javax.swing.event.ListSelectionEvent;
导入javax.swing.event.ListSelectionListener;
公开课考试{
枚举项{
梨(100.0),
苹果(25.0),
冰淇淋(225.30);
私人双价;
私人物品(双倍价格){
这个价格=价格;
}
公开双价{
退货价格;
}
@凌驾
公共字符串toString(){
返回名称();
}
}
公共静态void main(字符串[]args)引发IOException{
新测试();
}
公开考试(){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
JLabel Tall=新JLabel(“0”);
DefaultListModel=新的DefaultListModel();
模型.附录(项目.梨);
型号.附录(项目.苹果);
型号.添加剂(项目.冰淇淋);
JList listOfItems=新JList(型号);
addListSelectionListener(新建ListSelectionListener()){
@凌驾
public void值已更改(ListSelectionEvent e){
如果(如getValueIsAdjusting()){
回来
}
双倍价格=0;
对于(项:listOfItems.getSelectedValuesList()){
price+=item.getPrice();
}
tally.setText(NumberFormat.getCurrencyInstance().format(price));
}
});
JFrame=新JFrame(“测试”);
添加(新的JScrollPane(列表项));
框架。添加(理货、边界布局。南部);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
}
看到一些关于鼠标事件的信息,这是正确的解决方案吗


不,为什么?因为可以通过键盘或编程方式更改选择,否则(selectedObject==Enum.object1&&selectedObject==Enum.object2)是不可能的-您需要查看所有选定的items@MadProgrammer这有所帮助,但仍未解决。问题肯定出在减法部分。事实上,不是,而是从头开始。
ListSelectionListener
没有提供的一条信息是项目是否被选中以取消选中,因此您不能简单地“添加”或“减去”元素,您从
0
开始,循环所有选定的项目并将其添加到其价格中,以生成总计。我尝试使用循环,但它也不起作用。我看到了一些关于鼠标事件的信息,这是正确的解决方案吗?不能说是200智商天才。非常感谢。你是英雄,我现在明白了。
import java.awt.BorderLayout;
import java.io.IOException;
import java.text.NumberFormat;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class Test {

    enum Item {
        PEARS(100.0),
        APPLES(25.0),
        ICECREAME(225.30);

        private double price;

        private Item(double price) {        
            this.price = price;
        }

        public double getPrice() {
            return price;
        }

        @Override
        public String toString() {
            return name();
        }

    }

    public static void main(String[] args) throws IOException {
        new Test();
    }

    public Test() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JLabel tally = new JLabel("0");
                DefaultListModel<Item> model = new DefaultListModel<>();
                model.addElement(Item.PEARS);
                model.addElement(Item.APPLES);
                model.addElement(Item.ICECREAME);
                JList<Item> listOfItems = new JList<>(model);
                listOfItems.addListSelectionListener(new ListSelectionListener() {
                    @Override
                    public void valueChanged(ListSelectionEvent e) {
                        if (e.getValueIsAdjusting()) {
                            return;
                        }
                        double price = 0;
                        for (Item item : listOfItems.getSelectedValuesList()) {
                            price += item.getPrice();
                        }
                        tally.setText(NumberFormat.getCurrencyInstance().format(price));
                    }
                });

                JFrame frame = new JFrame("Test");
                frame.add(new JScrollPane(listOfItems));
                frame.add(tally, BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true); 
            }
        });
    }

}