Java 用于更新JTable和递增焦点中给定单元格/列的侦听器类型
我试图使用一个预定义了第一列的JTable。用户仅在第二列输入数据(数量)。然后我通过乘以服务和数量列来计算最终收入,并将其显示在第三列收入中 |Service | Quantity | Income |$40.00 | X | |$40.00 | 3 | 120 |服务|数量|收入 |$40.00 | X | |$40.00 | 3 | 120 在这里,用户输入“3”,因为她今天以每人40美元的价格执行了X服务的“3”。用户只能更新“数量”列。收入栏将由系统计算 我应该使用哪种类型的侦听器?我使用的是一个Java 用于更新JTable和递增焦点中给定单元格/列的侦听器类型,java,swing,jtable,listeners,Java,Swing,Jtable,Listeners,我试图使用一个预定义了第一列的JTable。用户仅在第二列输入数据(数量)。然后我通过乘以服务和数量列来计算最终收入,并将其显示在第三列收入中 |Service | Quantity | Income |$40.00 | X | |$40.00 | 3 | 120 |服务|数量|收入 |$40.00 | X | |$40.00 | 3 | 120 在这里,用户输入“3”,因为她今天以每人40美元的价格执行了X服务的“3”。用户只能更新“数量”列
TableModelListener
,但当我想通过调用setValue=$120
将Income更新为120时,它会触发一个TableListenerEvent
,从而产生一个无限循环
我应该使用ActionEvent
、columnlister
还是其他什么
此外,我希望“焦点”向下递增行,始终保持在第二列(用户编辑的列)。对于列表,您必须实现对TableCell的更改,例如
import java.awt.event.KeyEvent;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class TableProcessing extends JFrame {
private static final long serialVersionUID = 1L;
private JTable table;
private String[] columnNames = {"Item", "Quantity", "Price", "Cost"};
private Object[][] data = {
{"Bread", new Integer(1), new Double(1.11), new Double(1.11)},
{"Milk", new Integer(1), new Double(2.22), new Double(2.22)},
{"Tea", new Integer(1), new Double(3.33), new Double(3.33)},
{"Cofee", new Integer(1), new Double(4.44), new Double(4.44)}};
private TableModelListener tableModelListener;
public TableProcessing() {
DefaultTableModel model = new DefaultTableModel(data, columnNames);
table = new JTable(model) {
private static final long serialVersionUID = 1L;
@Override// Returning the Class of each column will allow different renderers
public Class getColumnClass(int column) { // to be used based on Class
return getValueAt(0, column).getClass();
}
@Override // The Cost is not editable
public boolean isCellEditable(int row, int column) {
int modelColumn = convertColumnIndexToModel(column);
return (modelColumn == 3) ? false : true;
}
};
table.setPreferredScrollableViewportSize(table.getPreferredSize());
//http://stackoverflow.com/questions/7188179/jtable-focus-query/7193023#7193023
table.setCellSelectionEnabled(true);
KeyStroke tab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);
InputMap map = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
map.put(tab, "selectNextRowCell");
//http://stackoverflow.com/questions/7188179/jtable-focus-query/7193023#7193023
JScrollPane scrollPane = new JScrollPane(table);
getContentPane().add(scrollPane);
setTableModelListener();
}
private void setTableModelListener() {
tableModelListener = new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
if (e.getType() == TableModelEvent.UPDATE) {
System.out.println("Cell " + e.getFirstRow() + ", "
+ e.getColumn() + " changed. The new value: "
+ table.getModel().getValueAt(e.getFirstRow(),
e.getColumn()));
int row = e.getFirstRow();
int column = e.getColumn();
if (column == 1 || column == 2) {
TableModel model = table.getModel();
int quantity = ((Integer) model.getValueAt(row, 1)).intValue();
double price = ((Double) model.getValueAt(row, 2)).doubleValue();
Double value = new Double(quantity * price);
model.setValueAt(value, row, 3);
}
}
}
};
table.getModel().addTableModelListener(tableModelListener);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TableProcessing frame = new TableProcessing();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
+1用于覆盖
isCellEditable()
;另请参见关于选项卡方向的内容。谢谢,代码已更新,但现在我看到了@camickr:-)的实际需求,我明白您的观点。@camickr的两篇文章都有很好的链接,这对读者来说是一个很好的练习。