2017-04-16 16 views
6

JTableがあり、テーブルの空の部分をクリックしてすべての行を選択解除することができます。これはこれまでのところうまく動作します。しかし、私は、テーブルはまだ(例ではセルを参照してください)以前に有効セルの周囲に境界線を示してtable.clearSelection();を呼び出すにもかかわらず:JTable:行の選択をクリアするときにセルの周りの境界線を削除する

Table deselection issue

私は(もこの境界線を取り除くしたいと思いますそれは、Macのネイティブなルックアンドフィールで、セルが突然黒に変わったときに特に外見上のように見えます)。

完全に動作する最低限のコード例:

public class JTableDeselect extends JFrame { 
    public JTableDeselect() { 
     Object rowData[][] = { { "1", "2", "3" }, { "4", "5", "6" } }; 
     Object columnNames[] = { "One", "Two", "Three" }; 
     JTable table = new JTable(rowData, columnNames); 
     table.setFillsViewportHeight(true); 
     table.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       if (table.rowAtPoint(e.getPoint()) == -1) { 
        table.clearSelection(); 
       } 
      } 
     }); 
     add(new JScrollPane(table)); 
     setSize(300, 150); 
    } 
    public static void main(String args[]) throws Exception { 
     UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); 
     new JTableDeselect().setVisible(true); 
    } 
} 

[編集]この辺りで述べたtable.getColumnModel().getSelectionModel().clearSelection();を追加しようとしました。しかし、これはどちらも役に立たない。

答えて

3

はtable.getColumnModel()を追加しようとしたgetSelectionModel()clearSelection();。。

table.clearSelection()

方法は、その方法とTableColumnModelclearSelection()メソッドを呼び出します。あなたは、矢印キーを使用している場合今、焦点は(0、0になります

table.clearSelection(); 

ListSelectionModel selectionModel = table.getSelectionModel(); 
selectionModel.setAnchorSelectionIndex(-1); 
selectionModel.setLeadSelectionIndex(-1); 

TableColumnModel columnModel = table.getColumnModel(); 
columnModel.getSelectionModel().setAnchorSelectionIndex(-1); 
columnModel.getSelectionModel().setLeadSelectionIndex(-1); 

:あなたはまた、選択モデルの「アンカーとリード」インデックスをリセットする必要がある選択をクリアすることに加え

)ので、クリックされた最後のセルに関する情報は失われます。

選択モデルのみを消去すると、行情報は失われますが、列情報は残ります。

モデルの一方または両方を消去して、効果を得ることを試してください。

5

問題:テーブルセルには選択が失われてもフォーカスが残っているため、太い境界線を表示することでこれを表示します。 を知ることは、セルが選択を失ったときにセルのフォーカスを削除する独自のレンダラーを作成することです。例えば:

table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() { 
    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, 
      boolean isSelected, boolean hasFocus, int row, int column) { 
     if (!isSelected) { 
      hasFocus = false; 
     } 
     return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
    } 
}); 
+0

ありがとうございました!シンプルで効果的! – qqilihq

+0

@ qqilihqこれは、テーブル内のすべてのデータが同じレンダラーを使用していることを前提としています。より一般的なソリューションでは、選択をクリアするだけでなく、選択モデルのアンカー/リードのインデックスをリセットする必要があります。カスタムレンダラーは必要ありません。 – camickr

+0

@camickr:ありがとう。 1 +あなたの答えに –

関連する問題