Java SWT Выбор строки таблицы - PullRequest
0 голосов
/ 12 мая 2018

У меня проблема с выбором строки Table.Всегда, когда я нажимаю на CCombo, строка не выделяется.(См. System.output 0 или -1). Как я могу выбрать строку в таблице SWT.Я хочу получить строку в SelectionListener.Спасибо за ответы.Пример следующий:

public class FrameVerwaltung  {

    private Display display;
    private Shell shell;
    private Table tableLoc;
    private String[] colNames = { "Name",  "ToDo",};
    private static FrameVerwaltung frame;
    private org.eclipse.swt.graphics.Color colorYellow;

    public static void main (String[] args) {
        frame = new FrameVerwaltung();
    }

    public FrameVerwaltung() {
        display = new Display();
        shell = new Shell(display);
        FormLayout layout = new FormLayout();
        shell.setLayout(layout);
        colorYellow = display.getSystemColor(SWT.COLOR_YELLOW);

        pSetTable();

        shell.setText("");
        shell.pack();
        //shell.setSize(1500, 1000);
        shell.open();
        shell.setMaximized(true);

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

        display.dispose();  
    }


    private void pSetTable() {
        tableLoc = new Table(shell, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
        GridData gridData= new GridData();

        tableLoc.setLinesVisible(true);
        tableLoc.setHeaderVisible(true);

        pSetTableColumn();
        //*table.setToolTipText("Eine Tabelle");
        psetTableRows();
    }

    private void pSetTableColumn() {
        TableColumn[] cols = new TableColumn[colNames.length];
        int[] order = new int[colNames.length];
        for (int i = 0; i < colNames.length; i++) {

            TableColumn tc = new TableColumn(tableLoc, SWT.BORDER);

            tc.setText(colNames[i]);
            switch (i){
            case 0:
                tc.setWidth(200);
                break;
            case 1:
                tc.setWidth(50);
                break;
            }
            tc.setResizable(true);

            //tc.setMoveable(true);
            cols[i] = tc;
            order[i] = i;

        }
    }

    private void psetTableRows() {
        for (int k = 0; k < 7; k++) {
            TableItem itemTmp = new TableItem(tableLoc, SWT.BORDER);

            itemTmp.setText(0,String.valueOf(k));
            pSetTableRowToDo(itemTmp);  
        }
    }

    private void pSetTableRowToDo(TableItem itemIn) {
        TableEditor editor = new TableEditor(tableLoc);
        CCombo comboboxAction = new CCombo(tableLoc, SWT.BORDER | SWT.CHECK | SWT.MULTI
                | SWT.FULL_SELECTION);
        comboboxAction.setText("=");
        comboboxAction.add("=");
        comboboxAction.add(">");
        comboboxAction.add("<");
        comboboxAction.add("?");
        comboboxAction.add("x");

        editor.grabHorizontal = true;
        editor.setEditor(comboboxAction,itemIn,1);
        editor = new TableEditor(tableLoc);
        comboboxAction.addSelectionListener(new SelectionListener() {

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void widgetSelected(SelectionEvent arg0) {
                // TODO Auto-generated method stub
                for (int i=0;i<7;i++) {     
                    CCombo ccoboTmp = (CCombo) arg0.getSource();

                    TableItem[] tableItem = tableLoc.getSelection();
                    System.out.println(tableItem.length);
                    System.out.println(tableLoc.getSelectionIndex());
                }
            }

        });
    }

}

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Решение 1: Одним из способов выбора строки таблицы при выборе CCombo является передача индекса строки в pSetTableRowToDo() при создании каждой строки, а затем в comboboxAction.addSelectionListener() do tableLoc.setSelection(rowToSelect), который прекрасно работает, как показано ниже.

private void psetTableRows() {
        for (int rowIndex = 0; rowIndex < 7; rowIndex++) {
            TableItem itemTmp = new TableItem(tableLoc, SWT.BORDER);

            itemTmp.setText(0, String.valueOf(rowIndex));
            pSetTableRowToDo(itemTmp, rowIndex);
        }
    }


private void pSetTableRowToDo(TableItem itemIn, int rowIndex) {
        TableEditor editor = new TableEditor(tableLoc);
        CCombo comboboxAction = new CCombo(tableLoc, SWT.BORDER | SWT.CHECK | SWT.MULTI | SWT.FULL_SELECTION);
        comboboxAction.setText("=");
        comboboxAction.add("=");
        comboboxAction.add(">");
        comboboxAction.add("<");
        comboboxAction.add("?");
        comboboxAction.add("x");

        editor.grabHorizontal = true;
        editor.setEditor(comboboxAction, itemIn, 1);
        editor = new TableEditor(tableLoc);
        comboboxAction.addSelectionListener(new SelectionListener() {

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }

            @Override
            public void widgetSelected(SelectionEvent arg0) {
                tableLoc.setSelection(rowIndex);
                tableLoc.forceFocus();
                System.out.println("Selected Table Row Index: " +tableLoc.getSelectionIndex());
            }

        });
    }

Решение 2: Другой подход заключается в том, чтобы получить индекс tableItem и установить выбор в этот индекс, который работает идеально, как показано ниже. Возможно, вы захотите использовать tableLoc.forceFocus();, чтобы выбранная строка была сфокусирована.

private void pSetTableRowToDo(TableItem itemIn) {
        TableEditor editor = new TableEditor(tableLoc);
        CCombo comboboxAction = new CCombo(tableLoc, SWT.BORDER | SWT.CHECK | SWT.MULTI | SWT.FULL_SELECTION);
        comboboxAction.setText("=");
        comboboxAction.add("=");
        comboboxAction.add(">");
        comboboxAction.add("<");
        comboboxAction.add("?");
        comboboxAction.add("x");

        editor.grabHorizontal = true;
        editor.setEditor(comboboxAction, itemIn, 1);
        editor = new TableEditor(tableLoc);
        comboboxAction.addSelectionListener(new SelectionListener() {

            @Override
            public void widgetDefaultSelected(SelectionEvent arg0) {
            }

            @Override
            public void widgetSelected(SelectionEvent arg0) {
                int indexOf = tableLoc.indexOf(itemIn);
                tableLoc.setSelection(indexOf);
                tableLoc.forceFocus();
                System.out.println("Selected Table Row Index: " + tableLoc.getSelectionIndex());
            }

        });
    }
0 голосов
/ 13 мая 2018

В вашем методе pSetTableRowToDo вы передаете TableItem, к которому добавляется CCombo, поэтому в вашем SelectionListener вы можете использовать это, вызывая:

tableLoc.indexOf(itemIn); (см .: Table.indexOf(TableItem))

Обратите внимание, что вам нужно задать для параметра itemIn значение pSetTableRowToDo final, но это совсем не проблема и на самом деле предпочтительнее.

С этим индексом вы можете затем позвонить tableLoc.setSelection(int).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...