Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使actionListener方法成为动态的_Java_Swing - Fatal编程技术网

Java 如何使actionListener方法成为动态的

Java 如何使actionListener方法成为动态的,java,swing,Java,Swing,我有一个收款系统,我希望在GUI的一侧向我的订单表JTable添加项目。我还希望在单击每个JButton时获得订单的运行总数。但我的问题是,我似乎无法使侦听器方法对每个JButton都具有足够的动态性,以便根据订单上添加或删除的项目来更新总数。当在JTextField中按下时,它会对每个项目进行合计,但不会将其四舍五入到正确的小数位数,即2。我尝试过使用DecimalFormat,但没有成功。下面是我的一个侦听器方法。如果我能让这个方法正常工作并使其动态化,我就可以将同样的原理应用到其余的侦听器

我有一个收款系统,我希望在GUI的一侧向我的订单表JTable添加项目。我还希望在单击每个JButton时获得订单的运行总数。但我的问题是,我似乎无法使侦听器方法对每个JButton都具有足够的动态性,以便根据订单上添加或删除的项目来更新总数。当在JTextField中按下时,它会对每个项目进行合计,但不会将其四舍五入到正确的小数位数,即2。我尝试过使用DecimalFormat,但没有成功。下面是我的一个侦听器方法。如果我能让这个方法正常工作并使其动态化,我就可以将同样的原理应用到其余的侦听器方法中。如果有人能给我指出正确的方向,我将非常感激,谢谢

// Small Americano ActionListener
        americanoSmall.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {
                    String query = "select ProductName, Price from product where ProductID = 24";
                    java.sql.PreparedStatement pst = connection.prepareStatement(query);
                    ResultSet rs = pst.executeQuery();

                    // Loop through the ResultSet and transfer in the Model
                    java.sql.ResultSetMetaData rsmd = rs.getMetaData();
                    int colNo = rsmd.getColumnCount();
                    while (rs.next()) {
                        Object[] objects = new Object[colNo];

                        for (int i = 0; i < colNo; i++) {
                            objects[i] = rs.getObject(i + 1);
                        }
                        DefaultTableModel model = (DefaultTableModel) table.getModel();
                        model.addRow(objects);
                        Stock s = new Stock();
                        total = total + s.getItemPrice(24);
                        totalTF.setText(String.valueOf(total));
                        totalTF.setText(String.format("%.2f", total));

                    }
                    TableModel model = (DefaultTableModel) table.getModel();
                    table.setModel(model);
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            }
        });
我还希望它具有足够的动态性,这样,如果订单被编辑,即:从列表中删除某些内容,则总数将相应地更新

将TableModelListener添加到TableModel。更改数据或添加或删除行时将生成一个事件。然后您只需迭代模型中的数据以重新计算总数


不要试图保持一个运行的总计,因为当您删除一行时,您不知道从总计中删除多少。

考虑到这一点,总计反映了TableModel中的信息,因此在更新数据库时,不要尝试更新计数,更改表格模型时更新理货-这提供了职责分离,并将理货的更新与数据库分开,使其更灵活、更易于测试。我曾尝试使用DecimalFormat,但它不起作用-它怎么不起作用?投入是什么,产出是什么,与预期结果有什么不同?你是怎么用的?在处理货币时,最好使用BigDecimal或long,但这可能超出了分配的范围。我尝试了以下方法:DecimalFormat df=new DecimalFormat.00;totalTF.setTextDouble.toStringdf.formattotal;好吧,`totalTF.setTextDouble.toStringdf.formattotal`是错误的,setText需要一个字符串,df.format返回的是符合您需要的total format的字符串表示形式,但是由于一些未知的原因,您将其转换回某种Double。因此,我正在尝试合计添加到orderlist(JTable)中的项。这些订单项在名为TotalTF的JTextfield中设置。然后,我想把这张清单上的项目加起来,并计算出变化。有一个JTextfield用于表示投标金额和变更。我只想根据从表传递到totalTF的值来计算订单的价格。我还希望它具有足够的动态性,以便在编辑订单时,即:从列表中删除某些内容,则总订单会相应地更新。然后单击“付款”完成订单。你明白了吗?我曾尝试实现tableModelListener,但它对我根本不起作用。我想这是因为我的代码有点扭曲。有谁能帮助我,因为我已经被困在这个问题上好几天了。我不是要别人帮我做这件事。我将用我一直在尝试的内容重新编辑代码。