0

私のアプリケーションでは、2 つのテーブルを取得しました。テーブル A には、テーブル B のオプションの列が含まれています。「列」(テーブル A の tableItem) をドラッグしてテーブル B にドロップできるはずです。テーブル B は、ドラッグされた tableItems を新しい列として使用する必要があります。これはうまくいきます。表 B にそれらを追加します。

これで、テーブル B に正しい順序で列が追加されます。org.eclipse.swt.dnd.DropTargetEvent は、その位置 (DropTargetEvent.x / y) を認識しています。そのため、ドロップ位置の列/列インデックスを把握する必要があるため、column.atPoint(x,y) の隣に「新しい列」を追加できます。org.eclipse.swt.widgets.Table 自体は getColumn(int index) というメソッドを取得しました。これを理解する方法はありますか?

4

1 に答える 1

1

マウス クリック イベントの列を出力するコードを次に示します。マウス クリックの代わりにドロップの場所を使用するように変更できます。

public static void main(String[] args)
{
    Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setText("Stackoverflow");
    shell.setLayout(new RowLayout(SWT.VERTICAL));

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

    for(int col = 0; col < 3;  col++)
    {
        TableColumn column = new TableColumn(table, SWT.NONE);
        column.setText("Col: " + col);
    }

    for(int row = 0; row < 20; row++)
    {
        TableItem item = new TableItem(table, SWT.NONE);

        for(int col = 0; col < table.getColumnCount();  col++)
        {
            item.setText(col, row + " " + col);
        }
    }

    for(int col = 0; col < table.getColumnCount();  col++)
    {
        table.getColumn(col).pack();
    }

    table.addListener(SWT.MouseDown, new Listener()
    {
        @Override
        public void handleEvent(Event e)
        {
            Table table = (Table) e.widget;

            System.out.println("Column: " + getColumn(table, e.x));
        }
    });

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

private static int getColumn(Table table, int x)
{
    int overallWidth = 0;

    for(int i = 0; i < table.getColumnCount(); i++)
    {
        overallWidth += table.getColumn(i).getWidth();
        if(x < overallWidth)
        {
            return i;
        }
    }

    return -1;
}
于 2013-10-25T13:30:14.633 に答える