2017-01-21 5 views
0

これまでに解決されていたのは申し訳ありませんが、解決策を探しましたが、関連するものが見つかりませんでした。私はこれを初めて知ったので、簡単な解決策につながったと思われる何かを完全に見落としたり無視したりする機会があります。Swing JTable - ShiftキーでKeyListenerの代わりにキーバインディングを使用

シフトキーのキーリスナーを実装しました。ユーザーがshiftキーを押すと、編集前にセルを正確に1行だけ入力します(以下のコードをご覧ください)。しかし、1つの問題があります。ユーザーが現在セルにデータを入力している場合、シフトキーは機能せず、デバッグ時にプログラムがキーリスナーに入ることもないことがわかります。この問題を解決するためにキーリスナーの代わりにキーバインディングを使用するように指示されています。私はチュートリアルのオンラインに従おうとしましたが、失敗したようです。どんな助けでも大変感謝します。ありがとうございます!

二つのキーリスナー(シフトはそうではないタブが、正常に動作します):うまくいけば問題はあまりにも愚かな、とかつてない

class ShiftAction extends AbstractAction{ 
     public void actionPerformed(ActionEvent ae){ 
      System.out.println("Shift"); 
      table.editCellAt(table.getSelectedRow() + 1, table.getSelectedColumn()); 
      table.setColumnSelectionInterval(table.getSelectedColumn(), table.getSelectedColumn()); 
      table.setRowSelectionInterval(table.getSelectedRow() + 1, table.getSelectedRow() + 1); 
     } 
    } 
    shiftAction = new ShiftAction(); 
    table.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_SHIFT,KeyEvent.SHIFT_DOWN_MASK),"doShiftAction"); 
    table.getActionMap().put("doShiftAction",shiftAction); 

table.addKeyListener(new KeyAdapter() { 
     @Override 
     public void keyReleased(KeyEvent e) { 
      //KeyCode 9 is a key code for the Tab key 
      if (e.getKeyCode() == 9) { 
       if(table.isCellEditable(table.getSelectedRow(),table.getSelectedColumn())) { 
        table.editCellAt(table.getSelectedRow(), table.getSelectedColumn()); 
       } else { 
        table.editCellAt(table.getSelectedRow(), table.getSelectedColumn() + 1); 
       } 
      } 
      //The problem occurs here 
      //KeyCode 16 is a key code for the Shift key 
      if (e.getKeyCode() == 16) { 
       if(table.isCellEditable(table.getSelectedRow() + 1, table.getSelectedColumn())) { 
        table.editCellAt(table.getSelectedRow() + 1, table.getSelectedColumn()); 
        table.setColumnSelectionInterval(table.getSelectedColumn(), table.getSelectedColumn()); 
        table.setRowSelectionInterval(table.getSelectedRow() + 1, table.getSelectedRow() + 1); 
       } else { 
        table.editCellAt(table.getSelectedRow() + 1, table.getSelectedColumn() + 1); 
        table.setColumnSelectionInterval(table.getSelectedColumn() + 1, table.getSelectedColumn() + 1); 
        table.setRowSelectionInterval(table.getSelectedRow() + 1, table.getSelectedRow() + 1); 
       } 

      } 
     } 
    }); 

は、ここに私の未遂(失敗した)ソリューションです再び、事前に感謝します。

+0

"この問題を解決するためにキーリスナーの代わりにキーバインディングを使用するように言われました。"彼らに尋ねなさい。あなたの問題を解決することはできませんが、あなたの問題を増やすことはありません。(あなたが今見ているように) – gpasch

+0

私はJavaのインストラクターによって、私を助ける時間があまりないと言われました。私はプロジェクトを終了しなければならない)。それはそれほど大きな契約ではありません。私はそれをそのまま残しておくことができます。これは私のための学習体験の多くです。 –

+0

@gpasch、はい、Key Bindingsが優れたソリューションです。これはより新しい、より優れたAPIであり、焦点の問題に取り組んでいます。 – camickr

答えて

1
e.getKeyCode() == 9 

まず、マジックナンバーを使用しないでください。コードを読んでいる人は "9"の意味を知らない。 KeyEvent APIの提供フィールドを使用してください:KeyEvent.VK_???

プログラムがキーリスナーに入ることもないことがわかります。

フォーカスは、JTextFieldがセルのエディタとして使用されているため、テーブルではなくKeyEventを受け取ります。

この問題を解決するためにキーリスナーの代わりにキーバインドを使用するように言われました。

InputMapを適切に使用する必要があります。この場合は、次のようになります。

JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT 

詳細についてはHow to Use Key Bindings上のSwingのチュートリアルからのセクションをお読みください。

+0

私はお詫びします。 Tabキーのキーコードは9で、Shiftキーのキーコードは16です。すぐに情報を編集します。私はこのすべてをコードに適用しようとします。この場合、適切なJComponentはJTableかJTextFieldですか? –

関連する問題