public String swfTypeToString(SWFType swfType) { if (swfType == null) { return null; } String result = swfType.value().toString(); if (swfType.count() > 0) { result += "[" + swfType.count(); if (swfType.countAdd() > 0) { result += " + " + swfType.countAdd(); } result += "]"; } else if (!swfType.countField().isEmpty()) { result += "[" + swfType.countField(); if (swfType.countAdd() > 0) { result += " + " + swfType.countAdd(); } result += "]"; } return result; }
private void removeItem(Object obj, Field field, int index) { final JScrollBar sb = genericTagPropertiesEditPanelScrollPanel.getVerticalScrollBar(); final int val = sb.getValue(); // save scroll top SWFType swfType = field.getAnnotation(SWFType.class); if (swfType != null && !swfType .countField() .isEmpty()) { // Fields with same countField must be removed from too Field[] fields = obj.getClass().getDeclaredFields(); for (int f = 0; f < fields.length; f++) { SWFType fieldSwfType = fields[f].getAnnotation(SWFType.class); if (fieldSwfType != null && fieldSwfType.countField().equals(swfType.countField())) { ReflectionTools.removeFromField(obj, fields[f], index); } } try { // If countField exists, decrement, otherwise do nothing Field countField = obj.getClass().getDeclaredField(swfType.countField()); int cnt = countField.getInt(obj); cnt--; countField.setInt(obj, cnt); } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException ex) { // ignored } } else { ReflectionTools.removeFromField(obj, field, index); } generateEditControls(editedTag, false); // Restore scroll top after some time. TODO: Handle this better. I don't know how :-(. new Thread() { @Override public void run() { try { Thread.sleep(500); } catch (InterruptedException ex) { logger.log(Level.SEVERE, null, ex); } View.execInEventDispatch( () -> { genericTagPropertiesEditPanelScrollPanel.getVerticalScrollBar().setValue(val); }); } }.start(); revalidate(); repaint(); }