Java 带有ViewerSorter和StyledCellLabelProvider的JFace TableViewer
在我的Java 带有ViewerSorter和StyledCellLabelProvider的JFace TableViewer,java,eclipse,swt,jface,tableviewer,Java,Eclipse,Swt,Jface,Tableviewer,在我的TableViewer中,有一些TableViewer列。 我有一个文本小部件和一个“搜索”按钮。每当我点击搜索时,我想给表格单元格文本上色 包含(匹配)文本小部件中的单词的。我可以通过设置StyledCellLabelProvider 对于每个TableViewerColumn并覆盖更新方法,setStyleRanges对于每个包含该单词的单元格文本 我试图为每个TableViewerColumn设置ColumnLabelProvider,因为我需要覆盖getText方法 但是在这种情况
TableViewer
中,有一些TableViewer列
。
我有一个文本小部件和一个“搜索”按钮。每当我点击搜索时,我想给表格单元格文本上色
包含(匹配)文本小部件中的单词的。我可以通过设置StyledCellLabelProvider
对于每个TableViewerColumn
并覆盖更新方法,setStyleRanges
对于每个包含该单词的单元格文本
我试图为每个TableViewerColumn
设置ColumnLabelProvider
,因为我需要覆盖getText
方法
但是在这种情况下,覆盖update方法似乎不适用于setStyleRanges
最后,我无法使StyledCellLabelProvider
与ViewerSorter
一起工作,因为StyledCellLabelProvider
不能
有一个getText方法
有没有一种方法可以使单词更高级,同时具有表格排序功能?使用您自己从
ViewerSorter
派生的类(或推荐的ViewerComparator
)并重写
public int compare(Viewer viewer, Object e1, Object e2);
方法,以便可以从模型对象中获取文本
比如:
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
int cat1 = category(e1);
int cat2 = category(e2);
if (cat1 != cat2) {
return cat1 - cat2;
}
String name1 = ... get text from e1
String name2 = ... get text from e2
return getComparator().compare(name1, name2);
}
如果您不使用类别,可以省略代码的第一部分。我通过在
TableLabelProvider
之后设置样式标签提供程序
并刷新TableViewer
实现了上述功能。所有这些都是因为ColumnLabelProvider
update方法不适用于cell.setStyleRanges
package mydbtable.gui;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.StatusLineManager;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.StyledCellLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.wb.swt.SWTResourceManager;
import com.ibm.icu.text.Collator;
public class TableWithSortAndSearch extends ApplicationWindow {
private Object[] tableData;
private Text text_Search;
private Table table;
private TableViewer tableViewer;
private Button btnSearch;
private List<TableViewerColumn> tableViewerColumnList;
/**
* Create the application window.
*/
public TableWithSortAndSearch() {
super(null);
createActions();
addToolBar(SWT.FLAT | SWT.WRAP);
addMenuBar();
addStatusLine();
}
/**
* Create contents of the application window.
* @param parent
*/
@Override
protected Control createContents(Composite parent) {
tableData = (new TableData()).get(5, 4);
tableViewerColumnList = new ArrayList<>();
Composite container = new Composite(parent, SWT.NONE);
container.setLayout(new GridLayout(1, false));
Composite composite = new Composite(container, SWT.NONE);
composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
composite.setBounds(0, 0, 10, 10);
composite.setLayout(new GridLayout(2, false));
{
text_Search = new Text(composite, SWT.BORDER);
text_Search.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false, 1, 1));
text_Search.setSize(78, 23);
}
{
btnSearch = new Button(composite, SWT.NONE);
btnSearch.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
btnSearch.setSize(54, 27);
btnSearch.setText("Search");
}
Composite composite_Table = new Composite(container, SWT.NONE);
composite_Table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
composite_Table.setBounds(0, 0, 64, 64);
composite_Table.setLayout(new GridLayout(1, false));
{
tableViewer = new TableViewer(composite_Table, SWT.BORDER | SWT.FULL_SELECTION);
table = tableViewer.getTable();
table.setLinesVisible(true);
table.setHeaderVisible(true);
table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
table.setSize(339, 84);
TableViewerColumn tableViewerColumn;
int[] columnIdices = { 0 ,1 ,2 ,3 };
for ( final int columnIndex : columnIdices ) {
//column = i;
tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
TableColumn tableColumn = tableViewerColumn.getColumn();
tableColumn.setMoveable(true);
tableColumn.setWidth(150);
tableColumn.setText("Data" + columnIndex);
//tableViewerColumn.setLabelProvider(new MyColumnLabelProvider(columnIndex));
tableColumn.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
((MyViewerSorter) tableViewer.getSorter()).doSort( columnIndex );
tableViewer.refresh();
for ( int i=0 ; i<tableViewerColumnList.size() ; i++) {
tableViewerColumnList.get(i).setLabelProvider(new MyStyledCellLabelProvider(i));
}
tableViewer.refresh();
}
});
tableViewerColumnList.add(tableViewerColumn);
}
tableViewer.setContentProvider(new StracturedContentProvider());
tableViewer.setLabelProvider(new TableLabelProvider());
tableViewer.setSorter(new MyViewerSorter());
tableViewer.setInput(tableData);
btnSearch.addSelectionListener(createAdapterFor(tableViewer));
}
return container;
}
/**
* Create the actions.
*/
private void createActions() {
// Create the actions
}
/**
* Create the menu manager.
* @return the menu manager
*/
@Override
protected MenuManager createMenuManager() {
MenuManager menuManager = new MenuManager("menu");
return menuManager;
}
/**
* Create the toolbar manager.
* @return the toolbar manager
*/
@Override
protected ToolBarManager createToolBarManager(int style) {
ToolBarManager toolBarManager = new ToolBarManager(style);
return toolBarManager;
}
/**
* Create the status line manager.
* @return the status line manager
*/
@Override
protected StatusLineManager createStatusLineManager() {
StatusLineManager statusLineManager = new StatusLineManager();
return statusLineManager;
}
/**
* Launch the application.
* @param args
*/
public static void main(String args[]) {
try {
TableWithSortAndSearch window = new TableWithSortAndSearch();
window.setBlockOnOpen(true);
window.open();
Display.getCurrent().dispose();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Configure the shell.
* @param newShell
*/
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText("New Application");
}
/**
* Return the initial size of the window.
*/
@Override
protected Point getInitialSize() {
return new Point(600, 400);
}
private static class StracturedContentProvider implements IStructuredContentProvider {
@Override
public void dispose() {
// TODO Auto-generated method stub
}
@Override
public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
// TODO Auto-generated method stub
}
/**
* Gets the elements for the table
*
* @param arg0
* the model
* @return Object[]
*/
@Override
public Object[] getElements(Object arg0) {
return (Object[]) ((Object[])arg0);
}
}
private class TableLabelProvider implements ITableLabelProvider {
@Override
public void addListener(ILabelProviderListener arg0) {
// TODO Auto-generated method stub
}
@Override
public void dispose() {
// TODO Auto-generated method stub
}
@Override
public boolean isLabelProperty(Object arg0, String arg1) {
// TODO Auto-generated method stub
return false;
}
@Override
public void removeListener(ILabelProviderListener arg0) {
// TODO Auto-generated method stub
}
@Override
public Image getColumnImage(Object arg0, int arg1) {
// TODO Auto-generated method stub
return null;
}
/**
* Gets the text for the specified column
*
* @param arg0
* the row (the data (Object[]) from Object[] tableData)
* @param arg1
* the column (int index)
* @return String
*/
@Override
public String getColumnText(Object arg0, int arg1) {
return (((Object[]) arg0)[arg1])==null ? "" : (((Object[]) arg0)[arg1]).toString();
}
}
private class MyViewerSorter extends ViewerSorter {
private static final int ASCENDING = 0;
private static final int DESCENDING = 1;
private int column;
private int direction;
/**
* Does the sort. If it's a different column from the previous sort, do
* an ascending sort. If it's the same column as the last sort, toggle
* the sort direction.
*
* @param column
*/
public void doSort(int column) {
tableViewer.setLabelProvider(new TableLabelProvider());
if (column == this.column) {
// Same column as last sort, toggle the sorting direction
direction = 1 - direction;
} else {
// Other column than last sort, do a descending sort
for (TableColumn tc : table.getColumns()) {
tc.setImage(null);
}
this.column = column;
direction = DESCENDING;
}
switch (direction) {
case ASCENDING:
table.getColumn(column).setImage(SWTResourceManager.getImage(MyTableViewer.class, "/images/sort_ascending.png"));
break;
case DESCENDING:
table.getColumn(column).setImage(SWTResourceManager.getImage(MyTableViewer.class, "/images/sort_descending.png"));
break;
}
}
/**
* Compares the object for sorting
*/
public int compare(Viewer viewer, Object e1, Object e2) {
int compareResult = 0;
compareResult = Collator.getInstance().compare(((Object[]) e1)[column], ((Object[]) e2)[column]);
// If descending order, flip the direction
if (direction == DESCENDING)
compareResult = -compareResult;
return compareResult;
}
}
// update method doesn't work for cell.setStyleRanges
private class MyColumnLabelProvider extends ColumnLabelProvider {
private final int columnIndex;
MyColumnLabelProvider(int columnIndex) {
this.columnIndex = columnIndex;
}
@Override
public String getText(Object element) {
return super.getText( ((Object[])element)[columnIndex].toString() );
//return ((Object[])element)[columnIndex].toString();
}
@Override
public void update(ViewerCell cell) {
if ( cell.getText().toLowerCase().contains(text_Search.getText().toLowerCase()) ) {
System.out.println("yes -> " + cell.getText().toLowerCase().indexOf(text_Search.getText().toLowerCase()) + ", " + text_Search.getText().length());
StyleRange myStyledRange =
new StyleRange( cell.getText().toLowerCase().indexOf(text_Search.getText().toLowerCase()), text_Search.getText().length(), null, Display.getCurrent().getSystemColor(SWT.COLOR_YELLOW));
StyleRange[] range = { myStyledRange };
cell.setStyleRanges(range);
//cell.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_YELLOW));
}
Rectangle cellBounds = cell.getBounds();
cell.getControl().redraw(cellBounds.x, cellBounds.y, cellBounds.width,
cellBounds.height, true);
super.update(cell);
}
}
private class MyStyledCellLabelProvider extends StyledCellLabelProvider{
private final int columnIndex;
MyStyledCellLabelProvider(int columnIndex) {
this.columnIndex = columnIndex;
}
@Override
public void update(ViewerCell cell) {
if ( cell.getText().toLowerCase().contains(text_Search.getText().toLowerCase()) ) {
StyleRange myStyleRange =
new StyleRange( cell.getText().toLowerCase().indexOf(text_Search.getText().toLowerCase()), text_Search.getText().length(), null, Display.getCurrent().getSystemColor(SWT.COLOR_YELLOW));
StyleRange[] styleRanges = { myStyleRange };
cell.setStyleRanges(styleRanges);
//cell.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_YELLOW));
}
else {
cell.setStyleRanges(null);
}
super.update(cell);
}
}
private SelectionAdapter createAdapterFor(final TableViewer tableViewer) {
return new SelectionAdapter() {
boolean b = true;
@Override
public void widgetSelected(SelectionEvent e) {
if (b) {
tableViewer.setFilters(new ViewerFilter[] { createFilterForViewer() });
for ( int i=0 ; i<tableViewerColumnList.size() ; i++) {
tableViewerColumnList.get(i).setLabelProvider(new MyStyledCellLabelProvider(i));
}
tableViewer.refresh();
b = false;
} else {
tableViewer.setFilters(new ViewerFilter[0]);
tableViewer.setLabelProvider(new TableLabelProvider());
b = true;
}
}
};
}
private ViewerFilter createFilterForViewer() {
return new ViewerFilter() {
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
boolean check = false;
for (Object cellData : ((Object[]) element)) {
check = cellData.toString().toLowerCase().contains(text_Search.getText().toLowerCase());
if (check) {
return check;
}
}
return check;
}
};
}
class TableData {
Object[] get(int numberOfRows, int numberOfColumns) {
Object[] tabledata = new Object[numberOfRows];
int random;
for (int r=0 ; r<numberOfRows ; r++) {
Object[] row = new Object[numberOfColumns];
for (int c = 0 ; c<numberOfColumns ; c++) {
random = (int)(Math.random() * numberOfRows + 1);
row[c] = "Item - "+ random + " - (" + r + "," + c + ")";
}
tabledata[r] = row;
}
return tabledata;
}
}
}
包mydbtable.gui;
导入java.util.ArrayList;
导入java.util.List;
导入org.eclipse.jface.action.MenuManager;
导入org.eclipse.jface.action.StatusLineManager;
导入org.eclipse.jface.action.ToolBarManager;
导入org.eclipse.jface.viewers.ColumnLabelProvider;
导入org.eclipse.jface.viewers.ILabelProviderListener;
导入org.eclipse.jface.viewers.IStructuredContentProvider;
导入org.eclipse.jface.viewers.ITableLabelProvider;
导入org.eclipse.jface.viewers.StyledCellLabelProvider;
导入org.eclipse.jface.viewers.TableViewer;
导入org.eclipse.jface.viewers.TableViewerColumn;
导入org.eclipse.jface.viewers.Viewer;
导入org.eclipse.jface.viewers.ViewerCell;
导入org.eclipse.jface.viewers.ViewerFilter;
导入org.eclipse.jface.viewers.ViewerSorter;
导入org.eclipse.jface.window.ApplicationWindow;
导入org.eclipse.swt.swt;
导入org.eclipse.swt.custom.StyleRange;
导入org.eclipse.swt.events.SelectionAdapter;
导入org.eclipse.swt.events.SelectionEvent;
导入org.eclipse.swt.graphics.Image;
导入org.eclipse.swt.graphics.Point;
导入org.eclipse.swt.graphics.Rectangle;
导入org.eclipse.swt.layout.GridData;
导入org.eclipse.swt.layout.GridLayout;
导入org.eclipse.swt.widgets.Button;
导入org.eclipse.swt.widgets.Composite;
导入org.eclipse.swt.widgets.Control;
导入org.eclipse.swt.widgets.Display;
导入org.eclipse.swt.widgets.Shell;
导入org.eclipse.swt.widgets.Table;
导入org.eclipse.swt.widgets.TableColumn;
导入org.eclipse.swt.widgets.Text;
导入org.eclipse.wb.swt.SWTResourceManager;
导入com.ibm.icu.text.Collator;
公共类TableWithSortAndSearch扩展了应用程序窗口{
私有对象[]表数据;
私有文本搜索;
私人餐桌;
私人桌面浏览器;
私人按钮搜索;
私有列表tableViewerColumnList;
/**
*创建应用程序窗口。
*/
PublicTableWithSortAndSearch(){
超级(空);
createActions();
添加工具栏(SWT.FLAT | SWT.WRAP);
addMenuBar();
addStatusLine();
}
/**
*创建应用程序窗口的内容。
*@param父级
*/
@凌驾
受保护的控件createContents(复合父级){
tableData=(newtabledata()).get(5,4);
tableViewerColumnList=新建ArrayList();
复合容器=新复合(父级,SWT.NONE);
setLayout(新的GridLayout(1,false));
复合材料=新复合材料(容器,SWT.NONE);
setLayoutData(新的GridData(SWT.FILL,SWT.CENTER,true,false,1,1));
复合立根(0,0,10,10);
setLayout(新的GridLayout(2,false));
{
text_Search=新文本(复合,SWT.BORDER);
text_Search.setLayoutData(新的GridData(SWT.RIGHT,SWT.CENTER,true,false,1,1));
文本搜索设置大小(78,23);
}
{
BTN搜索=新按钮(复合,SWT.NONE);
setLayoutData(新的GridData(SWT.RIGHT,SWT.CENTER,false,false,1,1));
BTN搜索设置大小(54,27);
btnSearch.setText(“搜索”);
}
复合材料表=新复合材料(容器,SWT.NONE);
组合_Table.setLayoutData(新的GridData(SWT.FILL,SWT.FILL,true,true,1,1));
复合_表.立根(0,0,64,64);
组合_Table.setLayout(新的GridLayout(1,false));
{
tableViewer=新的tableViewer(复合表格,SWT.BORDER,SWT.FULL_选择);
table=tableViewer.getTable();
表.setLinesVisible(真);
表.setheadervible(true);
setLayoutData(新的GridData(SWT.FILL,SWT.FILL,true,true,1,1));
表.设置尺寸(339,84);
TableViewer列TableViewer列;
int[]columnIdices={0,1,2,3};
for(最终int columnIndex:columnIdices){
//列=i;
tableViewerColumn=新的tableViewerColumn(tableViewer,SWT.NONE);
TableColumn TableColumn=tableViewerColumn.getColumn();
tableColumn.setMoveable(真);
tableColumn.setWidth(150);
tableColumn.setText(“数据”+列索引);
//tableViewerColumn.setLabelProvi