1

テーブルの最後の列にボタンが表示されます。ユーザーがボタンをクリックすると、ボタンと同じ行にもあるファイルを開きたいです。

ここに画像の説明を入力

ボタンの列コードは次のとおりです。

 case 6:
               Map<Object, Button> buttons = new HashMap<Object, Button>();   
               TableItem item = (TableItem) cell.getItem();
               Button button;
               if(buttons.containsKey(cell.getElement())) {
                  button = buttons.get(cell.getElement());
               }
               else
               {
                 button = new Button((Composite) cell.getViewerRow().getControl(),SWT.PUSH);
                 //button.setText("Adobe");
                 button.setImage(loadImage("/images/AdobeIcon.png"));

                 buttons.put(cell.getElement(), button);
               }
               TableEditor editor = new TableEditor(item.getParent());
               editor.grabHorizontal  = true;
               editor.grabVertical = true;
               editor.setEditor(button , item, cell.getColumnIndex());
               button.addListener(SWT.Selection, new SelectionListener(item, button, cell.getElement()));
               editor.layout();
  1. 選択したインデックスをリスナー クラスに送信することはできますか? 最初のボタンをクリックした場合 - 0 を送信 2 番目のボタンをクリックした場合 - 1 を送信

  2. TableEditor も必要ですか?

それが可能であれば、リスナーのコードが簡単になります。

これは、リスナーコードで私が試していることです。

  @Override
  public void handleEvent(Event event) {
     AplotSaveDataModel.SaveData selected = (( AplotSaveDataModel.SaveData)element);
     int index = AplotSaveDataModel.getInstance().getIndexOf(selected);
     final File viewerFile = new File(AplotSaveDataModel.getInstance().getSelectedPDFFileName(index));
     try {
        Desktop.getDesktop().open(viewerFile);
     }
     catch (IOException e) {
        e.printStackTrace();
     }
  }
  1. 上記のコードが常に 0 のインデックスを返すのはなぜですか?

編集

ボタンのデータで行インデックスを取得する方法を完全には理解していません。

button.setData("row.id", rowId); 

「row.id」がキーで、rowId が値であると想定しています。したがって、行インデックスを取得するには、rowId にコードを入力する必要があります。

int rowId = "Some code to get the Row Index"?

列のインデックスを取得したい場合は、

int rowId = cell.getColumnIndex();

行インデックス/番号を取得できるようにrowIdを設定する方法がわかりませんか?

列番号を取得するコードは次のとおりです (これは必要ありません)。

 case 6:
               Map<Object, Button> buttons = new HashMap<Object, Button>();   
               TableItem item = (TableItem) cell.getItem();
               Button button;
           ***int rowId = cell.getColumnIndex();***
               if(buttons.containsKey(cell.getElement())) {
                  button = buttons.get(cell.getElement());
               }
               else
               {
                 button = new Button((Composite) cell.getViewerRow().getControl(),SWT.PUSH);
                 //button.setText("Adobe");
                 button.setImage(loadImage("/images/AdobeIcon.png"));
              ***button.setData("row.id", rowId);***
                 buttons.put(cell.getElement(), button);
               }
               TableEditor editor = new TableEditor(item.getParent());
               editor.grabHorizontal  = true;
               editor.grabVertical = true;
               editor.setEditor(button , item, cell.getColumnIndex());
               button.addListener(SWT.Selection, new SelectionListener(item, button, cell.getElement()));
               editor.layout();
              }

