⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 classespanel.java

📁 一个用于排队系统仿真的开源软件,有非常形象的图象仿真过程!
💻 JAVA
📖 第 1 页 / 共 2 页
字号:

		classTable.stopEditing();

		ExactModel data = ew.getData();

		synchronized (data) {

			if (hasDeletes) {
                //if at some point rows have been deleted
				//play back all ops in the same order on the data object
                playbackClassOps(data);
            } else {
				data.resize(data.getStations(), classes); //otherwise a simple resize is ok
			}

			data.setClassNames(classNames);
			data.setClassTypes(classTypes);
			data.setClassData(classData);

            //NEW
            //@author Stefano Omini
            sync();
            //end NEW
		}
	}

	private void deleteSelectedClasses() {
		int[] selectedRows = classTable.getSelectedRows();
		//System.out.println("deleteSelectedRows(): "+ArrayUtils.toString(selectedRows));
		int nrows = selectedRows.length;
		int left = classTable.getRowCount() - nrows;
		if (left < 1) {
			classTable.removeRowSelectionInterval(selectedRows[nrows - 1], selectedRows[nrows - 1]);
			deleteSelectedClasses();
			return;
		}
		deleteClasses(selectedRows);
	}

	private void deleteClasses(int[] idx) {
		deleting = true;
		Arrays.sort(idx);
		for (int i = idx.length-1; i >=0; i--) {
			deleteClass(idx[i]);
		}
		updateSizes();
		deleting = false;
	}

	private void deleteClass(int i) {

        classes--;
		classSpinner.setValue(new Integer(classes));

		classNames = ArrayUtils.delete(classNames, i);
		classTypes = ArrayUtils.delete(classTypes, i);
		classData = ArrayUtils.delete(classData, i);

		classOps.add(ListOp.createDeleteOp(i));
		hasDeletes = true;

	}

	private void playbackClassOps(ExactModel data) {
		for (int i = 0; i < classOps.size(); i++) {
			ListOp lo = (ListOp) classOps.get(i);
			if (lo.isDeleteOp()) data.deleteClass(lo.getData());
			if (lo.isResizeOp()) data.resize(data.getStations(), lo.getData());

		}
	}


	public void help() {
		JOptionPane.showMessageDialog(this, helpText, "Help", JOptionPane.INFORMATION_MESSAGE);

	}

    //NEW Federico Dall'Orso
    //Methods added to implement forcing of data refresh
    public void retrieveData() {
        sync();
    }

    public void commitData() {
        commit();
    }
    //END


    /* ------------------------------------------------------------------
	   The ClassTable is a fairly complex object that would be probably better of as an outer class.
	   However, it is very specialized and it needs access to the data structures of the ClassesPanel,
	   so having it as an inner class is *much* more practical
	   ------------------------------------------------------------------
	   */

	/**
	 * Her Majesty, the class table herself
	 */
	private class ClassTable extends ExactTable {

		TableCellRenderer disabledCellRenderer;
        TableCellEditor classTypeCellEditor;
        //BEGIN Federico Dall'Orso 8/3/2005
        ComboBoxCell classTypeComboBoxCell;
        ButtonCellRenderer deleteButtonCellRenderer;
        JButton deleteButton;
        //END Federico Dall'Orso 8/3/2005

		ClassTable() {
			super(new ClassTableModel());

			disabledCellRenderer = new DisabledCellRenderer();

            //BEGIN Federico Dall'Orso 8/3/2005
            //NEW
            classTypeComboBoxCell = new ComboBoxCell(CLASS_TYPENAMES);
            deleteButton=new JButton(deleteOneClass);
            deleteButtonCellRenderer = new ButtonCellRenderer(deleteButton);
            enableDeletes();
            rowHeader.setRowHeight(18);
            setRowHeight(18);
            //END Federico Dall'Orso 8/3/2005

            JComboBox classTypeBox = new JComboBox(CLASS_TYPENAMES);
			classTypeCellEditor = new DefaultCellEditor(classTypeBox);
            classTypeBox.setEditable(false);


			setColumnSelectionAllowed(false);
			setRowSelectionAllowed(true);

			// not beautiful, but effective. See ClassTableModel.getColumnClass()
			setDefaultRenderer(DisabledCellRenderer.class, disabledCellRenderer);
			setDefaultEditor(String.class, classTypeCellEditor);

			setDisplaysScrollLabels(true);

			installKeyboardAction(getInputMap(), getActionMap(), deleteClass);
			mouseHandler = new ExactTable.MouseHandler(makeMouseMenu());
			mouseHandler.install();


			help.addHelp(this, "Click or drag to select classes; to edit data single-click and start typing. Right-click for a list of available operations");
			help.addHelp(moreRowsLabel, "There are more classes: scroll down to see them");
			help.addHelp(selectAllButton, "Click to select all classes");
			tableHeader.setToolTipText(null);
			rowHeader.setToolTipText(null);
            help.addHelp(rowHeader, "Click, SHIFT-click or drag to select classes");

		}

        //BEGIN Federico Dall'Orso 14/3/2005
        /*enables deleting operations with last column's button*/
        private void enableDeletes(){
            deleteOneClass.setEnabled(classes>1);
            /*It seems the only way to implement row deletion...*/
            this.addMouseListener(new MouseAdapter(){
                public void mouseClicked(MouseEvent e){
                    if((columnAtPoint(e.getPoint())==getColumnCount()-1)&&getRowCount()>1){
                        setRowSelectionInterval(rowAtPoint(e.getPoint()), rowAtPoint(e.getPoint()));
                        deleteSelectedClasses();
                    }
                }
            });
            getColumnModel().getColumn(getColumnCount()-1).setMinWidth(20);
            getColumnModel().getColumn(getColumnCount()-1).setMaxWidth(20);
        }
        //END Federico Dall'Orso 14/3/2005

        //new Federico Dall'Orso 8/3/2005

        public TableCellRenderer getCellRenderer(int row, int column){
            //if this is type column, i must render it as a combo box instead of a jtextfield
            if(column==1){
                return classTypeComboBoxCell;
            }else if(column==4){
                return deleteButtonCellRenderer;
            }
            else return disabledCellRenderer;
        }
        //end Federico Dall'Orso 8/3/2005

		protected void installKeyboard() {
		}

		protected void installMouse() {
		}

		protected JPopupMenu makeMouseMenu() {
			JPopupMenu menu = new JPopupMenu();
			menu.add(deleteClass);
			return menu;
		}

		/**
		 * Make sure the table reflects changes on editing end
		 * Overridden to truncate decimals in data if current class is closed
		 */
		public void editingStopped(ChangeEvent ce) {
			if (classTypes[editingRow] == CLASS_CLOSED) {
				classData[editingRow] = (int) classData[editingRow];
			}
			updateRow(editingRow);
			super.editingStopped(ce);
		}

        //BEGIN Federico Dall'Orso 14/3/2005
        //NEW
        //Updates appearence of last column's buttons
        void updateDeleteCommand(){
            deleteOneClass.setEnabled(classes>1);
            getColumnModel().getColumn(getColumnCount()-1).setMinWidth(20);
            getColumnModel().getColumn(getColumnCount()-1).setMaxWidth(20);

        }
        //END Federico Dall'Orso 14/3/2005

		protected void updateActions() {
            boolean isEnabled = classes > 1 && getSelectedRowCount() > 0;
			deleteClass.setEnabled(isEnabled);
            deleteOneClass.setEnabled(classes>1);
        }

	}

	/**
	 * the model backing the class table
	 */
	private class ClassTableModel extends ExactTableModel {

		private Object[] prototypes = {"10000",
                                       new String(new char[12]),
                                       "closed+cbox",
                                       new Integer(1000),
                                       new String(new char[12]),
                                       ""
        };

		public Object getPrototype(int columnIndex) {
			return prototypes[columnIndex + 1];
		}

		public int getRowCount() {
			return classes;
		}

		public Class getColumnClass(int col) {
			switch (col) {
				case 1:
					return String.class;
				case 2:
                case 3:
                    return DisabledCellRenderer.class;
				default:
					return Object.class;
			}
		}

		public int getColumnCount() {
			return 5;
		}

		public String getColumnName(int index) {
			switch (index) {
				case 0:
					return "Name";
				case 1:
					return "Type";
				case 2:
					return "No. of Customers";
                case 3:
                    return "Arrival Rate (\u03BB)";
				default:
                    return null;
			}
		}

		protected Object getValueAtImpl(int rowIndex, int columnIndex) {
			switch (columnIndex) {
				case 0://name
					return classNames[rowIndex];
				case 1://type
					return CLASS_TYPENAMES[classTypes[rowIndex]];
				case 2://customers
					if (classTypes[rowIndex] == CLASS_CLOSED) {
						return new Integer((int) classData[rowIndex]);
					} else {
						return null;
					}
				case 3://arrival rate
					if (classTypes[rowIndex] == CLASS_OPEN) {
						return new Double(classData[rowIndex]);
					} else {
						return null;
					}
				default:
					return null;
			}
		}

		protected Object getRowName(int rowIndex) {
			return new Integer(rowIndex + 1);
		}

		public void setValueAt(Object value, int rowIndex, int columnIndex) {
			switch (columnIndex) {
				case 0: //name
					classNames[rowIndex] = (String) value;
					break;
				case 1: //type
					for (int i = 0; i < CLASS_TYPENAMES.length; i++) {
						if (value == CLASS_TYPENAMES[i]) { //literal strings are canonicalized, hence == is ok
							classTypes[rowIndex] = i;
							break;
						}
					}
					break;
				case 2:
					{//customers
						try {
							int newval = (int) Double.parseDouble((String) value);
							if (newval >= 0) {
								classData[rowIndex] = newval;
							}
						} catch (NumberFormatException e) {
						}
						break;
					}
				case 3:
					{ //arrival rate
						try {
							double newval = Double.parseDouble((String) value);
							if (newval >= 0.0) {
								classData[rowIndex] = newval;
							}
						} catch (NumberFormatException e) {
						}
						break;
					}
				default:
			}
		}

		public boolean isCellEditable(int rowIndex, int columnIndex) {
			switch (columnIndex) {
				case 0:
				case 1:
					return true;
				case 2:
					return (classTypes[rowIndex] == CLASS_CLOSED);
				case 3:
					return (classTypes[rowIndex] == CLASS_OPEN);
				default:
					return false;
			}
		}
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -