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

时间:2013-01-07 18:32:14

标签: 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?

  3. 如果可以的话,它会使听众代码变得容易。

    这就是我在侦听器代码中正在尝试的。

      @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?
    2. 修改

      我不完全了解如何在按钮的数据中获取行索引。

      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   
      

1 个答案:

答案 0 :(得分: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");
        ...
    }
    ...
}