java - 在表格单元格中查找单击按钮的行索引

标签 java swt

我表格的最后一列填充了一个按钮。当用户单击按钮时,我想打开一个与按钮位于同一行的文件。

enter image description here

这是按钮的列代码。

 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 如果他们点击第二个按钮 - 发送 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   

最佳答案

对于每个按钮实例,您可以在小部件上设置一个数据,以帮助您识别按下了哪一行的按钮。创建按钮时:

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");
        ...
    }
    ...
}

关于java - 在表格单元格中查找单击按钮的行索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14201879/

相关文章:

java - 拖动时滚动表格

clojure - 在 Mac OS X 上使用带有 "lein repl"的 SWT

java - 为什么 Point 的 Set.contains() 比大小为 2 的 List<Integer> 快得多?

java - 使数据模型类可序列化

java - 将 add_jar 与 Swig 生成的 Java 绑定(bind)一起使用的正确方法是什么?

java - 树查看器不会取消选择树项目

java - Dropwizard 迁移 Liquibase 新变更集未迁移

java - 从 Java SE 程序调用 Web 服务方法

java - 始终打开(创建)Eclipse RCP View

eclipse - 在 Eclipse RCP 应用程序中查找当前选定 View 的 ID