リスナー クラス

    @Override
    public void handleEvent(Event event) {
     if (event.widget instanceof Button) {
        int rowId = (Integer) event.widget.getData("row.id");
        System.out.println("Row Int " + rowId + "\n");
     }

これを機能させるのを手伝ってください-これは私のプロジェクトの非常に重要な部分です

***編集2********

 public class AplotPDFResultsTableViewer extends TableViewer {

 public AplotPDFResultsTableViewer(Composite parent, int style) {
  super(parent, style);
  Table table = getTable();
  GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
  table.setLayoutData(gridData);
  createColumns();
  table.setHeaderVisible(true);
  table.setLinesVisible(true);
  setContentProvider(new ArrayContentProvider());
}

public static Image loadImage(String path)
{
  Image newImage = null;
  try {
     newImage = new Image(null, AplotPDFResultsTableViewer.class.getClassLoader().getResourceAsStream(path));
  }
  catch(SWTException ex) {
      System.out.println("Couldn't find " + path);
      ex.printStackTrace();
  }
  return newImage;
}

private void createColumns() {

  TableViewerColumn col = new TableViewerColumn(this , SWT.NONE);
  col.getColumn().setWidth(150);
  col.getColumn().setText("Creation Date");
  col.setLabelProvider(new ColorColumnLabelProvider());

  col = new TableViewerColumn(this , SWT.NONE);
  col.getColumn().setWidth(150);
  col.getColumn().setText("ItemId");
  col.setLabelProvider(new ColorColumnLabelProvider());

  col = new TableViewerColumn(this , SWT.NONE);
  col.getColumn().setWidth(50);
  col.getColumn().setText("RevId");
  col.setLabelProvider(new ColorColumnLabelProvider());

  col = new TableViewerColumn(this , SWT.NONE);
  col.getColumn().setWidth(50);
  col.getColumn().setText("PRL");
  col.setLabelProvider(new ColorColumnLabelProvider());

  col = new TableViewerColumn(this , SWT.NONE);
  col.getColumn().setWidth(200);
  col.getColumn().setText("File Location");
  col.setLabelProvider(new ColorColumnLabelProvider());

  col = new TableViewerColumn(this , SWT.NONE);
  col.getColumn().setWidth(200);
  col.getColumn().setText("File Name");
  col.setLabelProvider(new ColorColumnLabelProvider());

  col = new TableViewerColumn(this , SWT.NONE);
  col.getColumn().setWidth(50);
  col.getColumn().setText("");
  col.setLabelProvider(new ColorColumnLabelProvider());
}


public class ColorColumnLabelProvider extends ColumnLabelProvider {
  @Override
  public void update(final ViewerCell cell) {

      Object element = cell.getElement();
      if(element instanceof AplotSaveDataModel.SaveData) {

         AplotSaveDataModel.SaveData p = (AplotSaveDataModel.SaveData) element;
         switch(cell.getColumnIndex()) {

            case 0:
               cell.setText(p.getDateTime());
               break;
            case 1:
               cell.setText(p.getItemId());
               break;
            case 2:
               cell.setText(p.getRevId());
               break;
            case 3:
               cell.setText(p.getPRL());
               break;
            case 4:
               //cell.setForeground(black);
               cell.setText(p.getFileDir());
               break;
            case 5:
               //cell.setForeground(black);
               cell.setText(p.getfileName());
               break;
            case 6:
               Map<Object, Button> buttons = new HashMap<Object, Button>();   
               TableItem item = (TableItem) cell.getItem();
               Button button;
               int rowId = cell.getColumnIndex();
               if(buttons.containsKey(cell.getElement())) {
                  button = buttons.get(cell.getElement());
               }
               else
               {
                 button = new Button((Composite) cell.getViewerRow().getControl(),SWT.PUSH);
                 //button.setText("Adobe");
                 button.setImage(loadImage("/images/AdobeIcon.png"));
                 button.setData("row.id", rowId);
                 buttons.put(cell.getElement(), button);
               }
               TableEditor editor = new TableEditor(item.getParent());
               editor.grabHorizontal  = true;
               editor.grabVertical = true;
               editor.setEditor(button , item, cell.getColumnIndex());
               button.addListener(SWT.Selection, new SelectionListener(item, button, cell.getElement()));
               editor.layout();
              }
          }
      }
}// End ColorColumnLabelProvider Class

// ===============================================================
//
//    SelectionListener Class
//
// ===============================================================
class SelectionListener implements Listener {
  TableItem item;
  Button editButton;
  Object element;

  //////////////////////////////////////////////////////////////////////////
  //                         Constructor                                  //
  //////////////////////////////////////////////////////////////////////////
  public SelectionListener(TableItem item, Button editButton, Object element) {
      this.item = item;
      this.editButton = editButton;
      this.element = element;
   }

  //////////////////////////////////////////////////////////////////////////
  //                         handleEvent                                  //
  //////////////////////////////////////////////////////////////////////////
  @Override
  public void handleEvent(Event event) {
     if (event.widget instanceof Button) {
        int rowId = (Integer) event.widget.getData("row.id");
        System.out.println("Row Int " + rowId + "\n");
     }
     //AplotSaveDataModel.SaveData selected = (( AplotSaveDataModel.SaveData)element);
     //int index = AplotSaveDataModel.getInstance().getIndexOf(selected);
     //final File viewerFile = new   File(AplotSaveDataModel.getInstance().getSelectedPDFFileName(index));
     //try {
     //   Desktop.getDesktop().open(viewerFile);
     //}
     //catch (IOException e) {
     //   e.printStackTrace();
    //}
  }
}// End SelectionListener Class
}  // End AplotPDFTableViewer Class   
4

1 に答える 1

4

ボタンインスタンスごとに、どの行のボタンが押されたかを識別するのに役立つデータをウィジェットに設定できます。ボタンを作成するとき:

Button button = ...
button.setData("row.id", rowId); // Can also use row index here or something

ファイルパスをデータとして直接保存することもできます。そしてリスナーの中で:

@Override
public void handleEvent(Event event) {
    if (event.widget instanceof Button) {
        String rowId = event.widget.getData("row.id");
        ...
    }
    ...
}
于 2013-01-08T10:52:10.137 に答える