2013-01-07 138 views
1

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

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(); 
    } 
    } 
  • 为什么上面总是返回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"); 
        } 
    

    请帮我得到这个工作 - 这是一个非常重要的部分我项目

    *** EDIT 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 
    
    +0

    能请你也加入'ArrayContentProvider' –

    +0

    @Waqas llyas,​​你的意思是其他然后setContentProvider(新ArrayContentProvider());那是在班级的顶部? – jkteater

    +0

    是的,但ArrayContentProvider的完整类在哪里?它来自API吗? –

    回答

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

    llyas我没有太多的运气搞清楚如何使用setData。 – jkteater

    +0

    你面临什么问题?在按钮上设置数据应该很简单。你能解释你的问题吗? –

    +0

    我将在上面的评论中放置我使用的代码并解释发生了什么 – jkteater

    相关问题