表格

2017-06-13 21 views
0

的油漆單元格背景我必須實現對我的Table的選擇,並且爲此需要將單元格的背景用藍色繪製(並且稍後可能前景爲白色,但這對未來是個問題)。表格

天真的方法是隻使用這樣的漆事件:

table.addListener(SWT.PaintItem, event -> { 
     final boolean selection = // calulate somehow; 

     if (selection) { 
      event.gc.setForeground(this.table.getDisplay().getSystemColor(SWT.COLOR_LIST_SELECTION)); 
      Rectangle bounds = table.getItem(new Point(event.x, event.y)).getBounds(); 
      event.gc.fillRectangle(event.x, event.y, bounds.width, bounds.height); 
     } 
    }); 

但是,這種油漆在小區的一切,我需要畫表自己的全部內容。這不是我現在想要做的。

然後我試圖使用TableItem#setBackground(Color),它獲取由預製的選擇重寫和懸停顏色,即使他們禁用這樣的:

table.addListener(SWT.EraseItem, event -> { 
     event.detail &= ~SWT.SELECTED; 
     event.detail &= ~SWT.HOT; 
     event.detail &= ~SWT.FOCUSED; 
    }); 

從而顯示被選中或懸停的行由OS在白色。

我試過EraseItemMeasureItem以及希望找到一個在單元被繪製之前拋出的事件,所以我只能繪製背景。但EraseItem塗料在一切和MeasureItem繪畫不會做任何事情。

有什麼方法可以繪製單元格的背景,而無需手動繪製前景或被表格的內置選擇覆蓋?

+0

這只是'Table'或者你在使用'TableViewer' - 它支持一個實現'IColorProvider'的標籤提供者。 –

+0

@ greg-449它是一個'TableViewer',但表格和列上的標籤提供者都會被選擇和懸停覆蓋。 –

+0

對於TableViewer,我使用擴展的StyledCellLabelProvider來繪製自定義選擇指示符(和樣式文本)。 –

回答

0

格雷戈-449說,StyledCellLabelProvider可能是要走的路:

tableViewerColumn.setLabelProvider(new StyledCellLabelProvider() { 

    @Override 
    public void update(ViewerCell cell) { 
     cell.setText("Content"); 

     final int column = cell.getColumnIndex(); 
     final int row = Arrays.asList(tableViewer.getTable().getItems()).indexOf(cell.getItem()); 

     if (selection) { 
      Display display = cell.getControl().getDisplay(); 
      cell.setBackground(display .getSystemColor(SWT.COLOR_LIST_SELECTION)); 
      cell.setForeground(display .getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT)); 
     } 

     super.update(cell); 
    } 
}); 

這得到由系統的選擇重寫,並懸停在您添加:

table.addListener(SWT.EraseItem, event -> event.detail &= ~SWT.HOT); 
table.addListener(SWT.Selection, e -> table.setSelection(-1)); 
+0

我仍然無法理解你的問題。你想設置你選擇的單元格的背景和前景色(鼠標或箭頭鍵選擇單元格),對吧? –