2013-04-20 4 views
5

Ich denke, dass die JTable-Komponente eine bessere Arbeit der Filterung der Schlüssel, die Bearbeitung beginnen würde. Ich meine, mit der aktuellen Implementierung, wenn Sie DEL, Strg + Umschalt + Entf, F5, F7, zum Beispiel, in einer bearbeitbaren Zelle eingeben, wird der Zelleneditor angezeigt. Meiner Meinung nach kann ein Zelleneditor mit solchen Schlüsseln für den Endanwender nicht intuitiv sein.Starten Sie die Bearbeitung in einer JTable-Zelle nur mit vernünftigen Schlüsseln

Es gibt noch ein weiteres Problem: JTable ist sich der anderen möglichen Tastenbelegungen, die im Formular definiert sind, nicht bewusst. Wenn Sie eine Tastenkombination Strg + Umschalt + C für eine Schaltfläche in Ihrem Formular definiert haben, wenn Sie diese Tastenkombination in Ihre JTable eingeben, wird die Tabelle mit der Bearbeitung beginnen und die Schaltfläche Tastenaktion wird als nächstes aufgerufen. Ich denke, dass es eine einfache Möglichkeit geben sollte, dies zu verhindern, anstatt alle bereits definierten Tastenbindungen in der Tabellenschlüssel-Bindungszuordnung zu deaktivieren.

Gibt es eine Komponente von Drittanbietern, die zumindest teilweise einige dieser Probleme gelöst hat, insbesondere die, die mit einem vernünftigen Schlüssel zu bearbeiten begonnen hat? Ich möchte nicht all das langwierige Filtern selbst machen.

Jede Hilfe wäre willkommen. Vielen Dank.

Marcos

UPDATE

Zur Zeit benutze ich diese höchst unvollkommen „Lösung“, dass zumindest die Dinge weniger macht im Moment schlimmer. Verbesserungen, Kommentare und Vorschläge werden geschätzt.

