2016-07-15 15 views
0

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!

+0

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

+0

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

Antwort

2

Mein Problem ist, dass sobald ein Benutzer eine Zelle aktualisiert und auf "Fertig" klickt, die letzten vorgenommenen Aktualisierungen nicht funktionieren.

prüfen für zwei Ansätze aus Table Stop Editing aus:

Sie können entweder:

Fügen Sie Code zum Action:

if (table.isEditing()) 
    table.getCellEditor().stopCellEditing(); 

oder eine Eigenschaft auf den Tisch:

JTable table = new JTable(...); 
table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); 

Bearbeiten:

Wenn der Benutzer auf Fertig klickt, werden alle Zellendaten in einem 2D-Array gespeichert.

Warum? Alle Daten sind bereits im TableModel gespeichert.

In jedem Fall müssen Sie die Bearbeitung beenden, BEVOR Sie versuchen, Daten aus dem TableModel in das Array zu kopieren.

+0

Hallo Camickr. Im Beispiel versuche ich zu demonstrieren, dass die Zelle den Fokus nicht verloren hat. Angenommen, ein Benutzer klickt auf die zu bearbeitende Zelle und klickt dann, ohne auf eine andere Zelle zu klicken oder "Enter", auf "Fertig". Jetzt ist der Fokus auf die Zelle nicht verloren gegangen. Technisch haben sie nie den "Bearbeitungsmodus" der Zelle verlassen. Nun kann es sein, dass ich die Benutzer anweisen muss, dass sie die Eingabetaste drücken müssen, bevor sie auf "Fertig" klicken, aber ich hatte gehofft, dass die Zelle den Fokus verliert, wenn sie auf Enter klicken. – jesric1029

+0

@ jesric1029, 'aber ich hatte gehofft, die Zelle zu zwingen, den Fokus zu verlieren, wenn sie auf Enter klicken. Nun, die Zelle wird immer den Fokus verlieren, wenn Sie auf den Knopf klicken, da nur eine Komponente den Fokus auf einmal haben kann. Meine Antwort zeigt Ihnen, wie Sie die Bearbeitung der Zelle beenden können, damit die Daten in das TableModel eingegeben werden. Es gibt Ihnen zwei verschiedene Möglichkeiten, dies zu tun. Siehe Bearbeiten. – camickr

+0

Ich habe beide Lösungen ausprobiert. Scheinbar verliert die Zelle den Fokus nicht, bevor der Tasten-Listener läuft. Ich kann sagen, denn wenn ich einen falschen Wert in die Zelle einfüge, der bewirkt, dass die Beträge nicht übereinstimmen, und "Fertig" drücke, ohne etwas anderes zu tun, wird der Fehler nicht erzeugt. Wenn ich nach der Eingabe die Eingabetaste drücke oder nach Eingabe der falschen Menge auf eine andere Zeile klicke, wird die Meldung angezeigt. Es ist für den Benutzer nicht so wichtig, die Eingabetaste drücken zu müssen, aber es wird einfacher, die Leute nicht zu verwirren. – jesric1029

Verwandte Themen