5

行が 0、列が 6 の SWT テーブルがあります。

テーブル ヘッダーのいずれかを右クリックすると、クリックされたテーブル列のインデックスを計算するにはどうすればよいですか?

4

5 に答える 5

4

いつか右クリックでCustomTableforを書きました。TableHeader Menu

TableColumnこのコードは、テーブル ヘッダーの右クリックを検出するのに役立ちます。ただし、列の順序が変更されると、このコードは壊れます。ただし、並べ替えられた列の順序と元の列の順序のインデックスを比較して修正できます。

addListener(SWT.MenuDetect, new Listener() {
        @Override
        public void handleEvent(Event e) {
            Point pt = getShell().getDisplay().map(null, CustomTable.this, new Point(e.x, e.y));
            Rectangle clientArea = CustomTable.this.getClientArea();
            boolean header = clientArea.y <= pt.y && pt.y < (clientArea.y + CustomTable.this.getHeaderHeight());
            //code to calculate column of Right click - START
            int width = 0;
            for(int i = 0; i< CustomTable.this.getColumns().length; i++){
                TableColumn tc = CustomTable.this.getColumns()[i];
                if(width < pt.x  &&  pt.x < width + tc.getWidth()){
                    System.out.println("Right Click on " + tc.getText());
                }
                width += tc.getWidth();
            }
            //code to calculate column of Right click - END
            if (header) {
                if(tableMenu != null){
                    tableMenu.setVisible(false);
                }
                CustomTable.super.setMenu(headerMenu);
                headerMenu.setLocation(e.x, e.y);
                headerMenu.setVisible(true);
                e.doit = false;
            } else {
                headerMenu.setVisible(false);
                CustomTable.super.setMenu(tableMenu);
                if(tableMenu != null){
                    tableMenu.setLocation(e.x, e.y);
                    tableMenu.setVisible(true);
                }
            }
        }
    });
于 2013-06-25T22:17:47.480 に答える
3

ここにあなたが望むことをするいくつかのコードがあります:

private static Map<TableColumn, Integer> mapping = new HashMap<TableColumn, Integer>();

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

    Listener listener = new Listener()
    {
        @Override
        public void handleEvent(Event arg0)
        {
            TableColumn column = (TableColumn) arg0.widget;

            System.out.println(mapping.get(column));
        }
    };

    Table table = new Table(shell, SWT.NONE);
    table.setHeaderVisible(true);

    for(int i = 0; i < 5; i++)
    {
        TableColumn column = new TableColumn(table, SWT.NONE);
        column.setText("Column " + i);
        column.addListener(SWT.Selection, listener);
        column.pack();

        mapping.put(column, i);
    }

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

基本的には、キーとしてMap格納し、値として位置を生成します。TableColumn

Tableまたは、内のすべての列を反復処理しListenerて、クリックした列と比較することもできます。最初のアプローチ (マップ) は高速ですが、より多くのメモリを使用しますが、2 番目のアプローチ (反復) は低速で​​すが、メモリの使用量は少なくなります。

于 2013-06-25T06:33:43.073 に答える
1

上記の例と同様ですが、マップを使用してインデックスを保存することはありません。

...
column.addSelectionListener(getSelectionAdapter1(tbl.getColumnCount()-1));    
...


private SelectionAdapter getSelectionAdapter1(final int index) {
    SelectionAdapter selectionAdapter = new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            System.out.println(index);
        }
    };
    return selectionAdapter;
}
于 2013-06-25T09:45:21.710 に答える