Inputvalidatie met TableCellEditor in jTables

Ik heb een JTable met 3 kolommen. Eén op de kolommen moet een gehele waarde hebben en ik moet de invoer valideren voordat de cel zijn focus verliest.

Ik heb de celeditor gebruikt en de functie stopCellEditing() overschreven. Ik heb de validatie in stopCellEditing geschreven en het houdt de focus op de cel, maar mijn probleem is dit:

  • de kolom kan niet meer dan één waarde accepteren (als ik ga naar het bewerken van een andere cel, verdwijnt de inhoud !!)
  • Ik kan niet op enter drukken als ik een van de cellen in deze kolom aan het bewerken ben!

dit is mijn editor-les:

public class MyEditor extends DefaultCellEditor implements TableCellEditor {

    public MyEditor() {
        super(new JTextField());
    }

    @Override
    public boolean stopCellEditing() {
        Object obj = delegate.getCellEditorValue();
        if (obj is not an integer) {
            return false;
        }
        return true;
    }

en dit is hoe ik het in mijn frame gebruik:

studentsTable.getColumnModel (). GetColumn (2) .setCellEditor (nieuw   MyEditor ())

Plz help me :)

1
En wat is het gewenste gedrag wanneer ongeldige invoer wordt ingevoerd en de gebruiker de focus wijzigt? Keer terug naar een oude waarde, gebruik een standaardwaarde, ...
toegevoegd de auteur Robin, de bron
de voorwaarde zal nooit waar zijn - de waarde die door een textField wordt geretourneerd is altijd slechts een tekenreeks, zodat je de standaardafhandeling hebt gewijzigd, zoals @camickr al opmerkte. Hij is ook perfect in de andere kogels - het is gewoon verkeerd om niet super te noemen als de bewerking geldig zou zijn, dat is waar de luisteraars een melding krijgen - toon dus sscce voor hulp :-).
toegevoegd de auteur kleopatra, de bron

1 antwoord

Eén op de kolommen moet een geheel getal hebben

U hoeft hiervoor geen aangepaste editor te schrijven.

Het enige dat u hoeft te doen, is de getColumnClass() -methode van JTable of uw TableModel overschrijven en de tabel gebruikt de meegeleverde Integer-editor.

Met betrekking tot de code die u hebt geplaatst:

  1. It won't compile since your if condition is not valid. We want real code so we can spot possible logic errors. The code should also be posted in the form of an SSCCE.

  2. There is no need to reference the delegate variable. Just invoke the getCellEditor() method directly.

  3. Don't know if it makes a difference bu when I override stopCellEditing(), instead of returning true I use:

    return super.stopCellEditing();

2
toegevoegd
het maakt niet uit wat er in de stopCellEditing() staat, cz zelfs als ik mijn code heb verwijderd die juist is teruggegeven, krijg ik hetzelfde resultaat. Pas als ik de functie verwijder, komt alles weer normaal maar natuurlijk geen validatie @camickr
toegevoegd de auteur Nada Naoushi, de bron