Ich versuche, ein seltsames Problem mit meinem Programm zu lösen. Dieses Programm erstellt eine Reihe von GUI's und JTables, die es einem Benutzer ermöglichen, eine XML-Datei zu generieren. Eine dieser Tabellen dient zum Erstellen der "Anweisungen". Ich werde nicht so weit ins Detail gehen, außer zu sagen, dass die Daten in mehreren 2D-Arrays gespeichert sind, die wiederum in einer Hash-Karte gespeichert sind.JTable stoppen Zelle bearbeiten ohne Benutzer klicken
Hier ist was passiert. Wenn ein Benutzer den Anweisungsbildschirm eingibt, wird eine JTable mit dem Inhalt des 2D-Arrays generiert. Diese Daten füllen die Zellen, die der Benutzer ändern kann. Eine dieser Zellen (und die wichtigste) ist die Menge. Die Beträge, die sie für die Zeilen setzen, stimmen mit einem anderen Betrag einer anderen Klasse überein.
Am unteren Ende der Tabelle befindet sich eine Schaltfläche "fertig". Wenn der Benutzer auf diese Schaltfläche klickt, überprüft die Logik, ob die Geldbeträge übereinstimmen. Wenn dies der Fall ist, aktualisiert das Programm das 2D-Array mit allen geänderten Werten und entsorgt die JTable.
Mein Problem ist, dass sobald ein Benutzer eine Zelle aktualisiert und auf "Fertig" klickt, die letzten vorgenommenen Aktualisierungen nicht funktionieren. Im Wesentlichen muss der Benutzer zuerst irgendwo anders in der Tabelle klicken und THEN Hit beendet. Ich möchte, dass diese Aktion automatisch erfolgt, so dass die Bearbeitung der Zelle gestoppt wird, wenn der Benutzer auf "Fertig" klickt. Hier ist der Code für die fertige Taste:
finishedButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
//Creates another table model for the finished button logic.
DefaultTableModel dm = (DefaultTableModel)StatementGUI.tbl.getModel();
//Gets the total number of table rows.
int rows = dm.getRowCount();
//Creates a variable to store the statement transaction total.
double statementTransactionTotal=0;
//For each row in the table.
for(int i = 0; i < dm.getRowCount(); i++){
//Gets the total of all transactions in the table.
String currentTotal = tbl.getValueAt(i, 3).toString();
Double currentTotalDouble = Double.parseDouble(currentTotal);
statementTransactionTotal=statementTransactionTotal+currentTotalDouble;
}
//Creates a decimal format and applies the statement total.
DecimalFormat df = new DecimalFormat("0.00");
String currentTotalDF = df.format(statementTransactionTotal);
//Stops editing on the table so that the data can be used.
if(null != tbl.getCellEditor()){
tbl.getCellEditor().stopCellEditing();
}
//If the statement total matches the transaction total..
if(currentTotalDF.matches(ClearedMainGUI.currentTransactionAmount)){
//For each row in the table..
for(int i = 0; i < dm.getRowCount(); i++){
//Will replace the hash/array value with the table value.
ClearedMainGUI.Transactions.get(ClearedMainGUI.selectedRow)[i][0]=tbl.getValueAt(i, 0).toString();
ClearedMainGUI.Transactions.get(ClearedMainGUI.selectedRow)[i][1]=tbl.getValueAt(i, 1).toString();
ClearedMainGUI.Transactions.get(ClearedMainGUI.selectedRow)[i][2]=tbl.getValueAt(i, 2).toString();
ClearedMainGUI.Transactions.get(ClearedMainGUI.selectedRow)[i][3]=tbl.getValueAt(i, 3).toString();
ClearedMainGUI.Transactions.get(ClearedMainGUI.selectedRow)[i][4]=tbl.getValueAt(i, 4).toString();
ClearedMainGUI.Transactions.get(ClearedMainGUI.selectedRow)[i][5]=tbl.getValueAt(i, 5).toString();
ClearedMainGUI.Transactions.get(ClearedMainGUI.selectedRow)[i][6]=tbl.getValueAt(i, 6).toString();
ClearedMainGUI.Transactions.get(ClearedMainGUI.selectedRow)[i][7]=tbl.getValueAt(i, 7).toString();
}
//For each row in the table..
for(int i = rows - 1; i >=0; i--){
//Removes the current row so the table will be empty next time.
dm.removeRow(i);
}
//Removes the frame and goes back to the previous GUI.
frame.dispose();
//If the statement total and transaction total do not match..
}else{
JOptionPane.showMessageDialog(null, "The statement total entered: $"+statementTransactionTotal+" " +
"does not match the transaction total of: $"+ClearedMainGUI.currentTransactionAmount);
}
}
});
Ich glaube, mein Problem mit dieser Linie ist:
if(null != tbl.getCellEditor()){
tbl.getCellEditor().stopCellEditing();
}
Dies scheint nur zu arbeiten, sobald der Benutzer eines anderen Bereich der Tabelle geklickt hat nach einer Bearbeitung Zelle.
Ich schätze die Hilfe!
korrigieren Sie mich wenn, vielleicht bin ich worng, aber Code geschrieben nichts über XxxEditor zu sprechen, nur um einen Wert aus Zeile (n) zu nehmen, Editor hat nicht mit ActionListener von JButtons zu tun, vielleicht einige Missinterpretations in Ihrer Frage – mKorbel
Ich bin mir nicht sicher, worüber du mKorbel redest, tut mir leid, wenn meine Frage schwer zu verstehen ist. Dies ist nur eine einfache JTable mit einem "Fertig" -Knopf am unteren Rand.Wenn der Benutzer auf Fertig klickt, werden alle Zellendaten in einem 2D-Array gespeichert. Das funktioniert gut, das Problem ist einfach, wenn der Benutzer den Fokus auf die letzte Zelle, die sie bearbeitet haben, die Daten, die sie geändert haben, nicht in den Array-Wert widerspiegeln. Wenn sie also auf eine Zelle klicken, um den Wert "A" in "B" zu ändern und den Fokus nicht zu verlieren, speichert das Array "A" .. – jesric1029