2012-09-18 22 views
7

क्या एक तालिका में किसी कक्ष में बटन निकालना संभव है?किसी तालिका में किसी कॉलम में निकालें बटन जोड़ना

मेरे पास 5 कॉलम वाली एक टेबल है, मैं 6 वें कॉलम जोड़ना चाहता हूं। मैं चाहता हूं कि 6 वें कॉलम में प्रत्येक पंक्ति में एक निकालें बटन हो।

उदाहरण पंक्ति:

| 10002 | भाग | धातु | 001 | हां | हटाएं |

इस तरह से उपयोगकर्ता बटन पर क्लिक करके किसी भी अवांछित पंक्तियों को हटा सकता है।

मेरे पास तालिका में एक मार्कअप कॉलम है और यह ComboBox है। मैंने एक कक्षा बनाई जो EditingSupport फैली हुई है।

क्या मुझे EditingSupport का विस्तार करने वाली एक और कक्षा बनाने की आवश्यकता होगी, लेकिन ComboBox के बजाय एक बटन बनाना होगा?

संपादित

public class AplotDataTableViewer extends TableViewer 
{ 

    public AplotDataTableViewer(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()); 
    } 

    private void createColumns() { 

     String[] titles = { "ItemId", "RevId", "PRL", "Dataset Name", "EC Markup" }; 
     int[] bounds = { 150, 150, 100, 150, 100 }; 

     TableViewerColumn col = createTableViewerColumn(titles[0], bounds[0], 0); 
     col.setLabelProvider(new ColumnLabelProvider() { 
     public String getText(Object element) { 
      if(element instanceof AplotDataModel.AplotDatasetData) 
       return ((AplotDataModel.AplotDatasetData)element).getDataset().toString(); 
      return super.getText(element); 
      } 
     }); 

     col = createTableViewerColumn(titles[1], bounds[1], 1); 
     col.setLabelProvider(new ColumnLabelProvider() { 
     public String getText(Object element) { 
      if(element instanceof AplotDataModel.AplotDatasetData) 
       return ((AplotDataModel.AplotDatasetData)element).getRev().toString(); 
      return super.getText(element); 
      } 
     }); 

     col = createTableViewerColumn(titles[2], bounds[2], 2); 
     col.setLabelProvider(new ColumnLabelProvider() { 
     public String getText(Object element) { 
      if(element instanceof AplotDataModel.AplotDatasetData) 
       return ((AplotDataModel.AplotDatasetData)element).getPRLValue().toString(); 
      return super.getText(element); 
      } 
     }); 
     col = createTableViewerColumn(titles[3], bounds[3], 3); 
     col.setLabelProvider(new ColumnLabelProvider() { 
     public String getText(Object element) { 
      if(element instanceof AplotDataModel.AplotDatasetData) 
       return ((AplotDataModel.AplotDatasetData)element).getDatasetName().toString(); 
      return super.getText(element); 
      } 
     }); 

     col = createTableViewerColumn(titles[4], bounds[4], 4); 
     col.setLabelProvider(new ColumnLabelProvider() { 
      public String getText(Object element) { 
      if(element instanceof AplotDataModel.AplotDatasetData) 
       return ((AplotDataModel.AplotDatasetData)element).getMarkupValue(); 
      return super.getText(element); 
      } 
      }); 

     col.setEditingSupport(new OptionEditingSupport(this)); 

    } 

    private TableViewerColumn createTableViewerColumn(String header, int width, int idx) 
    { 
     TableViewerColumn column = new TableViewerColumn(this, SWT.LEFT, idx); 
     column.getColumn().setText(header); 
     column.getColumn().setWidth(width); 
     column.getColumn().setResizable(true); 
     column.getColumn().setMoveable(true); 

     return column; 
    } 
} 

संपादित

