2016-10-28 1 views
-1

Я внедрил свой собственный инструмент просмотра дерева флажков, он отображает простую иерархию организации. Если в организации есть (или) больше менеджеров, и у каждого менеджера есть (или) больше репортеров под ним.Viewbox viewer не отображается на составном

Organization 
     Manager1 
       reportee1 
       reportee2 
     Manager2 
      reportee1 
      reportee2 
      reportee3 
      .... 
      .... 
      reporteeN 

Но когда я попытался добавить средство просмотра дерева к композиту, оно не отображается. Я добавляю код для вашей справки. Пожалуйста, дайте мне знать, где я делаю ошибку.

Employee.java

package com.sample; 

public class Employee { 
    private String name; 
    private boolean inOffice; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public boolean isInOffice() { 
     return inOffice; 
    } 

    public void setInOffice(boolean inOffice) { 
     this.inOffice = inOffice; 
    } 

} 

Manager.java

package com.sample; 

import java.util.ArrayList; 
import java.util.List; 

public class Manager { 
    private String name; 
    private final List<Employee> employees = new ArrayList<>(); 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public List<Employee> getEmployees() { 
     return employees; 
    } 

} 

Organization.java

package com.sample; 

import java.util.ArrayList; 
import java.util.List; 

public class Organization { 
    private String name; 
    private List<Manager> managers = new ArrayList<>(); 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public List<Manager> getManagers() { 
     return managers; 
    } 

} 

DataUtil.java

package com.sample; 

public class DataUtil { 

    public static Organization getOrganization() { 
     Organization oranization = new Organization(); 
     oranization.setName("XYZ Corporation"); 

     Manager manager1 = new Manager(); 
     manager1.setName("Mukund Dixit"); 

     Manager manager2 = new Manager(); 
     manager2.setName("Anand Bandaru"); 

     Manager manager3 = new Manager(); 
     manager3.setName("Shreyas Desai"); 

     Manager manager4 = new Manager(); 
     manager4.setName("VadiRaj"); 

     Employee emp1 = new Employee(); 
     emp1.setInOffice(true); 
     emp1.setName("Keerthi Shetty"); 

     Employee emp2 = new Employee(); 
     emp2.setInOffice(true); 
     emp2.setName("Karthik"); 

     Employee emp3 = new Employee(); 
     emp3.setInOffice(true); 
     emp3.setName("Brijesh"); 

     Employee emp4 = new Employee(); 
     emp4.setInOffice(true); 
     emp4.setName("Deepank Bansal"); 

     Employee emp5 = new Employee(); 
     emp5.setInOffice(true); 
     emp5.setName("Reshmi George"); 

     Employee emp6 = new Employee(); 
     emp6.setInOffice(true); 
     emp6.setName("Janaki Sriram"); 

     Employee emp7 = new Employee(); 
     emp7.setInOffice(false); 
     emp7.setName("Aravind Phaneendra"); 

     Employee emp8 = new Employee(); 
     emp8.setInOffice(true); 
     emp8.setName("Nagendra"); 

     Employee emp9 = new Employee(); 
     emp9.setInOffice(true); 
     emp9.setName("Maruthi"); 

     Employee emp10 = new Employee(); 
     emp10.setInOffice(true); 
     emp10.setName("Piyush"); 

     Employee emp11 = new Employee(); 
     emp11.setInOffice(true); 
     emp11.setName("Shanmugham"); 

     Employee emp12 = new Employee(); 
     emp12.setInOffice(false); 
     emp12.setName("Phalgun Garimella"); 

     Employee emp13 = new Employee(); 
     emp13.setInOffice(false); 
     emp13.setName("Sankalp"); 

     Employee emp14 = new Employee(); 
     emp14.setInOffice(false); 
     emp14.setName("Arpan"); 

     Employee emp15 = new Employee(); 
     emp15.setInOffice(false); 
     emp15.setName("Sandesh"); 

     Employee emp16 = new Employee(); 
     emp16.setInOffice(false); 
     emp16.setName("Senthil"); 

     manager1.getEmployees().add(emp1); 
     manager1.getEmployees().add(emp2); 
     manager1.getEmployees().add(emp3); 
     manager1.getEmployees().add(emp4); 

     manager2.getEmployees().add(emp5); 
     manager2.getEmployees().add(emp6); 
     manager2.getEmployees().add(emp7); 
     manager2.getEmployees().add(emp8); 

     manager3.getEmployees().add(emp9); 
     manager3.getEmployees().add(emp10); 
     manager3.getEmployees().add(emp11); 

     manager4.getEmployees().add(emp12); 
     manager4.getEmployees().add(emp13); 
     manager4.getEmployees().add(emp14); 
     manager4.getEmployees().add(emp15); 
     manager4.getEmployees().add(emp16); 

     oranization.getManagers().add(manager1); 
     oranization.getManagers().add(manager2); 
     oranization.getManagers().add(manager3); 
     oranization.getManagers().add(manager4); 

     return oranization; 
    } 
} 

