次ã«ãããæ¥åžžçãªè³ªåã«ç§»ããããŠã¹ã€ãã³ãã®åŠçãšã¹ã±ãŒãªã³ã°ããã³ããªããžã§ã¯ãã®éžæãããã³ãã©ãã°ã¢ã³ããããããæ åœããã¯ã©ã¹ã®æ§ç¯ãæ€èšããŸãã
DiagramPanelã¯ã©ã¹
èŠèŠã³ã³ããŒãã³ã
DiagramObjectã¯ã©ã¹ãšã¯ç°ãªããDiagramPanelã¯ã©ã¹ã®ãœãŒã¹ã³ãŒãã«ã¯éèŠãªæ§é çãœãªã¥ãŒã·ã§ã³ã¯å«ãŸããŠããããã«ãŒãã³ã¿ã¹ã¯ã®ã¿ãå®è¡ããŸãã ãã ãããã®ã³ãŒãã¯DiagramObjectã³ãŒããããçŽ30ïŒ é·ããªããŸãã éçºç°å¢ã«é¢é£ãããã¹ãŠã®è©³çŽ°ãå«ãŸããŠããŸãïŒãã¬ãŒã ã¯ãŒã¯ãJavaããå¥ã®ç°å¢ã«æžãæãããå ŽåïŒä»¥åã®ããã«ãDelphiããJavaã«å€æããå ŽåïŒãäž»ãªåé¡ã¯DiagramObjectã«é¢é£ä»ããããŸãã
Swingã䜿çšããå ŽåãDiagramPanelã¯ã©ã¹ã¯javax.swing.JPanelã¯ã©ã¹ãç¶æ¿ããã¢ããªã±ãŒã·ã§ã³ãã©ãŒã ã«é 眮ã§ããããžã¥ã¢ã«ã€ã³ã¿ãŒãã§ã€ã¹ã³ã³ããŒãã³ãã§ãã ãã¢ã¢ããªã±ãŒã·ã§ã³ã¯1ã€ã®ããã«ã®ã¿ã§æ§æãããŠããŸãã æ§é çã«DiagramPanelã¯ä»¥äžã§æ§æãããŸãã
- æ°Žå¹³ããã³åçŽã¹ã¯ããŒã«ããŒjavax.swing.JScrollBarïŒhsbããã³vsbå€æ°ïŒã
- ç»é¢äžã®ãã¿ã³ãåãããããããã«ã
- DiagramPanel.DiagramCanvasãªããžã§ã¯ãïŒjava.awt.Canvasã®åŸç¶è ïŒãå ãããæç»ãé åã®äžå€®ã¹ããŒã¹å šäœãåããŸãã java.awt.Canvasã¯ã©ã¹ã«ã¯ãæç»ã³ã³ããã¹ãïŒGraphicsïŒãåŒæ°ãšããŠåãåããªãŒããŒã©ã€ããããpaintã¡ãœããïŒGraphics gïŒã䜿çšããŠç¶æ¿è ãäœæããããšãå«ãŸããŸããããã¯ãDiagramPanelã«ãã¹ããããDiagramCanvasã¯ã©ã¹ã§è¡ãããŸãã ç¹ã«ããŠã£ã³ããŠã®ãµã€ãºãå€æŽãããŠã£ã³ããŠã®ãªãŒããŒã©ãããå€æŽãããšããã€ã³ãïŒã°ã©ãã£ãã¯gïŒã¡ãœãããèªåçã«åŒã³åºãããããããã£ãŒãã¯ãããã®ã¢ã¯ã·ã§ã³ããæãªããããšã¯ãããŸããã
DiagramPanelã®èŠ³ç¹ãããã£ãŒããæã
DiagramPanel.DiagramCanvasã¯ã©ã¹ã®paintïŒGraphics gïŒã¡ãœããã®ã³ãŒãã詳ããèŠãŠã¿ãŸãããã äžéšã®è©³çŽ°ãçç¥ãããšã次ã®ããã«ãªããŸãã
ãœãŒã¹ã³ãŒã
ïŒã¡ãœããã³ãŒãã¯èªã¿ãããããããã«åçŽåãããŠããŸãããã¹ãŠã®æ¥µç«¯ãªã±ãŒã¹ãæ£ããèæ ®ããå®éã®å®è£ ã¯ããµã³ãã«èšäºã®å®å šãªãœãŒã¹ã³ãŒãã§èŠãããšãã§ããŸããïŒ
private static final double SCROLL_FACTOR = 10.0; public void paint(Graphics g) { // not ready for painting yet if (rootDiagramObject == null || g == null) return; double worldHeight = rootDiagramObject.getMaxY() - rootDiagramObject.getMinY(); double worldWidth = rootDiagramObject.getMaxX() - rootDiagramObject.getMinX(); int hPageSize = round(canvas.getWidth() / scale); ... int vPageSize = round(canvas.getHeight() / scale); ... hsb.setMaximum(round(worldWidth * SCROLL_FACTOR)); vsb.setMaximum(round(worldHeight * SCROLL_FACTOR)); g.clearRect(0, 0, getWidth(), getHeight()); double dX = hsb.getValue() / SCROLL_FACTOR; double dY = vsb.getValue() / SCROLL_FACTOR; rootDiagramObject.draw(g, dX, dY, scale); }
ïŒã¡ãœããã³ãŒãã¯èªã¿ãããããããã«åçŽåãããŠããŸãããã¹ãŠã®æ¥µç«¯ãªã±ãŒã¹ãæ£ããèæ ®ããå®éã®å®è£ ã¯ããµã³ãã«èšäºã®å®å šãªãœãŒã¹ã³ãŒãã§èŠãããšãã§ããŸããïŒ
ãã®ã¡ãœããã¯æ¬¡ã®ããšãè¡ããŸãã
- ã«ãŒãæç»ãªããžã§ã¯ãã®getMaxX / Yã¡ãœããã䜿çšããŠãã¯ãŒã«ã座æšã§ãã£ãŒãã®å¹ ãšé«ããååŸããŸãã
- ã¯ãŒã«ã座æšã®å¯èŠé åã®ãµã€ãºïŒå¹ ãšé«ãïŒãååŸããŸãã ãããè¡ãã«ã¯ãã³ã³ããŒãã³ãã®ç»é¢ã®å¹ ãšé«ããã¹ã±ãŒãªã³ã°ä¿æ°ã§é€ç®ããŸãïŒäžçããç»é¢åº§æšãååŸããã«ã¯ãã¹ã±ãŒãªã³ã°ä¿æ°ãæããŸãïŒã
- ã¹ã¯ããŒã«ããŒã¹ã©ã€ããŒã®æ倧å€ãšå¹ ã¯ãã¯ãŒã«ã座æšã®å¯Ÿå¿ããå€ã«SCROLL_FACTORä¿æ°ãæããå€ã«çããèšå®ãããŸãã
ãŠãŒã¶ãŒã®å©äŸ¿æ§ã®ããã«ãç»åã®çž®å°ºïŒããã³è¡šç€ºé åã®ãµã€ãºïŒãå€æŽãããšãã®ã¹ã¯ããŒã«ããŒã¹ã©ã€ããŒã®å¹ ãæ£ããå€æŽãããããšãéåžžã«éèŠã§ãã ãã®ã¢ãã¡ãŒã·ã§ã³ã§ã¯ãã¹ã¯ããŒã«ããŒã¹ã©ã€ããŒã®ãµã€ãºã®å€åãšãç»åãå šäœã«åãŸãå§ããç¬éã®æ¶å€±ã«æ³šæããŠãã ããã
SCROLL_FACTORã«ããä¹ç®ãå¿ èŠãªã®ã¯ãã¹ã¯ããŒã«ããŒã§åãå ¥ããããå€ãæŽæ°ã§ãããæãåºãããã«ã¯ãŒã«ã座æšãdoubleåã§ããããã§ãã ãããã£ãŠãå€§å¹ ã«å¢å ãããšãã¹ã¯ããŒã«ããŒã®åãã®ãäžé£ç¶æ§ããç®ç«ã¡ããããªããSCROLL_FACTORãã¡ã¯ã¿ãŒã䜿çšããŠãå®éã«ã¯ãããã®æŽæ°å€ãåºå®å°æ°ç¹å€ã«çœ®ãæããŸãã
ãã£ãŒãã®åæç»ã¡ãœããã¯ãã¹ã¯ããŒã«ããŒã®çŸåšã®ã¹ã±ãŒã«ãšäœçœ®ãæ£ããèæ ®ããŠããããã
- ã¹ã¯ããŒã«ããŒã®å€ã®å€æŽãåŠçããã«ã¯ãcanvas.paintïŒcanvas.getGraphicsïŒïŒïŒãåŒã³åºãã ãã§ãïŒDiagramPanelã¯ã©ã¹ã®scrollBarChangeïŒïŒã¡ãœãããåç §ïŒã
- CtrlããŒãæŒããã«ããŠã¹ãã€ãŒã«ã€ãã³ããåŠçãããšã
- ã©ã®ã¹ã¯ããŒã«ããŒãããŠã¹ãã€ã³ã¿ãŒã«è¿ãããå€æãã
- 察å¿ããã¹ã¯ããŒã«ããŒã®äœçœ®ãå€æŽãã
- canvas.paintïŒcanvas.getGraphicsïŒïŒïŒã®åŒã³åºãïŒDiagramPanelã¯ã©ã¹ã®canvasMouseWheelïŒMouseWheelEventïŒã¡ãœãããåç §ïŒã
ç¹å®ã®åºå®ç¹ãç¶æããªãããã£ãŒããã¹ã±ãŒãªã³ã°ãã
ãã®äŸã§ã¯ããŠãŒã¶ãŒã¯å³ã®çž®å°ºã2ã€ã®æ¹æ³ã§å€æŽã§ããŸããç»é¢äžã®ãã¿ã³ããºãŒã ã€ã³ãããã³ããºãŒã ã¢ãŠãããã¯ãªãã¯ããCtrl +ããŠã¹ãã€ãŒã«ã®çµã¿åããã䜿çšããŸãã ãããã®å Žåã§ããããã«ãããDiagramPanelã¯ã©ã¹ã®setScaleïŒdouble sïŒã¡ãœãããåŒã³åºãããŸãã ãããããŠãŒã¶ãŒã«ãšã£ãŠå¿«é©ã«èŠããããã«ããã«ã¯ãããã€ãã®ããªãã¯ãå¿ èŠã§ãã
æåã«ãã¹ã±ãŒã«ãåãå€ã«æ³šæãæããŸãããã ç§ãã¡ã®é·å¹Žã®çµéšããããã€ã¢ã°ã©ã ã®æããŠãŒã¶ãŒãã¬ã³ããªãŒãªæ¯ãèãã¯ãããºãŒã ã€ã³ããã¿ã³ã2åã¯ãªãã¯ããããšã§ã¹ã±ãŒã«ã2åã«ããããšã§ãã ããã¯ãããºãŒã ã€ã³ã/ããºãŒã ã¢ãŠãããã¿ã³ãæŒããšãçŸåšã®ã¹ã±ãŒã«å€ã2ã®å¹³æ¹æ ¹ïŒ1.41ïŒã§ä¹ç®/é€ç®ããããšãæå³ããŸãã
ãŠãŒã¶ãŒããªã¹ãããã¹ã±ãŒã«å€ãæäŸãããå Žåãã¹ã±ãŒã«ã®å¢å /æžå°ã®èŠèŠçãªåäžæ§ã®ããã«ããããã¯50ïŒ ã70ïŒ ã100ïŒ ã140ïŒ ã200ïŒ ã®2ã€ã®å¹³æ¹æ ¹åºŠããéžæããå¿ èŠããããŸãã
äžèŠãããšããCtrl +ããŠã¹ãã€ãŒã«ãã€ãã³ããã³ãã©ãŒã®ã³ãŒãã¯äºæããªãããã«èŠãããããããŸããã
private static final double WHEEL_FACTOR = 2.8854; // 1/ln(sqrt(2)) setScale(scale * Math.exp(-e.getPreciseWheelRotation() / WHEEL_FACTOR));
ã©ãããŠåºå±è ãããã®ã§ããããïŒ ããŠã¹ãã€ãŒã«å転ãã³ãã©ãŒã¯ããã€ãŒã«ã®ãŠãŒã¶ãŒã«ãã£ãŠè¡ããããã¯ãªãã¯ãã®æ°ãåãåãïŒãã¯ãªãã¯ãã®å°æ°éšåãçºè¡ãããããšããããŸãïŒãäžè¬çãªã«ãŒã«ã¯åãã§ãã2åã¯ãªãã¯ãããšãç»åã2åã«ãªããŸãã ãã ããããã¯ããã€ãŒã«ã®å転è§åºŠã«å¿ããŠã2ã®å¹³æ¹æ ¹ã®è§åºŠãšããŠã¹ã±ãŒã«å€ãå€æŽããå¿ èŠãããããšãæå³ããŸãã
ãã€ãŒã«ã¿ãŒãã³ã° | -2 | -1 | 0 | 1 | 2 |
ãºãŒã | 0.5 | 0.7 | 1.0 | 1.4 | 2.0 |
åçŽãªç®è¡ã¯ããããã®èšç®ãææ°ã«æžãããŸãã
次ã«ãDiagramPanelã¯ã©ã¹ã®setScaleïŒdouble sïŒã¡ãœããã䜿çšããŸãã
ãœãŒã¹ã³ãŒã
if (s < 0.05 || s > 100 || s == scale) return; Point p = MouseInfo.getPointerInfo().getLocation(); SwingUtilities.convertPointFromScreen(p, canvas); double xQuot; double yQuot; if (px > 0 && py > 0 && px < canvas.getWidth() && py < canvas.getHeight()) { xQuot = p.getX() / (double) canvas.getWidth(); yQuot = p.getY() / (double) canvas.getHeight(); } else { xQuot = 0.5; yQuot = 0.5; } int newHVal = hsb.getValue() + round(hsb.getVisibleAmount() * xQuot * (1 - scale / s)); int newVVal = vsb.getValue() + round(vsb.getVisibleAmount() * yQuot * (1 - scale / s)); hsb.setValue(newHVal); vsb.setValue(newVVal); scale = s; canvas.paint(canvas.getGraphics());
ãåçæ§ãã®æ°ããã¹ã±ãŒã«ã®å€ã以åã«ãã§ãã¯ããã¡ãœããã¯ã
- ããŠã¹ã«ãŒãœã«ã®äœçœ®ãååŸãã
- ããŠã¹ã«ãŒãœã«ãCanvasãªããžã§ã¯ãäžã«ããå Žåããã®çžå¯Ÿäœçœ®ãèšç®ããŸããããã§ãªãå ŽåãCanvasã®äžå€®ãçžå¯Ÿäœçœ®ãšèŠãªãããŸãã
- æ°ããã¹ã¯ããŒã«ããŒã®äœçœ®ãæºåãã
- ããããïŒïŒïŒãã£ãŒããæ¡å€§ããŠåæç»ããŸãã
ãããã®å°é£ã¯äœã®ããã§ããïŒ ããã¯ãã¹ãŠããŠãŒã¶ãŒã®ã¹ã±ãŒãªã³ã°äžã«ã圌ã®èŠç·ãçŸåšãã©ãŒã«ã¹ãããŠãããã€ã¢ã°ã©ã äžã®ãã€ã³ããèŠèŠçã«åºå®ãããããã«è¡ãããŸãã ãããè¡ãããªãå ŽåããŠãŒã¶ãŒã¯åãºãŒã åŸã«ã¹ã¯ããŒã«ããŒããããããå¿ èŠããããŸãã ãŠãŒã¶ãŒãç»é¢äžã®ãã¿ã³ã䜿çšããŠãºãŒã ã€ã³ãããšããã€ã¢ã°ã©ã ã®è¡šç€ºé åã®äžå¿ã¯éæ¢ãããŸãŸã«ãªãããŠãŒã¶ãŒãããŠã¹ãã€ãŒã«ã§ãããè¡ããšãã«ãŒãœã«ãäžã«ãããã€ã³ãã¯éæ¢ãããŸãŸã«ãªããŸãã 次ã®ããã«ãªããŸãã
ãã³ã¢ãŒã
ãã®äŸã¯ããã³ã¢ãŒããšãç»é¢äžã®ãã¿ã³ã§åãæ¿ãããããªããžã§ã¯ãã®éžæãšãã2ã€ã®ã¢ãŒãã§åäœããŸãã ãã³ã¢ãŒãã§ã¯ãå·Šãã¿ã³ãæŒãããŸãŸããŠã¹ãåãããšããã£ãŒãã®è¡šç€ºé åå šäœã移åããŸãã ãã³ã¢ãŒãã®æãåºãç¥ãããŠããäŸã¯ããã¡ãããAdobe Acrobat Readerã§PDFãã¡ã€ã«ã衚瀺ããããã®å¯Ÿå¿ããã¢ãŒãã§ãã
å·Šãã¿ã³ãæŒãããç¶æ ã§ã®ããŠã¹ã®åãã¯ãcanvasMouseDraggedã¡ãœããã§åŠçãããŸãããã³ã¢ãŒãã§ã¯ãããŠã¹ã«ãŒãœã«ã®åæäœçœ®ã«å¯Ÿããã¹ã¯ããŒã«ããŒã®äœçœ®ã調æŽããã ãã§ååã§ãã
if (panningMode) { hsb.setValue(round((startPoint.x - cursorPos.x / scale) * SCROLL_FACTOR)); vsb.setValue(round((startPoint.y - cursorPos.y / scale) * SCROLL_FACTOR)); }
ãã§ã«å®è£ ãããŠããæ©æ¢°ã¯ãæ£ããæ¹æ³ã§ç»åãåæç»ããŸãã
ãªããžã§ã¯ãéžæã¢ãŒã
ãªããžã§ã¯ããéžæããã¡ã«ããºã ã«é¢é£ä»ããããŠããããžãã¯ã¯å€å°ç°ãªãããã䟿å®äžãDiagramPanelã¯ã©ã¹ã®ãã¹ããããã¯ã©ã¹SelectionManagerã§åŒ·èª¿è¡šç€ºãããŠããŸãã ArrayListé ç®ã®ãã£ãŒã«ãã«ããã®ã¯ã©ã¹ã¯çŸåšéžæãããŠãããã¹ãŠã®ãªããžã§ã¯ããæ ŒçŽããŸãã 圌ã¯ãShiftããŒã§ãªããžã§ã¯ãããã¯ãªãã¯ãããããªããªããã䜿çšããŠãªããžã§ã¯ããéžæãããã©ãã°ããŸãã ããã¯ãã¹ãŠã説æãšå®è£ ã®äž¡æ¹ã§éåžžã«è€éã§ãã ãã ãã æéç¶æ ãã·ã³ã®æŠå¿µã¯ãããããã°ããç解ãããã¹ãŠãå®çŸããã®ã«åœ¹ç«ã¡ãŸãã ïŒã¹ããŒããã·ã³ã¯GoFãã¶ã€ã³ãã¿ãŒã³ã®ãªã¹ãã«å«ãŸããŠããããéãããã¯ã©ã¹ã®ã¿ã¹ã¯ã«ã®ã¿é©çšã§ããŸãããäžéšã®ã¿ã¹ã¯ãç°¡çŽ åããå©äŸ¿æ§ãšèœåã«ãããå¥ã®éåžžã«äŸ¿å©ã§æšæºåããããã¶ã€ã³ãã¿ãŒã³ãšããŠæ±ãããšãã§ããŸããïŒ
ãªããžã§ã¯ããéžæããã¡ã«ããºã ã®èŠ³ç¹ããããã€ã¢ã°ã©ã äžã§ã®ããŠã¹ã«ãŒãœã«ã®ç§»åã¯ãDiagramPanel.Stateåæã®èŠçŽ ã«å¯Ÿå¿ãããªãŒãããã³ã®3ã€ã®ç¶æ ã®ããããã§çºçããŸãã
- ããŠã¹ã®å·Šãã¿ã³ãæŒãããŠããªã-åæç¶æ ïŒéžæäžïŒã ShiftããŒãæŒããªããè€æ°ã®ãªããžã§ã¯ããéžæããŸãã
- ããŠã¹ã®å·Šãã¿ã³ãæŒãã-2ã€ã®ãµãã±ãŒã¹ïŒ
- éžæãããªããžã§ã¯ãã®ã°ã«ãŒãã移åããŸãïŒãã©ãã°ïŒã
- é·æ¹åœ¢ã®æãçžïŒLASSOïŒãæç»ãããŸãã
SelectionManagerã¯ã©ã¹ãå®è£ ãããšããçŽã«æ¬¡ã®ç¶æ ãšé·ç§»ã®å³ã®ãããªãã®ãã¹ã±ããããŸããã
ãã®ã¹ããŒã ã¯ãæéç¶æ ãã·ã³ãå®è£ ããã®ãšåãæ¹æ³ã§ã³ãŒãã«å€æã§ããŸãã
é·æ¹åœ¢ã®ãªããªããæç»ããã«ã¯ãå¥ã®DiagramObjectã®åå«ã§ããDiagramPanel.Lassoã¯ã©ã¹ã䜿çšããŸãã ä»ã®ã¬ã³ãã©ãŒãšã¯ç°ãªãããã£ãŒãã«å±ããŠããªãããæç»ãããŸãããã匷調衚瀺ããåè§åœ¢ãæç»ããå¿ èŠããããšãã«DiagramPanelã¯ã©ã¹ã«ãã£ãŠäœæãããŸãã ããŠã¹ã«ãŒãœã«ã«å¯Ÿå¿ããå¿ èŠããããããã°ã©ãã£ãã¯ã¹ã³ã³ããã¹ãã®XORã¢ãŒãã䜿çšããŠinternalDrawSelectionã¡ãœããã«è¡šç€ºãããŸãã
é·æ¹åœ¢ã¯å·Šäžé ããæç»ããããæãçžãã®éå§ç¹ã¯ä»»æã®ã³ãŒããŒã«ããããšã«æ³šæããŠãã ããïŒã¢ãã¡ãŒã·ã§ã³ãåç §ïŒããããã£ãŠããã®é·æ¹åœ¢ãæç»ããã«ã¯ãæåã«LULã決å®ããå¿ èŠããããŸãã
int x0 = dX > 0 ? startPoint.x : startPoint.x + dX; int y0 = dY > 0 ? startPoint.y : startPoint.y + dY; g2.drawRect(x0, y0, Math.abs(dX), Math.abs(dY));
ãªããžã§ã¯ãã®ã°ã«ãŒããªãã»ããã å ã«æ»ããšã®çžäºäœçš
ãªããžã§ã¯ãã®ã°ã«ãŒãã®ç§»åãå®äºãããããŠãŒã¶ãŒã¯ããŠã¹ã®å·Šãã¿ã³ãé¢ããŸãã ã·ã¹ãã ã§äœãèµ·ãã£ãŠããŸããïŒ çè«çã«ã¯ãéžæã«è©²åœãããªããžã§ã¯ãã調ã¹ãŠããŠãŒã¶ãŒããããã移åããããšããäŒãããã ãã§ååã§ãã ãã ãããã¹ãŠãããã»ã©ç°¡åãªããã§ã¯ãããŸããã
if (commandManager != null) commandManager.beginMacro("drag & drop"); for (DiagramObject i : items) { DiagramObject curItem = i.getParent(); while (curItem != null && !items.contains(curItem)) { curItem = curItem.getParent(); } if (curItem == null) i.drop(dX, dY); } if (commandManager != null) commandManager.endMacro();
èŠããŠããããã«ããªããžã§ã¯ãã¯ãç¬ç«ãããã³ãåç¬ç«ãã§ãã 芪ãšåç¬ç«ãªããžã§ã¯ãïŒããšãã°ãã¢ã¯ã¿ãŒãšãã®äžã®çœ²åïŒãåæã«éžæç¯å²ã«å ¥ãå Žåã芪ãªããžã§ã¯ãã®ã¿ã移åããå¿ èŠããããŸãïŒããã«äŸåãããªããžã§ã¯ãã¯ãè¿œåŸãããŸãã
ãã®ãããã«ãŒããšå ±ã«äŸåãªããžã§ã¯ãã芪ãšãšãã«éžæç¯å²ã«å«ãŸããå ŽåãäŸåãªããžã§ã¯ããé€å€ããŸããé©åãªãªããžã§ã¯ãã«ã€ããŠã®ã¿ãç»é¢åº§æšã®ãªããžã§ã¯ãã®ãªãã»ããããªããžã§ã¯ãèªäœã«è»¢éããdropïŒdXãdYïŒã¡ãœãããåŒã³åºããŸãã DiagramObjectã¯ããç»é¢ããªãã»ããããäžçãã«åèšç®ãããã®ä»®æ³ã¡ãœããinternalDropãåŒã³åºããŸãããã®å®è£ ã¯ãç¶æ¿ã®ã¬ãã«ã§DiagramObjectããããŠã¹ãã©ãã°ãã€ãã³ããããªã¬ãŒããããŒã¿ã¢ãã«ãªããžã§ã¯ãã®å éšç¶æ ãå€æŽããŸãã
ãããŠããªãcommandManager.beginMacro / endMacroãžã®åŒã³åºããå¿ èŠãªã®ã§ããïŒ
ã·ã¹ãã ãå ã«æ»ã/ããçŽãæ©èœãå®è£ ããŠããå Žåã¯ããªããžã§ã¯ãã®ã°ã«ãŒããã©ãã°ããã¯ããšããŠæå®ããå¿ èŠããããŸãã ãããè¡ãããããŠãŒã¶ãŒããã©ãã°æäœããã£ã³ã»ã«ãããå ŽåãäžåºŠã«ç§»åããããªããžã§ã¯ãã®æ°ã ãå ã«æ»ãïŒïŒãã¿ã³ãã¯ãªãã¯ããå¿ èŠããããŸãã ãã®ãã¹ãŠã®è©³çŽ°ã«ã€ããŠã¯ãå ã«æ»ããšããçŽãã®å®è£ ã«é¢ããç§ã®èšäºãåç §ããŠãã ããã
ãããã«
ããã§ãäŸã®æºåãã§ããŸããã æ¯èŒçå°éã®ã³ãŒãã§ãã€ã³ã¿ã©ã¯ãã£ããªãã€ã¢ã°ã©ã ã衚瀺ããã³ç·šéããããŠãŒã¶ãŒåãã®ãã¹ãŠã®ã¢ã¡ããã£ãåããå®éã®åé¡ã解決ããå®éã®ã¢ããªã±ãŒã·ã§ã³ã«åã蟌ãããã®ååãªæºåãæŽã£ããå®å šã«æ©èœãããœãªã¥ãŒã·ã§ã³ãåŸãŸããã
CASE-toolsã®æµè¡ã®æ代ãé·ãéããŠããã®ã¯æ®å¿µã§ãããã®ãããªã¹ãã«ãããã°ãRational Roseã®å±éºãªä»£æ¿æ段ãäœæã§ããŸã:-)
ãã®èšäºã®äŸã®å®å šãªãœãŒã¹ã³ãŒãã¯ãMavenãããžã§ã¯ãã®åœ¢åŒã§https://github.com/inponomarev/graphexampleããããŠã³ããŒãã§ããŸã ã
é·å¹Žã«ãããããã®ãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠãããŒããã©ãªãªãããªãã¯ã¹ãã¬ã³ããã£ãŒããæ³äººéã®é¢ä¿å³ãç¡ç·æ©åšã®æ¹äœè§åšæ³¢æ°å³ããã©ã³ãéã®æ¥ç¶å³ãäœæããŸããã
ä»ã®ãããžã§ã¯ãã§äœ¿çšããå Žåããã®ã³ãŒãã¯GPLã©ã€ã»ã³ã¹ã®äžã§ã®ã¿å©çšå¯èœã§ãã
èè ã¯ã ShareXã·ã¹ãã ã®äœæè ã«æè¬ããŠããŸãããã®ã·ã¹ãã ã䜿çšããŠãèšäºã®ã¢ãã¡ãŒã·ã§ã³GIFã€ã©ã¹ããäœæãããŸããã