col = createTableViewerColumn(titles[5], bounds[5], 5); 
    col.setLabelProvider(new ColumnLabelProvider() { 
     @Override 
     public void update(ViewerCell cell) { 
     TableItem item = new TableItem(getTable(),SWT.NONE); 
     Button button = new Button(getTable(),SWT.NONE); 
     button.setText("X"); 
     getControl().setBackground(item.getBackground()); 
     TableEditor editor = new TableEditor(getTable()); 
     editor.grabHorizontal = true; 
     editor.grabVertical = true; 
     editor.setEditor(button , item, columnIndex); 
     editor.layout(); 
     } 
     }); 

उत्तर

19

यहाँ नमूना काम कर रहा है के लिए संस्करण काम करना चाहिए। चुने हुए जवाब देने के लिए

public class TableEditorTest { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     Display display = new Display(); 
     Shell shell = new Shell(display); 

     shell.setLayout(new FillLayout()); 


     TableViewer viewer = new TableViewer(shell); 
     viewer.getTable().setHeaderVisible(true); 
     viewer.getTable().setLinesVisible(true); 
     viewer.setContentProvider(new ArrayContentProvider()); 

     TableColumn column = new TableColumn(viewer.getTable(), SWT.NONE); 
     column.setText("First Name"); 
     column.setWidth(100); 
     TableViewerColumn firstNameCol = new TableViewerColumn(viewer, column); 
     firstNameCol.setLabelProvider(new ColumnLabelProvider(){ 

      @Override 
      public String getText(Object element) { 
       Person p = (Person)element; 

       return p.getFirstName(); 
      } 

     }); 

     column = new TableColumn(viewer.getTable(), SWT.NONE); 
     column.setText("Last Name"); 
     column.setWidth(100); 
     TableViewerColumn lastNameCol = new TableViewerColumn(viewer, column); 
     lastNameCol.setLabelProvider(new ColumnLabelProvider(){ 

      @Override 
      public String getText(Object element) { 
       Person p = (Person)element; 

       return p.getLastName(); 
      } 

     }); 




     column = new TableColumn(viewer.getTable(), SWT.NONE); 
     column.setText("Actions"); 
     column.setWidth(100); 
     TableViewerColumn actionsNameCol = new TableViewerColumn(viewer, column); 
     actionsNameCol.setLabelProvider(new ColumnLabelProvider(){ 
      //make sure you dispose these buttons when viewer input changes 
      Map<Object, Button> buttons = new HashMap<Object, Button>(); 


      @Override 
      public void update(ViewerCell cell) { 

       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.NONE); 
        button.setText("Remove"); 
        buttons.put(cell.getElement(), button); 
       } 
       TableEditor editor = new TableEditor(item.getParent()); 
       editor.grabHorizontal = true; 
       editor.grabVertical = true; 
       editor.setEditor(button , item, cell.getColumnIndex()); 
       editor.layout(); 
      } 

     }); 



     Person p1 = new Person(); 
     p1.setFirstName("George"); 
     p1.setLastName("Burne"); 

     Person p2 = new Person(); 
     p2.setFirstName("Adam"); 
     p2.setLastName("Silva"); 

     Person p3 = new Person(); 
     p3.setFirstName("Nathan"); 
     p3.setLastName("Cowl"); 

     List<Person> persons = new ArrayList<Person>(); 
     persons.add(p1); 
     persons.add(p2); 
     persons.add(p3); 

     viewer.setInput(persons); 

     shell.open(); 
     while(!shell.isDisposed()) 
     { 

      if(!display.readAndDispatch()) 
      { 
       display.sleep(); 
      } 
     } 

     display.dispose(); 

    } 


    private static class Person 
    { 

     String firstName; 
     String lastName; 

     Person() 
     { 

     } 

     public String getFirstName() { 
      return firstName; 
     } 

     public String getLastName() { 
      return lastName; 
     } 

     public void setFirstName(String firstName) { 
      this.firstName = firstName; 
     } 

     public void setLastName(String lastName) { 
      this.lastName = lastName; 
     } 

    } 


} 
+3

कृपया एकाधिक उत्तरों पोस्ट न करें। आप इसके नीचे "संपादन" लिंक का उपयोग कर पिछले जवाब को संपादित कर सकते हैं। – Baz

+0

हे भगवान, धन्यवाद! – wuppi

0

कोड नीचे आप