MyCheckBoxLabelProvider.java

package com.sample; 

import org.eclipse.jface.viewers.CellLabelProvider; 
import org.eclipse.jface.viewers.ViewerCell; 

public class MyCheckBoxLabelProvider extends CellLabelProvider { 

    @Override 
    public void update(ViewerCell cell) { 
     Object element = cell.getElement(); 

     if (element instanceof Organization) { 
      cell.setText("Org: "); 
     } else if (element instanceof Manager) { 
      cell.setText("M: "); 
     } else { 
      cell.setText("Emp: "); 
     } 
    } 

} 

MyCheckBoxTreeContentProvider.java

package com.sample; 

import org.eclipse.jface.viewers.ITreeContentProvider; 
import org.eclipse.jface.viewers.Viewer; 

public class MyCheckBoxTreeContentProvider implements ITreeContentProvider { 

    public MyCheckBoxTreeContentProvider() { 
    } 

    @Override 
    public void dispose() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void inputChanged(Viewer arg0, Object arg1, Object arg2) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public Object[] getChildren(Object obj) { 

     if (obj instanceof Organization) { 
      return ((Organization) obj).getManagers().toArray(); 
     } 

     if (obj instanceof Manager) { 
      return ((Manager) obj).getEmployees().toArray(); 
     } 

     return new Object[0]; 
    } 

    @Override 
    public Object[] getElements(Object arg0) { 
     Object[] roots = new Object[1]; 
     roots[0] = DataUtil.getOrganization(); 
     return roots; 
    } 

    @Override 
    public Object getParent(Object arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public boolean hasChildren(Object obj) { 
     if (obj instanceof Organization || obj instanceof Manager) { 
      return true; 
     } 
     return false; 

    } 

} 

MyCheckBoxTreeSorter.java

package com.sample; 

import org.eclipse.jface.viewers.Viewer; 
import org.eclipse.jface.viewers.ViewerSorter; 

public class MyCheckBoxTreeSorter extends ViewerSorter { 
    @Override 
    public int compare(Viewer viewer, Object left, Object right) { 
     if (left instanceof Manager && right instanceof Manager) { 
      return ((Manager) left).getName().compareTo(((Manager) right).getName()); 
     } 

     if (left instanceof Manager && right instanceof Manager) { 
      return ((Employee) left).getName().compareTo(((Employee) right).getName()); 
     } 

     return 0; 
    } 
} 

MyCheckBoxTreeViewer.java

package com.sample; 

import java.util.List; 

import org.eclipse.jface.viewers.CheckStateChangedEvent; 
import org.eclipse.jface.viewers.CheckboxTreeViewer; 
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; 
import org.eclipse.jface.viewers.ICheckStateListener; 
import org.eclipse.jface.viewers.ICheckStateProvider; 
import org.eclipse.swt.widgets.Composite; 
import org.eclipse.swt.widgets.TreeItem; 
import org.eclipse.swt.widgets.Widget; 

public class MyCheckBoxTreeViewer extends CheckboxTreeViewer implements ICheckStateListener, ICheckStateProvider { 
    public MyCheckBoxTreeViewer(Composite parent, int style) { 
     super(parent, style); 
     ColumnViewerToolTipSupport.enableFor(this); 
     initializeTree(); 
    } 

    private void initializeTree() { 
     setCheckStateProvider(this); 
     addCheckStateListener(this); 
    } 

    @Override 
    public boolean isChecked(Object obj) { 
     if (obj instanceof Manager) { 
      Manager manager = (Manager) obj; 

      List<Employee> employees = manager.getEmployees(); 
      for (Employee emp : employees) { 
       if (!emp.isInOffice()) { 
        return false; 
       } 
      } 
     } 

     return true; 
    } 

    @Override 
    public boolean isGrayed(Object obj) { 
     int totalEmpsInOffice = 0; 

     if (obj instanceof Manager) { 
      Manager manager = (Manager) obj; 

      List<Employee> employees = manager.getEmployees(); 
      for (Employee emp : employees) { 
       if (emp.isInOffice()) 
        totalEmpsInOffice++; 
      } 

      if (totalEmpsInOffice == employees.size()) { 
       return true; 
      } 
     } 

     return false; 
    } 

