2016-11-06 9 views
0

JTableに個別のセルではなく行全体を強制的にフォーカスさせる方法はありますか?私は行の選択のハイライトについて話しているわけではなく、フォーカスされた行にすべてのセルを含めるフォーカス境界についてのみです。セルの代わりに全行にJTableをフォーカス

UPDATE:

enter image description here

":

public class TableTest { 

    private static void createAndShowGUI() { 

     int rows = 20; 
     int cols = 2; 
     String[] headers = { "Column 1", "Column 2" }; 
     String[][] data = new String[rows][cols]; 

     for (int j = 0; j < rows; j++) 
      for (int k = 0; k < cols; k++) 
       data[j][k] = "item " + (j * cols + k + 1); 

     JTable table = new JTable(); 

     DefaultTableModel tableModel = new DefaultTableModel(data, headers) { 
      // Disable editing of the cells 
      @Override 
      public boolean isCellEditable(int row, int column) { 
       return false; 
      } 
     }; 
     table.setModel(tableModel); 
     table.setShowGrid(false); 
     table.setIntercellSpacing(new Dimension(0,0)); 

     // key binding to remove rows 
     InputMap inputMap = table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 
     ActionMap actionMap = table.getActionMap(); 
     inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), "REMOVE"); 
     actionMap.put("REMOVE", new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       int[] rows = table.getSelectedRows();  
       for (int i = rows.length - 1; i >= 0; i--) { 
        tableModel.removeRow(rows[i]); 
       } 
      } 
     }); 

     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.getContentPane().add(new JScrollPane(table)); 
     f.setSize(500, 500); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        //UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {} 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 

が選択された行の "境界フォーカス":編集不可セルと削除-行機能を持つ

表選択された行がない「フォーカス枠」:

enter image description here

WindowsのLAFで "国境をフォーカス":

enter image description here

私は、行のすべてのセル(ときに表示)を含めるには、この "フォーカス枠を" 欲しいです。

public class TableTest { 

    private static void createAndShowGUI() { 

     int rows = 20; 
     int cols = 2; 
     String[] headers = { "Column 1", "Column 2" }; 
     String[][] data = new String[rows][cols]; 

     for (int j = 0; j < rows; j++) 
      for (int k = 0; k < cols; k++) 
       data[j][k] = "item " + (j * cols + k + 1); 


     // ADDED CODE 
     JTable table = new JTable() { 

      private Border outside = new MatteBorder(1, 0, 1, 0, Color.BLACK); 
      private Border inside = new EmptyBorder(0, 1, 0, 1); 
      private Border border = new CompoundBorder(outside, inside); 

      @Override 
      public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { 
       Component c = super.prepareRenderer(renderer, row, column); 
       JComponent jc = (JComponent) c; 
       // Add a border to the selected row 
       if (isRowSelected(row)) jc.setBorder(border); 
       return c; 
      } 
     }; 


     DefaultTableModel tableModel = new DefaultTableModel(data, headers) { 
      // Disable editing of the cells 
      @Override 
      public boolean isCellEditable(int row, int column) { 
       return false; 
      } 
     }; 
     table.setModel(tableModel); 
     table.setShowGrid(false); 
     table.setIntercellSpacing(new Dimension(0,0)); 

     // key binding to remove rows 
     InputMap inputMap = table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 
     ActionMap actionMap = table.getActionMap(); 
     inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), "REMOVE"); 
     actionMap.put("REMOVE", new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       int[] rows = table.getSelectedRows();  
       for (int i = rows.length - 1; i >= 0; i--) { 
        tableModel.removeRow(rows[i]); 
       } 
      } 
     }); 

     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.getContentPane().add(new JScrollPane(table)); 
     f.setSize(500, 500); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        //UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {} 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 

これは行全体の周りに境界線を追加する(しかし、すべての細胞を含むことのない左/右の挿入図とともに):

以下

は同じコードであるが、私は@camickrのコードの一部を追加しました。これは「フォーカスの境界線/矩形」ではなく、選択した行の周囲にのみ表示される境界線です。行を削除すると、選択した行が消去され、フォーカス枠が再表示されます。私はない(私はそれを行う方法を知っている)、フォーカス枠を非表示にするか、私はそれが見えるようになったときに代わりに、一つのセルの行のすべてのセルを含めるが、そのように機能しておきたいこと

注意。

+0

行フォーカス全体の意味は?キーボード入力はどこに行かなければならないのですか?それとも、表示上の問題で、行全体に 'FocusBorder'を表示したいのですか? – kgeorgiy

+0

私は、行全体にFocusBorderを表示したいだけです。セルは編集不可能なbtwです。 – AndroidX

+0

いいえ、ここでは、入力を開始するときにキーボード入力をどこに表示するかを示します。あなたが望むことを行うことは大会に反するものであり、フレームワークには組み込まれていません。唯一のオプションは、各列のカスタムセルレンダラーでフォーカスの枠線を描画することです。列がユーザーによって再配置されるように、この一般的なケースでは正しく機能するにはこのトリッキーです。もっと簡単な解決策は、JTableをまったく使用せず、代わりに単一のカスタムセルレンダラーでJListを使用することです。 –

答えて

1

私は、行全体にフォーカス枠を表示したいだけです。

Table Row Renderingをご覧ください。

個々のセルではなく、行に境界線を配置する方法の1つが示されています。

+0

をありがとう提案してくれてありがとうございますが、これは実際のフォーカス境界ではないので、私が探しているものではありません。私はそれを試して、それは選択された行に対してのみ動作します。行は選択されていませんが、フォーカス境界線が表示されている場合は、すべてではなく1つのセルを占有します。 – AndroidX

+0

@AndroidX、 '選択された行に対してのみ動作します。' - 1つの行だけが一度に入力を受け入れることができるので、Borderは1つの行にしか存在しません。私が提案したコードでは、単一のセルに境界線が表示されません。ある行には "FocusBorder"というようなものはありません。すでに述べたように、セルだけが入力を受け入れることができるので、セルには点線のような境界線を持つことができます。変更する動作を示す適切な[SSCCE](http://sscce.org/)を投稿して、質問を明確にする必要があります。 – camickr

+0

"赤い枠線"が気に入らない場合は、自分の "焦点枠"を指定します。私はちょうどあなたにコンセプトを示しました。あなたは実際の要件を満たすためにコンセプトをカスタマイズすることができます。 – camickr

関連する問題