2013-07-22 70 views
0

我在一个Shell中有两个SWT Table使用相同颜色在两个表格中同步选区

当用户点击一个表中的一行时,我想要选择下一个表中的相应行。

但是,在当前的设置中(我正在演示一个片段,我在网上找到)单击一行时,相应的行也会突出显示,但它是灰色的。我希望这个选择在任何地方都是一样的紫色。

Table

的源代码:

import org.eclipse.swt.*; 
import org.eclipse.swt.graphics.*; 
import org.eclipse.swt.layout.*; 
import org.eclipse.swt.widgets.*; 

public class Snippet234 { 
public static void main (String [] args) { 
    int rowCount = 40; 
    int columnCount = 15; 
    final Display display = new Display(); 
    Shell shell = new Shell (display); 
    shell.setLayout(new FillLayout()); 

    Composite parent = new Composite(shell, SWT.BORDER); 
    GridLayout layout = new GridLayout(2, false); 
    layout.marginWidth = layout.marginHeight = layout.horizontalSpacing = 0; 
    parent.setLayout(layout); 
    final Table leftTable = new Table(parent, SWT.MULTI | SWT.FULL_SELECTION); 
    leftTable.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, false, true)); 
    leftTable.setHeaderVisible(true); 
    final Table rightTable = new Table(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION); 
    rightTable.setHeaderVisible(true); 
    GridData table2Data = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 2); 
    rightTable.setLayoutData(table2Data); 
    // Create columns 
    TableColumn column1 = new TableColumn(leftTable, SWT.NONE); 
    column1.setText("Name"); 
    column1.setWidth(150); 
    for (int i = 0; i < columnCount; i++) { 
     TableColumn column = new TableColumn(rightTable, SWT.NONE); 
     column.setText("Value "+i); 
     column.setWidth(200); 
    } 
    // Create rows 
    for (int i = 0; i < rowCount; i++) { 
     TableItem item = new TableItem(leftTable, SWT.NONE); 
     item.setText("item "+i); 
     item = new TableItem(rightTable, SWT.NONE); 
     for (int j = 0; j < columnCount; j++) { 
      item.setText(j, "Item "+i+" value @ "+j); 
     } 
    } 
    // Make selection the same in both tables 
    leftTable.addListener(SWT.Selection, new Listener() { 
     public void handleEvent(Event event) { 
      rightTable.setSelection(leftTable.getSelectionIndices()); 
     } 
    }); 
    rightTable.addListener(SWT.Selection, new Listener() { 
     public void handleEvent(Event event) { 
      leftTable.setSelection(rightTable.getSelectionIndices()); 
     } 
    }); 
    // On Windows, the selection is gray if the table does not have focus. 
    // To make both tables appear in focus, draw the selection background here. 
    // This part only works on version 3.2 or later. 
    /* 
    Listener eraseListener = new Listener() { 
     public void handleEvent(Event event) { 
      event.detail &= ~SWT.HOT; 
      if((event.detail & SWT.SELECTED) != 0) { 
       GC gc = event.gc; 
       Rectangle rect = event.getBounds(); 
       gc.setForeground(display.getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT)); 
       gc.setBackground(display.getSystemColor(SWT.COLOR_LIST_SELECTION)); 
       gc.fillRectangle(rect); 
       event.detail &= ~SWT.SELECTED;     
      } 
     } 
    }; 

    leftTable.addListener(SWT.EraseItem, eraseListener); 
    rightTable.addListener(SWT.EraseItem, eraseListener); 
    */ 

    // Make vertical scrollbars scroll together 
    ScrollBar vBarLeft = leftTable.getVerticalBar(); 
    vBarLeft.addListener(SWT.Selection, new Listener() { 
     public void handleEvent(Event event) { 
      rightTable.setTopIndex(leftTable.getTopIndex()); 
     } 
    }); 
    ScrollBar vBarRight = rightTable.getVerticalBar(); 
    vBarRight.addListener(SWT.Selection, new Listener() { 
     public void handleEvent(Event event) { 
      leftTable.setTopIndex(rightTable.getTopIndex()); 
     } 
    }); 

    // Horizontal bar on second table takes up a little extra space. 
    // To keep vertical scroll bars in sink, force table1 to end above 
    // horizontal scrollbar 
    ScrollBar hBarRight = rightTable.getHorizontalBar(); 
    Label spacer = new Label(parent, SWT.NONE); 
    GridData spacerData = new GridData(); 
    spacerData.heightHint = hBarRight.getSize().y; 
    spacer.setVisible(false); 
    parent.setBackground(leftTable.getBackground()); 

    shell.setSize(600, 400); 
    shell.open(); 
    while (!shell.isDisposed()) { 
     if (!display.readAndDispatch()) display.sleep(); 
    } 
    display.dispose(); 
} 
} 
+0

