- ãJavaã¢ãã¬ããïŒSwingãšåŒã°ããèŽåœçãªç æ°ã«çºå±ããïŒã
- ãã¹ã€ã³ã°ã¯ãæ§ããã«èšã£ãŠããæé©ãªUIãã¬ãŒã ã¯ãŒã¯ã§ã¯ãããŸããã
- ãã¹ã€ã³ã°ã¯ã²ã©ãã£ãã
Swingãçæ³çã§ãããµãã¯ããŸããã ããã¯çå®ã§ã¯ãããŸããã ããããç§ãçŽé¢ããªããã°ãªããªãã£ãé·æãšçæã説æããããšããŸãã
ã¹ã€ã³ã°ããçç±
ç§ã¯æ°å¹Žéãæç¶çã«Swingã䜿çšããŠããŸãã äž»ã«å€æ¹ã«ã åçãã°ã«ãŒãã§ä¿è·ããããã®ããžã¥ã¢ã«ãŠã©ãŒã¿ãŒããŒã¯ããã°ã©ã ãæžããŠããŸãã ç§ã¯2011幎ã«JavaããŒãžã§ã³ãæã£ãŠããŸãããMacçšã®ããŒããäœæããŠã€ã³ã¿ãŒãã§ã€ã¹ããªãããã£ãã®ã§ããããã©ãããã©ãŒã ããšã«å¥ã ã®ããã°ã©ã ãæžãæ¹æ³ããããŸããã§ããã
2011幎ã®åããã¯ãã¹ãã©ãããã©ãŒã éçºUIã©ã€ãã©ãªã¯æ¬¡ã®ç¶æ ã«ãããŸããã
- QMLã¯ãã¹ãŠãã°ã§ãããã³ã³ããŒãã³ãã®äžã«ã¡ãã¥ãŒã衚瀺ããããã¢ã倱æããQtCreatorã«ãµããŒãããããŸããã§ããã ã¢ã¯ã»ã©ã¬ãŒãã¬ã³ããªã³ã°ã¯ãæšå¹Žç§ã«Qt5ã§ã®ã¿ç»å ŽããŸããã
- Qtã¯é©åããŸããã§ããããªããªã ããã¯å®å šã«ããã€ãã£ããã³ã³ããŒãã³ãäžã«ããããã°ãã°ã©ããã§ã¬ã³ããªã³ã°ãå€æŽããå¿ èŠããããŸããã
- Juceã¯æ©èœçã§ãã°ããªããã¯ã©ãã·ã¥ããŸããã§ããã ãªãŒãºããã«ãªè²»çšããããããªãŒãã³ãœãŒã¹ã§ãã³ã¹ããããããŸãã C ++ãæãã ããã¯ãéåžžã«å€ãã®è³¢ã人ã ã話ãçŽ æŽãããèšèªã§ãã ç§ã®å°ããªçµéšãšã¿ã¹ã¯ã®å€§ãããèãããšãC ++ã®è€éãã¯äžå©ã§ãã ããã«ãXcodeã¯C ++ããªãã¡ã¯ã¿ãªã³ã°ã§ããªãããšãå€æããŸããã
- Adobe Airã¯ãã«ãã¹ã¬ããããµããŒãããŠããŸããã
- Mono + GTKãã®çµã¿åããã¯ç§ã®åé¡ã解決ã§ããããã«æããŸãã ãã®ç¬éãGTKã§ã¢ã€ãã«ç¶æ ã®ãããããŒã䜿çšããæãããªæšªæ£ã«é©ããããŸããã MonoDevelopããå€æãããšããããŸã§ã®ãšããä¿®æ£ãããŠããŸããã
- JavaFX㯠Macçšã§ã¯ãããŸããã§ããã
- SWT㯠Swingãããã¯ããã«ç°¡åã§ãäžè¬çã«åªããŠããŸãã æåŸã«èŠãã®ã§ãSWTã«ã¯æžããŸããã§ããã ãã§ã«å€ãã®æéãè²»ããããŠãããæåã®ãã°ïŒããŒã«ããŒã®ãã¿ã³ã®é«ãããæµ®ããŠãããïŒã®å®éšãçµäºããŸããã
åœæãJavaã¯Mac OS Xã®äžéšã§ãããåªãããã€ãã£ãã«ãã¯ã¢ã³ããã£ãŒã«ãåããŠãããWindows JREã®ééã¯ããã12ã¡ã¬ãã€ãã§ããã ç§ã¯åçŽã«æåã確信ããŠããŸããã ãã®çµæã2ãæãŸãã¯3ãæã®äœæ¥ã®åŸãJava Swingããã°ã©ã ã®æåã®ããŒãžã§ã³ã«ãªããŸããã
çŸåšãŸã§ã«ãèšèŒãããŠããåé¡ã¯QMLããã³JavaFXã§ä¿®æ£ãããŠããŸãã ãããã£ãŠãã¹ããŒãžã°ã©ãã䜿çšããæºåãã§ããŠããå Žåã¯ãããããè©Šé転ããŠãã ããã
Qtã¯Digiaã®åäžã«å ¥ããŸããã iPhoneããã³Androidã®ããŒã¿ãªãªãŒã¹ã¯ãã©ã€ãã©ãªã®ãããªãéçºãžã®åžæãäžããŸãã
JavaFXã¯ãä»å¹Ž2æã«ãªãŒãã³ãœãŒã¹ã©ã€ãã©ãªã«ãªããŸããã OpenJDK ãšã®äºææ§ã¯ JDK 9ã§èšç»ãããŠããŸãã9kaãçºè¡šãããæç¹ã§ã¯äžæã§ãã 8çªç®ã®ããŒãžã§ã³ã®ãªãªãŒã¹ã¯2014幎åé ã«äºå®ãããŠããŸãã
ããã
è¯ããšããããå§ããŸãããã çªç¶ãç§ãSwing-hateersã«ãµã€ã³ã¢ãããããšæããŸããïŒïŒ
ãã¹ãŠã®ã¬ã³ããªã³ã°ã¯ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã§ãã Swingã¢ããªã±ãŒã·ã§ã³ã¯GPUã§ã¬ã³ããªã³ã°ããããããéçºè ã¯äœãå¿ èŠãšããŸããã ããã«ãããã¢ããªã±ãŒã·ã§ã³ã§ã¢ãã¡ãŒã·ã§ã³ãå¯èœã«ãªããŸãã ã¢ããªã±ãŒã·ã§ã³ããã«ã¹ã¯ãªãŒã³ãŸãã¯24ã€ã³ãã¢ãã¿ãŒã«å±éãããŠããå Žåãå«ã¿ãŸãã
MVC Swingã¯å·šå€§ã§ãããšæ¹å€ãããŠããŸããåã³ã³ããŒãã³ãã¯ããã¥ãŒãã³ã³ãããŒã©ãŒãã¢ãã«ã§æ§æãããŠããŸãã åæã«ãããã«ãããæ¢åã®ã³ã³ããŒãã³ãã«ç®çã®æ©èœããã°ããè¿œå ã§ããŸãã ãã¹ãŠãéåžžã«æè»ã§ãã
Javaã¯ãããŒãžã³ãŒãã§ãã C ++éçºè ã®ã¿ããå©çšå¯èœãªããã°ã®å¯èœæ§ãåãé€ããŸãã ã¢ã¯ã»ã¹éåã®ãªã¹ã¯ã¯æå°éã«æããããŸãã ããã¯ãä»ã®ãã°ããªãããšãæå³ãããã®ã§ã¯ãããŸãããã ããšãã°ãã¡ã¢ãªãªãŒã¯ã
åªããéçºç°å¢ã EclipseãIntellij IDEAãNetBeans-éžæã¯èšå€§ã§ãã ã©ãã«ã§ããªãã¡ã¯ã¿ãªã³ã°ãã³ãŒãã®ãã©ãŒãããããªãŒãã³ã³ããªãŒããåäœãã¹ãã®ãµããŒãã
å€ãã®ã©ã€ãã©ãªã ãã€ãã£ããªããžã§ã¯ããæååãWebãæäœããLayoutManagers-ãã¹ãŠããªã¹ãããããšã¯ã§ããŸããã ããã¯ãã©ãããã©ãŒã ãšããŠã®å·šå€§ãªåãæã®Javaã§ãã
質åã«å¯Ÿããå€ãã®çãã ããšãã°ãåUIã©ã€ãã©ãªã®StackOverflow ã«é¢ãã質åã®å²åã§ã ã
StackOverflowã«é¢ããçŽ100åããšã«ãSwingã«é¢ãã質åããããŸãã å®éã«ã¯ãããã¯ã»ãšãã©ã®åé¡ããã§ã«è§£æ±ºãããŠããããšãæå³ããŸãã ã»ãšãã©ã®å Žåãããªããæ»åšããªãåé¡ã«äžå¯Ÿäžã§å¯Ÿå¿ããŸãã
ãã°ã
åã®éšåã¯ãçããã¬ã¹ãªãªãŒã¹ã®ãããªãã®ã§ãã ä¿®æ£ããŸããã ããã¯ããªããééãããããããªããã®ã§ãã
é倧ãªãã°ã¯ä¿®æ£ãããŸããã File.existsã¯JDK7ã®ãªãªãŒã¹ä»¥éæ©èœããŠããã ããŸã ä¿®æ£ãããŠããŸããã ãã°ãé倧ãªå Žåã§ããä¿®æ£ãŸã§æ°å¹ŽåŸ ã€ããšãã§ããŸãã
ãã€ãã£ãã³ãŒãã䜿çšããå Žåãç¶æ³ã¯ããã«æªåããå¯èœæ§ããããŸãã ã¢ãŒãã«ãŠã£ã³ããŠïŒããšãã°ãOpenFileDialogãéãïŒã䜿çšãããšãäžéšã®ã³ã³ãã¥ãŒã¿ãŒã§ããªãŒãºãçºçããç¶æ³ã«ééããŸããã Java Native Foundationã¯ãããã¥ã¡ã³ãã®äŸã«åŸã£ãŠäœ¿çšãããŠããŸãã ãããŠãStackOverflowã®æ©æµã¯ç§ãå©ããŸããã§ãã:-)
file.existsã®ãã°ã¯ãjava.nioã®ã¯ã©ã¹ã䜿çšããŠåé¿ã§ããŸãã ããã¯ãèã®å€ããã©ã«ããŒã®ããã©ãŒãã³ã¹ã®åé¡ã解決ããããã«èšèšãããæ°ããAPIã§ãã
ããªããããå¿ èŠãããããšïŒ
-
âDfile.encoding=UTF-8
ãã©ã¡ãŒã¿ãŒã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãèµ·åããŸã - File.existsã®ä»£ããã«ãFiles.exists
Files.exists(Paths.get(fileName))
ã䜿çšããŸã - File.listFilesã®ä»£ããã«äœ¿çšããŸã
try (DirectoryStream<Path> ds = Files.newDirectoryStream(folder)) { for (Path file : ds) { // do something } } catch (IOException e) { e.printStackTrace(); }
ãŸãã¯ããã®ãã°ãèªåã§ä¿®æ£ããäžé£ã®ã¬ãã¥ãŒã§ããã¯ããŒã¯ãæŒããŠãã ããã
Swingã¯ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã®ã¿ã§ãã ã€ãŸããã¢ããªã±ãŒã·ã§ã³ã¯VMwareãParallelsããŸãã¯ãªã¢ãŒããã¹ã¯ãããã§ã¯æ©èœããŸããã ããã«ææ ¢ããæºåãã§ããŠããªãå Žåã¯ãSWTã«æ³šç®ããŠãã ããã
Macçšã®32ããããã«ãã¯ãããŸããã å ¬åŒãã«ãã¯64ãããã®ã¿ã§ãã æ®å¿µãªããããã®æ±ºå®ã®çç±ã¯äœãªã®ãããããŸããã ç§ã¯ãããããã€ãã®ãã°ã®åé¡ã ãšæšæž¬ããããšãã§ããŸãã
ãã°ããã®éãHenri Gomezã¯32ãããããã³ãŠãããŒãµã«ãã«ãããµããŒãããŠããŸããã æ¢è£œã®ãã«ãã¯ãcode.google.comã®åœŒã®ããŒãžããããŠã³ããŒãã§ããŸãã æ®å¿µãªããšã«ãæéã®äžè¶³ãšæ°ããä»äºã«ããããã³ãªãŒã¯ãã®ãããžã§ã¯ããçµããããŸããã ãããªããèšã£ãŠã圌ã¯ãã«ãã¹ã¯ãªãããGitHubã«æçš¿ããŸããã
https://github.com/hgomez/obuildfactory
圌ãã®å©ããåããŠãMacããã³Linuxçšã®OpenJDKãæ§ç¯ã§ããŸãã çŽ æŽãããã§ãããããã§ã¯ãããŸããã ãããã®ã¹ã¯ãªããã§ã¯ãMacçšã®32ãããããŒãžã§ã³ã¯ãã«ããããŸããã JDKå ã«ã¯ãMacçšã®å³å¯ã«64ãããããŒãžã§ã³ã®ã¢ã»ã³ããªãä¿è·ãããŠããèšå€§ãªæ°ã®æ§æãã¡ã€ã«ããããŸãã ã¡ã€ã³ãã¡ã€ã«ã®ããŒãå€æŽããå£ããã¢ã»ã³ããªãååŸããŸãã Henri Gomezã32ããããã«ããã©ã®ããã«åéãããã¯ç§ã«ã¯ããããŸããã
ãã£ã¹ããªãã¥ãŒã·ã§ã³ã«JREãå«ããŸãã ã¢ããªã±ãŒã·ã§ã³é åžã«é¢ãããªã©ã¯ã«ã®å¹¹éšã®æèŠïŒãã¿ãŒã²ãããã©ãããã©ãŒã çšã®ãã³ãã«ãããJREãåããã¹ã¿ã³ãã¢ãã³ã®èªå·±å®çµåã€ã³ã¹ããŒã©ã¯ãããæåããã¢ããªã±ãŒã·ã§ã³é åžã¢ãã«ã§ããïŒ ãœãŒã¹ ïŒã ãã®æ±ºå®ã®æãå¯èœæ§ã®é«ãçç±ã¯ãã¢ãã¬ããã®èšå€§ãªæ°ã®è匱æ§ã§ããJavaã¯Flashã®SieveãããŒãæ¡çšããŸããã
ãã®å¶éã¯ãMac OS 10.7 Lionã§Javaãåé€ããAppleã«ãã£ãŠæã匷ããµããŒããããŠããŸãã ãŸããæ°ããã·ã¹ãã ã¢ããããŒããã€ã³ã¹ããŒã«ãããšãã«åŒ·å¶çã«ãªãã«ããŸãã
JRE 7ã®ééã¯çŽ100 MBã§ãã ã¢ãŒã«ã€ãã«ã¯çŽ50ãååŸãããŠããŸãããæ®å¿µãªãããæŽæ°ããæŽæ°ãŸã§ã®JREã®ãµã€ãºã¯æ¡å€§ããŠãããããèšåŒµããé åžã®åé¡ã解決ããå¿ èŠããããŸãã
ãã¹ãŠã®BufferedImageãªããžã§ã¯ããããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã䜿çšããããã§ã¯ãããŸããã BufferedImage.TYPE_INT_ *ã®ã¿ã ãããã£ãŠãTYPE_4BYTE *ã§åäœããJDK7ããã¯ãTYPE_3BYTEã«äžè²«æ§ããªããªããŸãã
BufferedImageã©ã¹ã¿ã®ããŒã¿ã«ã¢ã¯ã»ã¹ãããšãGPUãä»ããç»åã®æç»ãåæ¢ããŸãã ãããè¡ãããçç±ã¯æããã§ãããŠãŒã¶ãŒãããŒã¿ãå€æŽãããå®æããå€æŽãæ¹æ³ããªãããããããããªã¡ã¢ãªã«ãã€è»¢éããããæ確ã§ã¯ãããŸããã å°ãªããšãããã¯è«ççã§ãã
Visual Watermarkã§ã¯ãC ++ã©ã€ãã©ãªã䜿çšããŠç»åãããŒãããçµæã®ãã¯ã»ã«ãBufferedImageãªããžã§ã¯ãã«å€æããå¿ èŠããããŸããã äžåºŠã«1ãã¯ã»ã«ãã€å€æŽããã®ã¯éåžžã«é ããç»åã©ã¹ã¿ãããã¡ã«çŽæ¥æžã蟌ãå¿ èŠããããŸããã ã©ã¹ã¿ãŒã§getDataïŒïŒãåŒã³åºããšããã«ããã¹ãŠã®åçã®å éãåæ¢ããŸããã DataBufferIntã®ã³ãŒãã調ã¹ãŠããªãã¬ã¯ã·ã§ã³ã䜿çšããŠãã®åé¡ã®è§£æ±ºçãèŠã€ããå°ããªãã«ããŒã¯ã©ã¹ãäœæããŸããã
import java.awt.*; import java.awt.image.*; import java.lang.reflect.Field; import sun.awt.image.SunWritableRaster; import sun.java2d.StateTrackableDelegate; // Standard library prevents image acceleration once getData() method is called // This class provides a workaround to modify data quickly and still get hw-accel graphics public class AcceleratedImage { // Returns data object not preventing hardware image acceleration public static int[] getDataBuffer(DataBufferInt dataBuffer) { try { Field field = DataBufferInt.class.getDeclaredField("data"); field.setAccessible(true); int[] data = (int[])field.get(dataBuffer); return data; } catch (Exception e) { return null; } } // Marks the buffer dirty. You should call this method after changing the data buffer public static void markDirty(DataBufferInt dataBuffer) { try { Field field = DataBuffer.class.getDeclaredField("theTrackable"); field.setAccessible(true); StateTrackableDelegate theTrackable = (StateTrackableDelegate)field.get(dataBuffer); theTrackable.markDirty(); } catch (Exception e) { } } // Checks whether current image is in acceleratable state public static boolean isAcceleratableImage(BufferedImage img) { try { Field field = DataBuffer.class.getDeclaredField("theTrackable"); field.setAccessible(true); StateTrackableDelegate trackable = (StateTrackableDelegate)field.get(img.getRaster().getDataBuffer()); if (trackable.getState() == sun.java2d.StateTrackable.State.UNTRACKABLE) return false; field = SunWritableRaster.class.getDeclaredField("theTrackable"); field.setAccessible(true); trackable = (StateTrackableDelegate)field.get(img.getRaster()); return trackable.getState() != sun.java2d.StateTrackable.State.UNTRACKABLE; } catch(Exception e) { return false; } } public static BufferedImage convertToAcceleratedImage(Graphics _g, BufferedImage img) { if(!(_g instanceof Graphics2D)) return img; // We cannot obtain required information from Graphics object Graphics2D g = (Graphics2D)_g; GraphicsConfiguration gc = g.getDeviceConfiguration(); if (img.getColorModel().equals(gc.getColorModel()) && isAcceleratableImage(img)) return img; BufferedImage tmp = gc.createCompatibleImage(img.getWidth(), img.getHeight(), img.getTransparency()); Graphics2D tmpGraphics = tmp.createGraphics(); tmpGraphics.drawImage(img, 0, 0, null); tmpGraphics.dispose(); img.flush(); return tmp; } }
次ã®ããã«äœ¿çšããå¿ èŠããããŸãã
DataBufferInt dataBuffer = (DataBufferInt)bufferedImage.getRaster().getDataBuffer(); int[] data = AcceleratedImage.getDataBuffer(dataBuffer); // AcceleratedImage.markDirty(dataBuffer);
æ¢ã«è¡šç€ºãããŠããç»åã«å¯ŸããŠãã®ã³ãŒãããã¹ãããŠããŸããã
çµã¿èŸŒã¿ã®ã¢ãã¡ãŒã·ã§ã³ãšåéæã¯ãããŸããã javax.swing.Timerãªããžã§ã¯ãã¯2ã€ã®ããšãè¡ããŸãã
- ã³ã³ããŒãã³ãã®ã¢ãã¡ãŒã·ã§ã³ãäœæã§ããŸãã
- ã¯ã©ã¹ã¯åçŽã§ãããããéåžžã«é·ãæéå®è¡ããŸãã
ã¢ãã¡ãŒã·ã§ã³ãç°¡åã«äœæã§ããTiming Frameworkã©ã€ãã©ãªããããŸãã ã¢ãã¡ãŒã·ã§ã³ã¯æ¬¡ã®ããã«å®è¡ã§ããŸãã
Animator viewAnimator = new Animator.Builder() .setDuration(duration, TimeUnit.MILLISECONDS) // .setStartDirection(Direction.FORWARD) .setInterpolator(new AccelerationInterpolator(0.3, 0.7)) // .setRepeatCount(1).addTarget(new TimingTargetAdapter() { @Override public void timingEvent(Animator source, double fraction) { // repaint(); } @Override public void end(Animator source) { // - } }).build(); viewAnimator.start();
æãäžè¬çã«äœ¿çšãããã¢ãã¡ãŒã·ã§ã³ã¯ãäœçœ®ãšåéæã§ãã Swingãæ£åžžãªå Žåãæšæºã³ã³ããŒãã³ãã¯åéæããµããŒãããŸããã åé¡ã¯ã°ã©ãã£ãã¯ãšã³ãžã³ã®æ©èœã§ã¯ãªããã³ã³ããŒãã³ãã«getAlpha / setAlphaããããã£ããªããšããäºå®ã«ãããŸãã
GateKeeperã®ãããJavaã¢ããªã±ãŒã·ã§ã³ã¯Mountain Lionã§å®è¡ãããŸããã ãã®åé¡ã解決ããã«ã¯ãMac Developerããã°ã©ã ã«å¹Žé99ãã«ã§ãµã€ã³ã¢ããããå¿ èŠããããŸãã 代ããã«ãAppleã¯ã³ãŒãã«çœ²åããããã®èšŒææžãçºè¡ããåé¡ã¯ãªããªããŸãã
次ã®ãããªã¢ããªã±ãŒã·ã§ã³ã§ãã³ãã«ã«çœ²åã§ããŸãã
codesign âs âDeveloper IDâ âf âpath-to-my-app.appâ
åèšã§
ç§ã®æèŠã§ã¯ãSwingã®äž»ãªæ¬ ç¹ã¯ãéèŠãªãã°ãæªè§£æ±ºã®ãŸãŸã§ããããããã©ãããã©ãŒã ã®å°æ¥ã«é¢ããäžç¢ºå®æ§ã§ãã ãã©ãŠã¶ãã©ã°ã€ã³ã®è匱æ§ã®ã¿ãä¿®æ£ãåŸ ã£ãŠããŸãã å³æžé€šãæŸæ£ããããšããæèŠãåŸãããŸãã ä»ã®ãã¹ãŠã®åé¡ã¯ããã»ã©éèŠã§ã¯ãããŸããã
ãããŠããããæ¬åœãªããç§ã¯ãšãŠãæ²ãããªããŸãã Swingã§ãã¹ã¯ãããã¢ããªã±ãŒã·ã§ã³ãäœæããã®ã¯è¿ éãã€ç°¡åã§ãèšå€§ãªéã®æ¢è£œã®ç¡æã®ã³ãŒããååšããããã§ãã
åœåã®éãç§ã¯ãªã©ã¯ã«ã®éçºè ãã·ã¹ãã ã®åé¡ã解決ããæéãããããšãæãã§ããŸãã
æŽæ°ïŒ Qtã®ã³ã³ãããŒã«ã®ã«ã¹ã¿ãã€ãºãå¯èœã§ããããšãããã£ãã³ã¡ã³ãããïŒ
silvanskyã«æè¬
æŽæ°ïŒ SkyggedansãŠãŒã¶ãŒã¯ãAirããã«ãã¹ã¬ãããµããŒããè¿œå ããããšã«æ°ä»ããŸãã ã ããã¯ãéä¿¡ãæ§æã§ããè¿œå ã®SWFãã¡ã€ã«ãç ç²ã«ããŠè¡ãããŸãã