@Override 
    public boolean isCellEditable(EventObject e) 
    { 
     if (e instanceof MouseEvent) 
     { 
      return ((MouseEvent) e).getClickCount() >= 
       _delegate.getMouseClickCountToStartEditing(); 
     } 
     else if (e instanceof KeyEvent) 
     { 
      KeyEvent event = (KeyEvent) e; 

      int key = event.getKeyCode(); 
      if ((key >= KeyEvent.VK_F1 && key <= KeyEvent.VK_F12) && 
       KeyStroke.getKeyStrokeForEvent(event) != _startEditingKey) 
      { 
       return false; 
      } 

      int ctrlAlt = KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK; 
      if ((event.getModifiersEx() & ctrlAlt) == ctrlAlt) 
      { 
       return true; 
      } 

      if ((event.getModifiersEx() & ctrlAlt) != 0) 
      { 
       return false; 
      } 

      return true; 
     } 
     else 
     { 
      // Is this else really needed? Are there other events types 
      // other than mouse and key events? 
      return true; 
     } 
    } 

    // _startEditingKey is obtained with this method 
    private KeyStroke getStartEditingKey() 
    { 
     InputMap bindings = TheTable.this.getInputMap(
      JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 
     for (KeyStroke key : bindings.allKeys()) 
     { 
      Object binding = bindings.get(key); 
      if ("startEditing".equals(binding)) 
      { 
       return KeyStroke.getKeyStroke(
        key.getKeyCode(), key.getModifiers(), true); 
      } 
     } 
     return null; 
    } 
+0

Bitte bearbeiten Sie Ihre Frage, um eine [sscce] (http://sscce.org/), die das spezifische Problem zeigt, die Sie haben. – trashgod

+0

Entschuldigung. Ich denke, dass ein scsce in diesem Fall unnötig ist. Das Problem ist in meinem Text bereits gut beschrieben. – Marcos

Antwort

1

können Sie binden eine beliebige Taste, um die startEditing Aktion der Tabelle, wie here und here gezeigt. Sie können unerwünschte Schlüssel deaktivieren, wie in der Abbildung here gezeigt. Einige zusätzliche Nuancen werden gezeigt here und der Artikel zitiert here von @ camickr.

+0

Das Problem, wie ich schon sagte, ist, dass die Liste der unerwünschten Tasten zum Deaktivieren enorm ist. Ich denke über das Erstellen eines unsichtbaren gefälschten JTextField, das mit 5 Zeichen gefüllt wird, und das Schlüsselereignis in der _editCellAt_-Methode (overriden) zu es zu senden. Wenn sich der falsche Feldtext ändert, handelt es sich um einen gültigen, bearbeitbaren Schlüssel. Wenn es sich nicht ändert, ist es kein gültiger Schlüssel, daher gebe ich _false_ von der Methode _editCellAt_ zurück. Was denken Sie? – Marcos

+0

@Marcos was falsch ist mit F2 in JTable API implementiert, sonst zu ändern, dass – mKorbel

+0

@mKorbel Ich beschwere mich nicht über die F2-Taste. Ich beschwere mich nur über die anderen Schlüssel. Die Taste F2 kann weiterhin mit der Bearbeitung beginnen. – Marcos

4

Sie können einen benutzerdefinierten Editor implementieren, die nicht in der editierbaren berichtet, wenn die keyEvent Modifikatoren Sie ignorieren möchten hat:

DefaultCellEditor editor = new DefaultCellEditor(new JTextField()) { 

    @Override 
    public boolean isCellEditable(EventObject e) { 
     if (e instanceof KeyEvent) { 
      return startWithKeyEvent((KeyEvent) e); 
     } 
     return super.isCellEditable(e); 
    } 

    private boolean startWithKeyEvent(KeyEvent e) { 
     // check modifiers as needed, this here is just a quick example ;-) 
     if ((e.getModifiersEx() & KeyEvent.CTRL_DOWN_MASK) != 0) { 
      return false; 
     }  
     // check for a list of function key strokes 
     if (excludes.contains(KeyStroke.getKeyStrokeForEvent(e)) { 
      return false; 
     } 
     return true; 
    } 

}; 
JTable table = new JTable(new AncientSwingTeam()); 
table.setDefaultEditor(Object.class, editor); 

Edit: für eine zuverlässigere Filterung, die korrekt die ctrl-alt Kombinationen verarbeiten kann, Sie könnten einen Blick auf DefaultEditorKit.DefaultKeyTypedAction werfen: Während Sie im Prinzip an eine versteckte Methode im SunToolkit delegieren und keyTyped (vs. keyPressed benötigt, um die Ereignisse zu filtern, die wahrscheinliche Kandidaten für ein gültiges druckbares Zeichen sind, nachdem Sie die Bearbeitung gestartet haben), könnte es immer noch funktionieren geben Sie eine Vorstellung davon, wie es geht (die Quelle des suntoolkit ist höchstwahrscheinlich in openjdk verfügbar, hat nicht nach th gesucht vor, aber)

+0

Glücklicherweise verwende ich benutzerdefinierte Zelleditoren für alle meine Tabellenspalten. Aber ich denke, dass ich nicht auf sie zurückgreifen muss, um dieses Problem zu lösen. Ich denke, dass ich mit der überschriebenen _editCellAt_-Methode besser umgehen kann (bedenke, dass ich dort auch auf das _KeyEvent_-Ereignis zugreifen kann). Aber die Prüfung, um zu sehen, welche Tastenkombinationen bestanden werden, ist von einem Programmierer fehleranfällig. Das versuche ich zu vermeiden. Siehe meine Antwort auf @trashgod unten. Ich werde diese Alternative versuchen und sehen, ob es funktioniert. Danke für Ihre Antwort. – Marcos

+0

Nun, der Editor api ist _designed_, um zu entscheiden, ob ein beliebiges Ereignis den Edit starten soll oder nicht: also ist es definitiv der richtige Ort (* not * in der Tabelle, editCellAt sollte nur den Editor fragen) Und nein, ich tu 'nicht t sehen viel ein Problem in Bezug auf Tastenkombinationen: Sie müssen gegen Modifikatoren überprüfen, die nichts auslösen sollten, und eine Reihe von Funktionstasten, die leicht in den Editor als eine Liste von keyStrokes übergeben werden, die gegen – kleopatra

+0

überprüft werden können Ok, ich stimme zu, dass du mit der Editor-API recht hast. Mein Code kann auch ohne Probleme dort sein. Aber mit den Tastenkombinationen ist es nicht so einfach. Zum Beispiel, in meiner Tastatur, wenn ich Strg + Alt + a eingeben, bekomme ich ein 'á'-Zeichen. Das Problem besteht also nicht nur darin, einige Tastenkombinationen zu filtern. Ich muss wissen, welcher einen gültigen Charakter erzeugen würde. Dieses Problem ist schwierig und ich sehe keinen einfachen Weg, es loszuwerden. – Marcos

Verwandte Themen