任何反馈给我的答案? – Baz

回答

0

好吧,我扔东西一起给你。不介意处理选择的蹩脚方式,这不是我想要展示的。最重要的部分是我画项目的背景,即在MyLabelProvider小号paint()方法:

public static void main(String[] args) 
{ 
    Display display = new Display(); 
    final Shell shell = new Shell(display); 
    shell.setText("StackOverflow"); 
    shell.setLayout(new FillLayout()); 

    final TableViewer first = new TableViewer(shell); 
    addColumn(first); 
    first.setContentProvider(ArrayContentProvider.getInstance()); 
    final List<MyObject> firstInput = getInput(); 
    first.setInput(firstInput); 
    first.setLabelProvider(new MyLabelProvider()); 

    final TableViewer second = new TableViewer(shell); 
    addColumn(second); 
    second.setContentProvider(ArrayContentProvider.getInstance()); 
    final List<MyObject> secondInput = getInput(); 
    second.setInput(secondInput); 
    second.setLabelProvider(new MyLabelProvider()); 

    first.addSelectionChangedListener(new ISelectionChangedListener() 
    { 
     @Override 
     public void selectionChanged(SelectionChangedEvent e) 
     { 
      int index = first.getTable().getSelectionIndex(); 
      second.getTable().setSelection(index); 

      setSelection(firstInput, index); 
      setSelection(secondInput, index); 
     } 
    }); 

    second.addSelectionChangedListener(new ISelectionChangedListener() 
    { 
     @Override 
     public void selectionChanged(SelectionChangedEvent e) 
     { 
      int index = second.getTable().getSelectionIndex(); 
      first.getTable().setSelection(index); 

      setSelection(firstInput, index); 
      setSelection(secondInput, index); 
     } 
    }); 

    shell.pack(); 
    shell.open(); 
    while (!shell.isDisposed()) 
    { 
     if (!display.readAndDispatch()) 
      display.sleep(); 
    } 
    display.dispose(); 
} 

private static void setSelection(List<MyObject> input, int index) 
{ 
    for(MyObject obj : input) 
    { 
     obj.setSelected(false); 
    } 

    input.get(index).setSelected(true); 
} 

private static List<MyObject> getInput() 
{ 
    List<MyObject> result = new ArrayList<MyObject>(); 

    result.add(new MyObject("First")); 
    result.add(new MyObject("Second")); 
    result.add(new MyObject("Third")); 

    return result; 
} 

private static void addColumn(TableViewer viewer) 
{ 
    TableViewerColumn col = new TableViewerColumn(viewer, SWT.NONE); 
    col.getColumn().setWidth(200); 
    col.getColumn().setText("Name:"); 
    col.setLabelProvider(new ColumnLabelProvider() 
    { 
     @Override 
     public String getText(Object element) 
     { 
      MyObject value = (MyObject) element; 
      return value.getName(); 
     } 
    }); 
} 

private static class MyObject 
{ 
    private String name; 
    private boolean isSelected; 

    public MyObject(String name) 
    { 
     this.name = name; 
    } 

    public String getName() 
    { 
     return name; 
    } 

    public void setName(String name) 
    { 
     this.name = name; 
    } 

    public boolean isSelected() 
    { 
     return isSelected; 
    } 

    public void setSelected(boolean isSelected) 
    { 
     this.isSelected = isSelected; 
    } 

    @Override 
    public String toString() 
    { 
     return name; 
    } 
} 

private static class MyLabelProvider extends StyledCellLabelProvider 
{ 
    @Override 
    protected void paint(Event event, Object element) 
    { 
     int width = 1000; 
     int x = event.x - 2; 
     int y = event.y; 

     int height = event.height; 
     GC gc = event.gc; 

     MyObject object = (MyObject) element; 

     Color oldBackground = gc.getBackground(); 

     Color color = object.isSelected ? Display.getCurrent().getSystemColor(SWT.COLOR_LIST_SELECTION) : Display.getCurrent().getSystemColor(SWT.COLOR_LIST_BACKGROUND); 

     gc.setBackground(color); 

     gc.fillRectangle(x, y, width, height); 

     gc.setBackground(oldBackground); 

     super.paint(event, element); 
    } 
} 

这里有两张截图,选择第一,然后在第三行后(无所谓哪TableViewer):

enter image description here enter image description here

相关问题