📄 classespanel.java
字号:
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 + -