我正在构建一个使用JTable和DefaultTableModel的Java桌面应用程序。
现在,我已经实现了这个表的KeyEventListener。因此,如果我尝试单击keyBoard的CANC按钮,我想删除所选行。但是有这种奇怪的行为。
这是我的第一张表:
现在我选择倒数第二行,然后按下键盘上的CANCEL按钮。这是结果
如您所见,删除倒数第二个ROW但不刷新JTable。
这是evetListener:
public class KeyListenerTableFattura extends KeyAdapter {
private JTable table2;
private MyTableModelFatturaManuale tableModel;
public KeyListenerTableFattura(JTable table2) {
this.table2 = table2;
this.tableModel = (MyTableModelFatturaManuale)table2.getModel();
}
public void keyReleased (KeyEvent ke) {
if (table2.getSelectedColumn() == 0) {
//tasto canc
if (ke.getKeyCode() == 127) {
try{
int riga= table.getSelectedRow();
ListSelectionModel selectionModel = table.getSelectionModel();
selectionModel.setSelectionInterval(0,0);
tableModel.rimuoviSpesa(riga);
}
catch(Exception e)
{
log.logStackTrace(e);
}
}
}
}
@SuppressWarnings("unused")
private void printIt(String title, KeyEvent keyEvent) {
}
}
这是TableModel
package com.mcsolution.commercialista.table.tableModel;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import com.mcsolution.commercialista.beans.FatturaRighe;
import com.mcsolution.common.supporto.VisualMessage;
public class MyTableModelFatturaManuale extends defaultTableModel{
/**
*
*/
private static final long serialVersionUID = -3163597322286902696L;
public List<FatturaRighe> v = new ArrayList<FatturaRighe>();
public static String[] ColName = {"Descrizione","Importo"};
private Double percEnpaCL=0.0,percIva=0.0,perRitenuta=0.0;
private Double imponibileIva =0.0,empaCL=0.0,iva=0.0,ritenutaAcconto=0.0,lordo=0.0,netto=0.0,
totale=0.0;
private int rigaParziale =7;
private int rigaEnpaCl =6;
private int rigaImponibileIva =5;
private int rigaIva =4;
private int rigaRitenuta =3;
private int rigaTotaleLordo =2;
private int rigaNetto =1;
private int rigaTotale =0;
public MyTableModelFatturaManuale() {
super(ColName,0);
}
@SuppressWarnings("rawtypes")
public void inserisciRigheFisse(){
this.addRow(new Vector());
super.setValueAt("PARZIALE", this.getRowCount()-1, 0);
super.setValueAt("0,00", this.getRowCount()-1, 1);
this.addRow(new Vector());
super.setValueAt("ENPACL 0 %", this.getRowCount()-1, 0);
super.setValueAt("0,00", this.getRowCount()-1, 1);
this.addRow(new Vector());
super.setValueAt("IMPONIBILE I.V.A.", this.getRowCount()-1, 0);
super.setValueAt("0,00", this.getRowCount()-1, 1);
this.addRow(new Vector());
super.setValueAt("I.V.A. 0 %", this.getRowCount()-1, 0);
super.setValueAt("0,00", this.getRowCount()-1, 1);
this.addRow(new Vector());
super.setValueAt("RIT.ACCONTO 0 %", this.getRowCount()-1, 0);
super.setValueAt("0,00", this.getRowCount()-1, 1);
this.addRow(new Vector());
super.setValueAt("TOTALE LORDO", this.getRowCount()-1, 0);
super.setValueAt("0,00", this.getRowCount()-1, 1);
this.addRow(new Vector());
super.setValueAt("NETTO", this.getRowCount()-1, 0);
super.setValueAt("0,00", this.getRowCount()-1, 1);
this.addRow(new Vector());
super.setValueAt("TOTALE", this.getRowCount()-1, 0);
super.setValueAt("0,00", this.getRowCount()-1, 1);
}
public void settaSpesa(FatturaRighe f){
this.v.add(f);
int riga = this.getRowCount()-1;
this.insertRow(riga, new Vector());
super.setValueAt(f.getDescrizione(), riga, 0);
super.setValueAt("0.00", riga, 1);
}
private Integer getCountSpeseTaxFree(){
int cont=0;
for (FatturaRighe object : this.v) {
if(!object.getSoggettoIVA())
cont++;
}
return cont;
}
public void settaEnpaCl(Double enpa){
this.percEnpaCL=enpa;
//modifico l'enpaCL
super.setValueAt("ENPACL "+this.percEnpaCL+" %", this.getRowCount()-1-rigaEnpaCl-getCountSpeseTaxFree(), 0);
calcolaTotale();
}
public void settaIva(Double iva){
this.percIva=iva;
//modifico l'enpaCL
super.setValueAt("I.V.A. "+this.percIva+" %", this.getRowCount()-1-rigaIva-getCountSpeseTaxFree(), 0);
calcolaTotale();
}
public void settaRitenuta(Double ritenuta){
this.perRitenuta=ritenuta;
//modifico l'enpaCL
super.setValueAt("RIT.ACCONTO "+this.perRitenuta+" %", this.getRowCount()-1-rigaIva-getCountSpeseTaxFree(), 0);
calcolaTotale();
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
//verifico quante solo le righe della tabella
int righeEsentiIva = getCountSpeseTaxFree();
int righeIva = this.v.size() - righeEsentiIva;
//se è l'ultima riga non si modifica
if(rowIndex == this.getRowCount()-1) //metto il meno uno perchè a contare si paprte dallo 0
return false;
else if(rowIndex < righeIva)
return true;
else if(rowIndex >= righeIva+7 && rowIndex < this.getRowCount())
return true;
return false;
}
public void inserisciRiga(){
FatturaRighe f = new FatturaRighe();
f.setImporto(0.00);
f.setSoggettoIVA(true);
this.v.add(0,f);
this.insertRow(0, new Vector());
super.setValueAt("", 0, 0);
super.setValueAt("0.00", 0, 1);
}
public void rimuoviRiga(){
//conto il numero di righe presenti
int righeEsistenti = this.v.size() - getCountSpeseTaxFree();
if(righeEsistenti >0){
this.v.remove(0);
this.removeRow(0);
calcolaTotale();
}
}
public void rimuoviSpesa(int nRiga){
//conto il numero di righe presenti
int righeIvaEsente = getCountSpeseTaxFree();
if(righeIvaEsente<=0)
return;
this.removeRow(nRiga);
//mi vado a calcolare nella lista dove si trova questa riga
int nPosizioneInLista = nRiga - 7;
this.v.remove(nPosizioneInLista);
calcolaTotale();
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
try{
//verifico se la riga è già esistente oppure va modificata
//altero il valore di rowIndex perchè ci sono le 6 righe fisse
int rigaIniziale = rowIndex;
if(rowIndex >7)
rowIndex = rowIndex-7;
FatturaRighe f = rowIndex< this.v.size() ? this.v.get(rowIndex) : null;
if(f==null){
f = new FatturaRighe();
f.setSoggettoIVA(true);
//mi calcolo quante spese ci sono
int spese = getCountSpeseTaxFree();
if(spese>0){
this.v.add(rowIndex-spese,f);
}else
this.v.add(f);
}
if(columnIndex==0){
//descrizion
f.setDescrizione(aValue.toString());
}else if(columnIndex==1){
//importo
try{
Double importo = Double.parseDouble(aValue.toString());
f.setImporto(importo);
}catch(Exception e){
VisualMessage.getErrore();
}
}
super.setValueAt(f.getDescrizione(), rigaIniziale>7 ? rigaIniziale : rowIndex, 0);
super.setValueAt(f.getImporto(), rigaIniziale>7 ? rigaIniziale : rowIndex, 1);
calcolaTotale();
}catch(Exception e){
log.logStackTrace(e);
}
}
public void calcolaTotale(){
try{
Double parziale=0.0;
Double totaleSpese=0.0;
for (FatturaRighe fattura : this.v) {
if(fattura.getSoggettoIVA()==true){
parziale += fattura.getImporto()!=null ? fattura.getImporto() : 0.00;
}else
totaleSpese += fattura.getImporto()!=null ? fattura.getImporto() : 0.00;
}
empaCL=parziale*this.percEnpaCL/100;
imponibileIva = parziale + empaCL;
iva = imponibileIva*percIva/100;
ritenutaAcconto= parziale*perRitenuta/100;
lordo = imponibileIva+iva;
netto = lordo-ritenutaAcconto;
totale = netto+ totaleSpese;
int righeSenzaTasse = getCountSpeseTaxFree();
//io so che l'ultima riga conterrà sempre il parziale
super.setValueAt(decimalFormatter.format(parziale), this.getRowCount()-1-rigaParziale-righeSenzaTasse, 1);
super.setValueAt(decimalFormatter.format(empaCL), this.getRowCount()-1-rigaEnpaCl-righeSenzaTasse, 1);
super.setValueAt(decimalFormatter.format(imponibileIva), this.getRowCount()-1-rigaImponibileIva-righeSenzaTasse, 1);
super.setValueAt(decimalFormatter.format(iva), this.getRowCount()-1-rigaIva-righeSenzaTasse, 1);
super.setValueAt(decimalFormatter.format(ritenutaAcconto), this.getRowCount()-1-rigaRitenuta-righeSenzaTasse, 1);
super.setValueAt(decimalFormatter.format(lordo), this.getRowCount()-1-rigaTotaleLordo-righeSenzaTasse, 1);
super.setValueAt(decimalFormatter.format(netto), this.getRowCount()-1-rigaNetto-righeSenzaTasse, 1);
//super.setValueAt("TOTALE", this.getRowCount()-1-rigaTotale, 0);
super.setValueAt(decimalFormatter.format(totale), this.getRowCount()-1-rigaTotale, 1);
}catch(Exception e){
log.logStackTrace(e);
VisualMessage.getErrore();
}
}
public Class<Float> getColumnClass(Float columnIndex) {
return Float.class; // Le due colonne sono numeri interi
}
@SuppressWarnings("rawtypes")
public void stampaTabella(List<FatturaRighe> v){
int i=0;
this.v=v;
Double totale=0.0;
// for(Iterator<FatturaText> it=v.iterator(); it.hasNext();){
// FatturaText fattura =it.next();
// this.addRow(new Vector());
// super.setValueAt(fattura.getCodFattura(), i,0);
// super.setValueAt(fattura.getDataFormattata(), i,1);
// if(fattura.getCliente()!=null)
// super.setValueAt(fattura.getCliente().getRagioneSociale(), i,2);
//
// super.setValueAt(decimalFormatter.format(fattura.getTotale())+" €", i, 3);
// totale+=fattura.getTotale();
// i++;
// }
this.addRow(new Vector());
super.setValueAt("TOTALE", i, 0);
super.setValueAt(decimalFormatter.format(totale)+" €", i, 3);
}
}
答案 0 :(得分:1)
我已经实现了这个表的KeyEventListener。因此,如果我尝试单击keyBoard的CANC按钮,我想删除所选行
按钮上的KeyListener
和“点击”彼此之间有什么关系?
当您点击按钮时,您应该在按钮上添加ActionListener
来处理事件。
if(ke.getKeyCode()== 127)
首先,您不应该使用KeyListener来侦听KeyEvents。如果你确实使用了一个监听器,那么不要使用魔术数字,没人知道“127”是什么。而是使用KeyEvent
API中定义的变量。例如:KeyEvent.VK_A。
在任何情况下,问题都是JTable
会在收到任何KeyEvent时将单元格置于编辑模式。
如果您需要对特殊KeyStroke进行特殊处理,那么您应该使用Key Bindings
。然后KeyStroke由绑定处理,不会调用编辑器。
阅读How to Use Key Bindings上Swing教程中的部分,了解更多信息和示例。请注意,在设置密钥绑定时,您将使用WHEN_ANCESTOR_OF_FOCUSED_COMPONENT InputMap
。