- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个自定义 POS 系统,并允许用户直接更改 table 上的数量,而不是生成一个对话框。这是表的第一行,其中包含虚拟数据。 (我还没有将它链接到数据库。)
Price 和 Amt 都有自定义单元格渲染器(不是任何人都可以知道,因为它们渲染不正确)来显示货币格式。编辑:我取消了自定义编辑器 (不是渲染器,谢谢)并且下面的问题仍然存在
计划是,当用户在数量框中输入数量时,它将更新 amt 单元格(以及屏幕顶部的运行总计)。为此,我创建了一个 validator ,该 validator 将验证数据是否为整数,并将其附加到自定义单元格编辑器,该编辑器仅将 validator 添加到 JTextField。
我的 validator 嵌套在屏幕本身内,因此它可以访问屏幕的字段和表本身。我想将其放入表格模型中,但我发现我无法分辨用户选择了哪个单元格。 (Verify() 有效,所以我省略了)
class QtyVerifier extends InputVerifier
{
private int qty = 0;
private BigDecimal pricePerUnit;
private BigDecimal prevamt;
@Override
public boolean shouldYieldFocus(JComponent input)
{
//reset quantity
this.qty = 0;
//verify the results
boolean ok2go = this.verify(input);
if (ok2go)
{
//grab all the current values
this.qty = new Integer(
(String)salesOrderFormTable.getValueAt(rowselected, colselected));
this.pricePerUnit = new BigDecimal(
(String)salesOrderFormTable.getValueAt(rowselected, colselected));
this.prevamt = new BigDecimal(
(String)salesOrderFormTable.getValueAt(rowselected, colselected));
//remove previous amount from the total
addLineCostToRunningTotal(this.prevamt.negate());
//update sales order total
addLineCostToRunningTotal(amt);
//update line total cell
salesOrderFormTable.setValueAt(actualTotal, rowselected, 6);
salesOrderFormTable.validate();
}
else { ... }
return ok2go;
}
....
};
这就是事情变得非常奇怪的地方。我告诉 qty,数量仍然是 1。它从单元格中提取所有正确的数据。
Selected: 0,1
Quantity in cell 0,1 is 1
Line price is 1.0
Previous amt is 1.0
New amt is 1.0
好的,很好。所以我将值更改为 5 并按 Enter 键。 它将值更改为 25(解决了此问题),并且还从单元格中提取了错误的数据。
Quantity in cell 0,1 is 5 //this is correct
Line price is 5.0 //this is incorrect. It should be 1.
Previous amt is 5.0 //also incorrect. This also should be 1.
New amt is 25.0 //this WOULD be correct if the previous data was.
我的 table 怎么了?!为什么这会在两个单元格中给我完全错误的信息并将数量单元格更改为我没有输入的内容?有没有更简单的方法来做到这一点(有或没有验证者)?我不能在订单上出现错误的成本。我考虑过将所有值从 double 更改为 BigDecimals 以防止舍入错误,但这甚至不是舍入错误。这完全是错误的。我现在完全迷失了。
最佳答案
鉴于您的代码是高度定制的,并且如果不将所有部分放在一起就很难调试,我会从头开始吸引基本概念,并说使用 TableModel 可以满足这些要求:
qty
上的amt
列或price
列更新:这也可以通过表模型来完成,只需覆盖setValueAt(...)正确。price
和 amt
列:这可以通过提供自定义渲染器(而非编辑器)来完成。由于没有有关您的表型号的信息,我将使用 DefaultTableModel 说明上述要点,如下所示:
String[] header = new String[] { "qty", "price", "amt" };
DefaultTableModel model = new DefaultTableModel(header, 1) {
@Override
public Class<?> getColumnClass(int columnIndex) {
switch (columnIndex) {
case 0: return Integer.class;
case 1:
case 2: return Double.class;
}
throw new ArrayIndexOutOfBoundsException(columnIndex);
}
@Override
public boolean isCellEditable(int row, int column) {
return column < 2;
}
@Override
public void setValueAt(Object aValue, int row, int column) {
super.setValueAt(aValue, row, column);
if (column < 2) {
Integer qty = (Integer)getValueAt(row, 0);
Double price = (Double)getValueAt(row, 1);
Double amt = (qty != null && price != null)
? (Double)(qty * price)
: null;
super.setValueAt(amt, row, 2);
}
}
};
有关示例的一些注释:
qty
、price
和 amt
。qty
和 price
列可编辑,而 amt
不可编辑(在其他列更新时计算)。getColumnClass()
实现,默认编辑器不允许任何数字列的无效输入:无论列类是 Integer,它都只允许整数值。这同样适用于 Double 类。qty
或price
列被修改,则调用setValueAt(...)
并amt
专栏也相应更新。最后,为了在渲染单元格(未编辑)时应用货币格式,我们需要提供一个自定义渲染器。例如:
class CurrencyRenderer extends DefaultTableCellRenderer {
private final NumberFormat currencyFormat;
public CurrencyRenderer() {
currencyFormat = NumberFormat.getCurrencyInstance();
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component renderer = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (value instanceof Number) {
setText(currencyFormat.format((Number)value));
}
return renderer;
}
}
现在,有不同的方法来提供渲染器,所有解释都在这里:Concepts: Editors and Renderers
关于java - JTable 上的自定义单元格返回错误值(并且无法正确显示),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27301223/
我已经多次看到我的问题被问到,但我从未看到我期望的答案。我已经在 JTable 中输入了数据库的元素,并且我希望能够通过一些 JButtons 删除/添加元素。问题是当我添加/删除时,修改在数据库
我正在使用 JTable 做一个项目,我想让我的表格单元格可编辑。我用过, public boolean isCellEditable(int row, int column) {
我正在编写一个应用程序包,其中包含一个主类,其中主方法与GUI类分开,GUI类包含一个带有jtabbedpane的jframe,它有两个选项卡,第一个选项卡包含一个jtable,称为jtable1,第
我制作了一个表格来将 Arraylist 中的数据加粗,但如果我删除该数据,我会希望该表格更新并取消对 Arraylist 中加粗的单元格的粗体显示。我该怎么做呢?或从另一个类关闭该类的实例 最佳答案
如果我的 JTable 的列未按字母顺序排列,我可以使用 getSelectedRows() 并毫无问题地获取它们的行的值。但是,如果用户单击列名并且行在该列中按字母顺序排列,则 getSelecte
我有一个 JTable,用户可以在其中在单元格中输入数据。然后有一个“保存”按钮,用于收集表格数据,将其格式化为 csv,并将其保存到文件中。 但是,如果用户将最后编辑的单元格保留在选定状态,并单击“
我编写了下面的代码,以便在当前 JTable 上进行选择时创建一个新的 JTable: makeTbale.addActionListener(new ActionListener() { pub
我正在使用 Swing 编写 Java 应用程序。我有两个表,我必须将内容从一个表复制到另一个表(复制)。问题是,如果我清除目标表行,那么我的源表行也会被删除。 如果我按 CopyAll,那么我会将
我一直致力于JTable,我的项目: 从数据库读取数据(我完成了这个任务并能够在JTable中显示)。 然后将数据按子组显示并保存到文件(文本/Excel)中。 我有 JTable 的基本知识,并且使
我有以下类(class): public class customer_master extends javax.swing.JInternalFrame { Connection con =
您好,我是 JAVA 的新手,在学习时正在开发 GUI。我创建了一个带有 ScrollPane 和 JTable 的 JFrame。当我增加 2 列以上时,第一行下方的数据不会显示。 此外,当我的 J
我正在进行项目的最后一部分,这是我遇到的最后问题之一。这部分用于编辑预订,即更改为特定预订预订的房间。我有 2 个 JTable,其中一个有可用房间,另一个有已预订的房间。两者都有单独的 Defaul
我有 2 个 JTable,我需要从表 2 中复制特定列(包括该列中的所有数据)并将其添加到表 1 中的下一个空闲列中。有人知道执行此操作的最佳方法吗? 谢谢 最佳答案 DefaultTableMod
美好的一天!我在 Jtable 方面遇到了困难。我已经阅读和浏览了各种教程,但我不太明白它的要点。我的问题是,我必须从 jtable (jTable1) 中选择包含 (ClientID、LastNam
我的 SERVER 表单上有一个 JTable,它是从 MySQL 数据库填充的,在构造函数中编码: String sql = "SELECT * from fiekorari"; t
我在我的项目上工作,我需要将一行从 JTable 复制到另一个 JTable,第二个 JTable 应该只是单行表。我为第一个 JTable 创建了 mouselistener,双击它应该复制行并将其
我有这段代码可以完全按预期工作 package com.grantbroadwater.signInAssistant.view; import java.awt.BorderLayout; impo
我有一个列表人员(在 jTable 中)并想将其导出到 excel 文件我需要每个人转到单独的工作表所以我需要拆分原始 jTable,但我不知道如何? 这就是我想做的? public void exp
我有一个包含 7 列和 2 行的 JTable。在我的 JTable 下方,我有一个 JTextField。当我在 JTextField 中输入内容时,我可以很容易地得到我输入的内容:String l
我正在尝试将一个 JTable 嵌套在另一个 JTable 的列中(使用 CellRenderer)。 示例(错误)输出: 为什么下面的例子没有输出表中表? import java.awt.Compo
我是一名优秀的程序员,十分优秀!