public ItemTablePanel(Class<T> clazz, ItemSet<T> items) throws Exception {
		this.setLayout(new GridBagLayout());
		GridBagConstraints c = new GridBagConstraints();

		this.model = new ItemTableModel(clazz, items, this);

		this.table = new JTable(this.model);
		this.table.setFillsViewportHeight(true);
		
		int index = 0;
		for(Field field : clazz.getDeclaredFields()) {
			
			if(field.isAnnotationPresent(Value.class)) {

				Value val = field.getAnnotation(Value.class);
				TableColumn col = this.table.getColumnModel().getColumn(index);
				TableCellEditor editor = null;
				switch(val.type()) {
					case ComboBox: {
					
						@SuppressWarnings("rawtypes")
						Class<? extends Collection> collType = val.collection();
						if(collType != null) {
						
							@SuppressWarnings("rawtypes")
							Collection collection = collType.newInstance();
							if(collection != null) {
								editor = new TableCellComboBoxEditor(collection);
							}
						}
						break;
					}
					default: {
						break;
					}
				}
				
				if(editor != null) {
					col.setCellEditor(editor);
				}
			}
		}
		
		TableColumn removeCol = this.table.getColumnModel().getColumn(this.model.getColumnCount() - 1);
		removeCol.setMaxWidth(100);
		
		c.anchor = GridBagConstraints.PAGE_START;
		c.fill = GridBagConstraints.BOTH;
		c.gridwidth = 2;
		c.gridx = 0;
		c.gridy = 0;
		c.weightx = 1;
		c.weighty = 1;
		
		JScrollPane scroll = new JScrollPane(this.table);
		scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		
		add(scroll, c);
		
		Dimension preferredSize = new Dimension(90, 25);

		this.addBtn = new JButton("Add");
		this.addBtn.setPreferredSize(preferredSize);
		this.addBtn.addActionListener(this);
		
		c.fill = GridBagConstraints.HORIZONTAL;
		c.weightx = 0.5;
		c.weighty = 0;
		c.gridwidth = 1;
		c.gridx = 0;
		c.gridy = 1;
		
		add(this.addBtn, c);
		
		this.removeBtn = new JButton("Remove");
		this.removeBtn.setPreferredSize(preferredSize);
		this.removeBtn.addActionListener(this);
		
		c.gridx = 1;
		c.gridy = 1;
		
		add(this.removeBtn, c);
	}