使用相同颜色同步两个表中的选择

时间:2013-07-22 17:54:16

标签: java swt

我在Shell中有两个SWT Table

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

然而,在当前的设置中(我在网上找到了一个Snippet),当单击一行时,相应的行也会突出显示,但它是灰色的。我希望所有选择都是相同的紫色。

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 ();
}
}

1 个答案:

答案 0 :(得分:0)

好的,我为你扔了一些东西。不要介意处理选择的糟糕方式,这不是我想要展示的。重要的部分是我绘制项目背景的位置,即MyLabelProvider s 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