    @Override 
    public void checkStateChanged(CheckStateChangedEvent event) { 
     Object element = event.getElement(); 

     Widget item = findItem(element); 

     if (!(item instanceof TreeItem)) { 
      System.out.println("Given item is not an instance of tree item"); 
      return; 
     } 

     TreeItem treeItem = (TreeItem) item; 
     Object obj = treeItem.getData(); 

     if (obj instanceof Manager) { 
      System.out.println("State is changed for " + ((Manager) obj).getName()); 
     } 

     if (obj instanceof Employee) { 
      System.out.println("State is changed for " + ((Employee) obj).getName()); 
     } 

    } 

} 

TestTreeViewer.java

package com.sample; 

import org.eclipse.jface.layout.GridDataFactory; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.graphics.Color; 
import org.eclipse.swt.widgets.Composite; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Shell; 

public class TestTreeViewer { 
    private static int shellWidth = 600; 
    private static int shellHeight = 600; 

    private static int compositeWidth = 500; 
    private static int compositeHeight = 250; 

    private static void addWidgetsToShell(Display display, Shell shell) { 

     Composite composite = new Composite(shell, SWT.BORDER); 
     composite.setBackground(new Color(display, 102, 153, 153)); 
     composite.setBounds(10, 10, compositeWidth, compositeHeight); 

     MyCheckBoxTreeContentProvider contentProvider = new MyCheckBoxTreeContentProvider(); 
     MyCheckBoxLabelProvider labelProvider = new MyCheckBoxLabelProvider(); 
     MyCheckBoxTreeSorter sorter = new MyCheckBoxTreeSorter(); 

     MyCheckBoxTreeViewer treeViewer = new MyCheckBoxTreeViewer(shell, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); 
     GridDataFactory.fillDefaults().grab(true, true).applyTo(treeViewer.getTree()); 
     treeViewer.setContentProvider(contentProvider); 
     treeViewer.setLabelProvider(labelProvider); 
     treeViewer.setSorter(sorter); 
     //treeViewer.setInput("root"); 
     treeViewer.setAutoExpandLevel(2); 


    } 

    public static void main(String[] args) { 

     /* Instantiate Display object, it represents SWT session */ 
     Display display = new Display(); 

     /* 
     * Define Shell, it represent a window, You can add more than one shell 
     * to Display 
     */ 
     Shell shell = new Shell(display); 
     shell.setSize(shellWidth, shellHeight); 

     addWidgetsToShell(display, shell); 

     /* Open shell window */ 
     shell.open(); 

     /* 
     * Run the event dispatching loop until an exit condition occurs, which 
     * is typically when the main shell window is closed by the user. 
     */ 

     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) 
       display.sleep(); 
     } 

     /* Dispose the display */ 
     display.dispose(); 
    } 

} 

Я отлажена, но не смог найти проблему/решение.

ответ

2

Здесь есть несколько проблем.

Вы не вызываете зрителя setInput метод - ничего не происходит, пока вы не назовете это.

Родительский флажок - это Shell, а не композит, который вы создаете. Вы используете GridData для данных макета флажков, но вы не установили макет для Shell или Composite. Если вы используете данные макета, вы должны установить макет.

Вы смешиваете setBounds и макеты - не делайте этого, это не работает.

Перед тем, как позвонить по телефону setInput, вы должны позвонить по номеру setAutoExpandLevel.

Так что для Shell сделать что-то вроде:

Shell shell = new Shell(display); 
shell.setSize(shellWidth, shellHeight); 
shell.setLayout(new GridLayout()); 

Для композита:

Composite composite = new Composite(shell, SWT.BORDER); 
composite.setBackground(new Color(shell.getDisplay(), 102, 153, 153)); 
composite.setLayout(new GridLayout()); 
GridDataFactory.fillDefaults().hint(compositeWidth, compositeHeight).applyTo(composite); 

Для флажком:

MyCheckBoxTreeViewer treeViewer = new MyCheckBoxTreeViewer(composite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); 
GridDataFactory.fillDefaults().grab(true, true).applyTo(treeViewer.getTree()); 
treeViewer.setContentProvider(contentProvider); 
treeViewer.setLabelProvider(labelProvider); 
treeViewer.setSorter(sorter); 
treeViewer.setAutoExpandLevel(2); 
treeViewer.setInput("root"); 
+1

Оставаться в 'распоряжаться()' из ' Цвет. – Baz

Смежные вопросы