TableItem item = (TableItem) item; 
Button button = new Button(table,swt.none); 
button.setText("Remove"); 
control.setBackground(item.getBackground()); 
TableEditor editor = new TableEditor(table); 
editor.grabHorizontal = true; 
editor.grabVertical = true; 
editor.setEditor(button , item, columnIndex); 
editor.layout(); 
+0

आप उस कोड को कहां जोड़ते हैं? क्या यह टेबल व्यूअर क्लास कोड में जाता है?मैं उपरोक्त अपना टेबलव्यूअर क्लास कोड जोड़ूंगा। क्या आप मुझे दिखा सकते हैं कि इसे कैसे जोड़ना है। – jkteater

+1

कृपया tableviewercolumn के लिए \t ColumnLabelProvider.update (व्यूअरसेल सेल) को ओवरराइड करें जहां आप यह बटन दिखाना चाहते हैं। व्यूअरसेल से आप प्राप्त कर सकते हैं ITem, getColumnIndex। सुनिश्चित करें कि आप प्रत्येक पंक्ति वस्तु के लिए बनाए गए बटनों का ट्रैक रखें और दर्शक इनपुट में परिवर्तन करते समय उनका निपटान करें। किसी भी बटन को बनाने से पहले प्रत्येक राउडाटा के लिए मानचित्र में बटन रखें, यह पहले से ही मानचित्र में है। –

+0

मुझे खेद है, लेकिन मुझे अपने कोड में आपकी सलाह शामिल करने में कुछ समस्याएं आ रही हैं। मुझे ViewerCells – jkteater

1

एक महत्वपूर्ण बात यह है कि आप TableEditor का एक उदाहरण हर अद्यतन पद्धति पर नहीं बनाना चाहिए इसे कहते भी प्रदर्शन धीमी हो जाएगी या आवेदन unresposnive बनाते हैं। "वाकई इन बटन निपटाने जब दर्शक इनपुट बदलता है बनाने" -

@Override 
     public void update(ViewerCell cell) { 

      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.NONE); 
       button.setText("Remove"); 
       buttons.put(cell.getElement(), button); 
       TableEditor editor = new TableEditor(item.getParent()); 
       editor.grabHorizontal = true; 
       editor.grabVertical = true; 
       editor.setEditor(button , item, cell.getColumnIndex()); 
       editor.layout(); 
      } 
     } 
2

@ sambi.reddy से जवाब देने के लिए इसके अलावा एक टिप्पणी है कि कहते हैं नहीं है। यह काम करने के लिए मुझे यही करना था।

ढांचे मैं IStructuredContentProvider के एक कार्यान्वयन था, ओवरराइड inputChanged (...) में ऐसा है, तो मैं निम्नलिखित कोड में डालने के लिए किया था इस्तेमाल किया: -

@Override 
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { 

    // This will dispose of all the control button that were created previously 
    if (((TableViewer)viewer).getTable() != null && ((TableViewer)viewer).getTable().getChildren() != null) { 
     for (Control item : ((TableViewer)viewer).getTable().getChildren()) { 
      // at this point there are no other controls embedded in the viewer, however different instances may require more checking of the controls here. 
      if ((item != null) && (!item.isDisposed())) { 
       item.dispose(); 
      } 
     } 
    } 
} 

यह ठीक काम करता है, को छोड़कर अगर आपके पास एक ताज़ा तालिका (यानी दर्शक .setInput (सूची)) बटन बटन कार्रवाई के परिणाम के रूप में कॉल करें। जब मैं जोड़ा इस निम्नलिखित लाइन कभी कभी बटन है कि अभी भी अस्तित्व में लौट आए, लेकिन निपटारा किया जा रहा था:

if(buttons.containsKey(cell.getElement())) 

तो मैं होने के लिए इस लाइन को अद्यतन करने की जरूरत:

if (buttons.containsKey(cell.getElement()) && !buttons.get(cell.getElement()).isDisposed()) 

जो किसी भी निपटाने बटन जा रहा है के परिणामस्वरूप पुनर्निर्मित, अगर वे अभी भी आवश्यक थे।