- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个使用 JTable 的简单 Java 应用程序。我正在尝试实现我所看到的here 。给定链接上的表格的行为与我在表格中想要的行为完全相同。我已完全按照引用链接上显示的方式进行操作。 但是,当我运行应用程序时,我无法编辑第三列和最后一列。我想要的行为是,当用户在填写表格中的最后一列后按 Enter 键时,应用程序应添加一个空行。
这是我的第一个类,实体类:
public class Product {
String productDescription;
String productCode;
double productPrice;
//dummy properties
int productQuantity;
double productTotalAmount;
public Product() {
this.productDescription = "";
this.productCode = "";
this.productPrice = 0;
this.productTotalAmount = 0;
this.productQuantity = 0;
}
public int getProductQuantity() {
return productQuantity;
}
public void setProductQuantity(int productQuantity) {
this.productQuantity = productQuantity;
}
public double getProductTotalAmount() {
return productTotalAmount;
}
public void setProductTotalAmount(double productTotalAmount) {
this.productTotalAmount = productTotalAmount;
}
public String getProductDescription() {
return productDescription;
}
public void setProductDescription(String productDescription) {
this.productDescription = productDescription;
}
public String getProductCode() {
return productCode;
}
public void setProductCode(String productCode) {
this.productCode = productCode;
}
public double getProductPrice() {
return productPrice;
}
public void setProductPrice(double productPrice) {
this.productPrice = productPrice;
}}
这是我的第二堂课, table 模型:
public class InteractiveTableModel extends AbstractTableModel{
// indexes
public static final int PRODUCT_DESCRIPTION_INDEX = 0;
public static final int PRODUCT_CODE_INDEX = 1;
public static final int PRODUCT_PRICE_INDEX = 2;
public static final int PRODUCT_QUANTITY_INDEX=3;
public static final int PRODUCT_TOTAL_AMOUNT_INDEX=4;
public static final int HIDDEN_INDEX = 5;
protected String [] columnNames;
protected Vector dataVector;
//this constructor is responsible for initializing the columnmanes and the data of the table.
public InteractiveTableModel(String[] columnNames) {
this.columnNames = columnNames;
dataVector = new Vector();
}
@Override
//this method returns the name of the column corresponding to the passed integer.
public String getColumnName(int column) {
return columnNames[column];
}
//this method is used to determine whether a cell is editable
//this is for manuvouring to the next editable cell
@Override
public boolean isCellEditable(int row, int column) {
if (column == HIDDEN_INDEX) return false;
else return true;
}
@Override
public Class getColumnClass(int column) {// returns a class representing the datatype of the data stored in that column
switch (column) {
case PRODUCT_DESCRIPTION_INDEX:
case PRODUCT_CODE_INDEX:
return String.class;
case PRODUCT_QUANTITY_INDEX:
return Integer.class;
case PRODUCT_PRICE_INDEX:
case PRODUCT_TOTAL_AMOUNT_INDEX:
return double.class;
default:
return Object.class;
}
}
@Override
public int getRowCount() {
return dataVector.size();
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public Object getValueAt(int row, int column) {
Product record = (Product)dataVector.get(row);//this will return a row in a vector
//this is cast to AudioRecord so that we can extract the data that we want correspoinding to column number
switch (column) {
case PRODUCT_DESCRIPTION_INDEX:
return record.getProductDescription();
case PRODUCT_CODE_INDEX:
return record.getProductCode();
case PRODUCT_PRICE_INDEX:
return record.getProductPrice();
case PRODUCT_TOTAL_AMOUNT_INDEX:
return record.getProductTotalAmount();
case PRODUCT_QUANTITY_INDEX:
return record.getProductQuantity();
default:
return new Object();
}
}
//setting data in a cell
@Override
public void setValueAt(Object value, int row, int column) {
Product record = (Product)dataVector.get(row);
switch (column) {
case PRODUCT_DESCRIPTION_INDEX:
record.setProductDescription((String)value);
break;
case PRODUCT_CODE_INDEX:
record.setProductCode((String)value);
break;
case PRODUCT_PRICE_INDEX:
record.setProductPrice((Double)value);
break;
case PRODUCT_QUANTITY_INDEX:
record.setProductQuantity((Integer)value);
break;
case PRODUCT_TOTAL_AMOUNT_INDEX:
record.setProductTotalAmount((Double)value);
break;
default:
System.out.println("invalid index");
}
fireTableCellUpdated(row, column);//this is for updating the cell
}
public boolean hasEmptyRow() {
if (dataVector.isEmpty()) return false;
Product productRecord = (Product)dataVector.get(dataVector.size() - 1);
if (productRecord.getProductDescription().trim().equals("") &&
productRecord.getProductCode().trim().equals("") &&
(productRecord.getProductPrice()!=1 &&
productRecord.getProductQuantity()!=1 &&
productRecord.getProductTotalAmount()!=1))
{
return true;
}
else return false;
}
public void addEmptyRow() {
dataVector.add(new Product());
fireTableRowsInserted(
dataVector.size() - 1,
dataVector.size() - 1);
}}
最后一个类如下:
public final class InteractiveForm extends JPanel {
public static final String[] columnNames = {
"Quantity", "Product Code", "Product Description", "Product Price","Product Quantity",""
};
protected JTable table;
protected JScrollPane scroller;
protected InteractiveTableModel tableModel;
public InteractiveForm() {
initComponent();
}
public void initComponent() {
tableModel = new InteractiveTableModel(columnNames);
tableModel.addTableModelListener(new InteractiveForm.InteractiveTableModelListener());
table = new JTable();
table.setModel(tableModel);
table.setSurrendersFocusOnKeystroke(true);
if (!tableModel.hasEmptyRow()) {
tableModel.addEmptyRow();
}
scroller = new javax.swing.JScrollPane(table);
table.setPreferredScrollableViewportSize(new java.awt.Dimension(500, 300));
TableColumn hidden = table.getColumnModel().getColumn(InteractiveTableModel.HIDDEN_INDEX);
hidden.setMinWidth(2);
hidden.setPreferredWidth(2);
hidden.setMaxWidth(2);
hidden.setCellRenderer(new InteractiveRenderer(InteractiveTableModel.HIDDEN_INDEX));
setLayout(new BorderLayout());
add(scroller, BorderLayout.CENTER);
}
public void highlightLastRow(int row) {
int lastrow = tableModel.getRowCount();//return the number of rows - last row
if (row == lastrow - 1) {
table.setRowSelectionInterval(lastrow - 1, lastrow - 1);
} else {
table.setRowSelectionInterval(row + 1, row + 1);
}
table.setColumnSelectionInterval(0, 0);//setting it to the first column
}
class InteractiveRenderer extends DefaultTableCellRenderer {
protected int interactiveColumn;
public InteractiveRenderer(int interactiveColumn) {
this.interactiveColumn = interactiveColumn;
}
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column)
{
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (column == interactiveColumn && hasFocus) {
if ((InteractiveForm.this.tableModel.getRowCount() - 1) == row &&
!InteractiveForm.this.tableModel.hasEmptyRow())
{
InteractiveForm.this.tableModel.addEmptyRow();//this is where we append a new row
}
highlightLastRow(row);//making it get focus and highlighted
}
return c;//returning the component
}
}
public class InteractiveTableModelListener implements TableModelListener {
@Override
public void tableChanged(TableModelEvent evt) {
if (evt.getType() == TableModelEvent.UPDATE) {
int column = evt.getColumn();
int row = evt.getFirstRow();
System.out.println("row: " + row + " column: " + column);
table.setColumnSelectionInterval(column + 1, column + 1);
table.setRowSelectionInterval(row, row);
}
}
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
JFrame frame = new JFrame("Interactive Form");
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent evt) {
System.exit(0);
}
});
frame.getContentPane().add(new InteractiveForm());
frame.pack();
frame.setVisible(true);
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException | HeadlessException e) {
}
}}
我与上面链接上的表格的唯一区别是添加了我自己的变量,这不应该使它不起作用。这里的逻辑正在逃避我。
如何使我的表的行为与 this one 相同?
最佳答案
您正在设置空值。它适用于 Double.class 而不是 double.class。
public class Product {
String productDescription;
String productCode;
Double productPrice;
//dummy properties
Double productQuantity;
Double productTotalAmount;
..
@Override
public Class getColumnClass(int column) {// returns a class representing the datatype of the data stored in that column
switch (column) {
case PRODUCT_DESCRIPTION_INDEX:
case PRODUCT_CODE_INDEX:
return String.class;
case PRODUCT_QUANTITY_INDEX:
case PRODUCT_PRICE_INDEX:
case PRODUCT_TOTAL_AMOUNT_INDEX:
return Double.class;
default:
return Object.class;
}
}
...
更新与装箱/拆箱有关的东西。我知道该找谁来解决,但我仍然不知道真正的原因。
关于java - 交互式 JTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28040057/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!