åºç«
Javaã®Swingãäžã«ç»å ŽããŠãã30幎è¿ããæ¢ã«ãã¹ã¯ãããã®GUIãã¬ãŒã ã¯ãŒã¯ãšããŠã¯ãã£ãã圱ãèããªã£ãŠããŸããŸãããããã®æšç¶ã¯åœæç±å¿ã«åŠãã ç§ãããããšããšãŠãå¯ãããã®ã§ãããã®åŸãæ°ããªGUIãã¬ãŒã ã¯ãŒã¯JavaFXãç»å Žãããã®ã®ãããã䜿ã£ãã¢ããªãèŠãããšã¯ã»ãŒãããŸãããæ°ã¥ãã°æšæºSDKãããå€ããããšããæãç®ã«åã£ãŠããŠããã¯ãJavaã®GUIãã¬ãŒã ã¯ãŒã¯ã掻èºã§ããå Žæã¯çç¡ããšèšã£ãŠãè¯ããããããŸããïŒOracleã®ã€ã³ã¹ããŒã©ã¯ãŸã Javaãªãã§ãããïŒïŒã
ãããªç¶æ³ã«ããäžãç§ã¯ä»äºã§å®£èšçUIã§ããSwiftUIã«è§ŠãããããŸã§ã®åœä»€çUI, ãããã¯XMLã§çµã¿ç«ãŠãåŸæ¥æ¹åŒããGUIæ§ç¯ãæ°ããªå±é¢ã«çªå
¥ããããšã宿ããŸãããããã§æãåºããã®ãSwingãã¹ãã«ããã¡ã䌌ãŠããããªãã§ãããSwiftãšãããSwingã宣èšçUIåãããã°ãJAVAerã®æ¹ã
ãæè»œã«GUIãããããããã«ãªãã®ã§ã¯ãªããïŒãšæåŸ
ãããšããã§ããããå
¬åŒããã¯äœã®ã¢ããŠã³ã¹ããªãããŸããå·éã«èããŠJavaã®ææ³ã ãšå®£èšçUIåããã®ã¯é£ãããšãããããã®ã¯åãããŸãããªã®ã§ããã®èšäºã§ã¯ããããSwingã宣èšçUIåããããïŒããå®éšçã«è©Šã¿ãããšæããŸãããã ãç§èªèº«ã¯GUIæè¡ã®æ·±ããšãããŸã§ç²ŸéããŠããã¯ã±ã§ã¯ãªãã®ã§ãæž©ããç®ã§èŠå®ã£ãŠãããã幞ãã§ãð€
äžå¿ã以åã®èšäºã®ãªã³ã¯ã貌ã£ãŠãããŸããããSwingUI çèªïŒããšé¡ããèšäºã§ãç°¡åãªãµã³ãã«ãèŒããŠããŸãããŸãèšäºã®æåŸã«ãæè£œSwingUIã§äœæããã¢ããªã®åç»ãå
¬éããŠããŸãã
宣èšçUIåããã®ã«å¿ èŠãªããš
äžã«ã¯Swiftã®ä»ã«ãKotlinãFlutter(Dart)ã§ã宣èšçUIãæ¡çšãããŠããŸãããç®æãã®ã¯SwiftUIã§ããããã¯ããã©ã«ãåŒæ°ããµããŒããããŠããªãJavaã§ã¯ããããåæã®KotlinãFlutterã®ããã«ã¯èšè¿°ã§ããªãããšããã®ãäžçªã®çç±ã§ããã¡ãªã¿ã«ç§ã¯çŸåšFlutterã§ã¹ããã¢ããªãäœã£ãŠããŸããããšã«ããè²ã
ãšé¢åãªãã§ããäœçœãåŸãã远å ããã®ãå°å³ã«é¢åãªãã§ããããããŒã«ã®æ©èœã䜿ãã°è¯ãã®ã§ãããã¡ãã£ãšãâŠ
@override
Widget build(BuildContext context) {
return MaterialApp (
home: Scaffold (
appBar: AppBar (
title: Text('Flutter ãµã³ãã«'),
),
body: Center (
// PaddingãŠã£ãžã§ããã§åèŠçŽ ã®åšå²ã«äœçœãèšå®
child: Padding (
padding: EdgeInsets.all(8.0),
child: Row ( // åçŽæ¹åã«äžŠã¹ã
children: [
Text (
'Flutter Sample',
style: TextStyle(fontSize: 18),
),
Column ( // æ°Žå¹³æ¹åã«äžŠã¹ã
children: [
Text("Item1"),
Text("Item2"),
],
),
],
),
),
),
),
);
}
ãã£ã±ãããã®ãããªå
¥ãåæ§é ã¯èŠã¥ããã§ãïŒäœã§ã€ã³ãã³ãã2æ¡ãªãã âŠïŒãããã«åèŠçŽ ã«äžã
childãchildrenã£ãŠåŒæ°ã®ã©ãã«æå®ãæžããªããšãããªããšããç§ã«ã¯ã ããå€ãããã«èŠããŸããæ¬åœã¯Flutterã§æžãã®ãæ¢ãããããããªã®ã§ãããHot Reloadã䟿å©éããŠâŠ ïŒã«ããŠããæ«å°Ÿã®)ã]ã®é£ç¶ãæ°ã«ãªããªãã£ãã®ïŒèšèšè
ããïŒïŒ
ãŸããããã§ããããããã§ã°ããããšã§ããããŸãããäžæ¹ãSwiftUIã¯ä»¥äžã®ãããªæãã§ãã
var body: some View
{
VStack // åçŽæ¹åã«äžŠã¹ã
{
Text("SwiftUI Sample")
.font(.title)
.padding() // åšå²ã«äœçœ
HStack // æ°Žå¹³æ¹åã«äžŠã¹ã
{
Text("Item 1")
Text("Item 2")
}
}
}
.font()ã.padding()ã¯åºæ¬çã«ã¡ãœãããã§ãŒã³ã«ãã£ãŠå®çŸãããŠããŸããã¡ãœãããã§ãŒã³ãšã¯StringBuilderã§èŠããã¢ã¬ã§ãã
StringBuilder sb = new StringBuilder();
sb.append("äžè¡ç®\n")
.append("äºè¡ç®\n")
.append("äžè¡ç®\n");
Swingã§ã¯åºæ¬çã«ãã¿ã³çã®GUIéšåã¯JComponentãšããäžäœã¯ã©ã¹ãç¶æ¿ããŠããŸããããã®JComponentãåã¡ãœãããè¿ãããšããæäœãå®çŸããŸããã¡ãªã¿ã«StringBuilderã¯append(String)çã®ã¡ãœããã¯ãèªèº«ã®ã¯ã©ã¹ã®ã¡ãœãããé£ç¶ããŠåŒã³åºããããStringBuilderãè¿åŽããŠããŸããããããšåãä»çµã¿ã§ãã
ãããšåæãšããŠããã¡ããSwingã®åºç€ç¥èãããæ¹ãè¯ãã®ã§ããããŸããšããããããã§ããããå¿
èŠãããã°ãéœåºŠèª¬æããŸãïŒãã¶ãïŒã
ãŸãã¯çžŠæšªäžŠã³ã®ã¬ã€ã¢ãŠããã
åºæ¬äžã®åºæ¬ãã¬ã€ã¢ãŠãããå®çŸããŠãããŸããã¬ã€ã¢ãŠããšã¯ãGUIéšåã䞊ã¹ãŠããããŒã¹ãšãªããã®ã§ãSwingã ãšãäŸãã°FlowLayoutãBorderLayoutçããããŸããåè
ã¯ãã®ã¬ã€ã¢ãŠããèšå®ããåŸããã¿ã³çGUIéšåãèŒãããšæšªäžŠã³ã«äžŠã¹ãŠãããŸãïŒè¡šç€ºããããªããªã£ããæ¹è¡ïŒãåŸè
ã¯äžå¿ãã¡ã€ã³ãšãããã®åšãã«äžäžå·Šå³ã«GUIéšåã䞊ã¹ãã¬ã€ã¢ãŠãã§ãã
ã»Oracleã®BorderLayout説æãã¥ãŒããªã¢ã«ããæç²
ãã®ããã«ã¬ã€ã¢ãŠãã¯GUIéšåãæå³éãã«äžŠã¹ãããã®ããŒã¹ã§ããå
ã«æããSwiftUIã®äŸã®ããã«çžŠäžŠã³ïŒåçŽæ¹å䞊ã³ïŒã暪䞊ã³ïŒæ°Žå¹³æ¹å䞊ã³ïŒã«ããã®ã«é©ããSwingã®ã¬ã€ã¢ãŠãã¯BoxLayoutã§ãããã
ã»Oracleã®BoxLayout説æãã¥ãŒããªã¢ã«ããæç²
ããŠãGUIéšåã䞊ã¹ãã¬ã€ã¢ãŠãã¯çè§£ã§ãããšããŠãããã§ã¯ãã®ã¬ã€ã¢ãŠããã©ãã«èšå®ããã®ãïŒãšããçåãçããã§ããããåºæ¬çã«Swingã®äœãã¯ãŠã£ã³ããŠã衚ãJFrameãšãã®äžã«é
眮ãããJPanelãååšããŸãã倧æ ãJFrameã§ããã®äžã§åºç»ãåºåãã®ãJPanelã§ãïŒJPanelèªäœã¯åãªãèæ¯ã ãã®ååšã§ãããå
·äœçã«ã¯äžå³ã®ã°ã¬ãŒéšåãšèããŠãã ããïŒã
äžèšã®BoxLayoutã§äŸãããšããã¬ãŒã æ ãJFrameã§ããã®äžãJPanelã§ããããã®JPanelã«BoxLayoutãèšå®ãããããšã§ããã¿ã³ã瞊ã«äžŠãã§ããïŒãã®äŸã§ã¯åºç»ã¯äžã€ïŒããšè§£éããã°ããšããããè¯ãã§ããããã¡ãªã¿ã«çžŠäžŠã³ã®äžã§æšªäžŠã³ãå®çŸããã«ã¯éäžã®ãã¿ã³ãJPanelã«å
¥ãæ¿ãïŒJPanelãGUIéšåã®ã²ãšã€ïŒããã®JPanelïŒãã®å Žåãåºç»ã¯ïŒã€ïŒã«æšªäžŠã³ã®BoxLayoutã®ã¬ã€ã¢ãŠããèšå®ãïŒäžå³ãé»è²éšåïŒããã®äžã«ãã¿ã³ã䞊ã¹ããããªãã§ãããã€ã¡ãŒãžã§ããã§ããããïŒ
ã»çžŠäžŠã³ã®äžã«æšªäžŠã³ã®BoxLayout
ã³ã³ããŒãã³ããç¬èªã«æ¡åŒµ
Swingã®GUIéšåã¯APIã§ã¯ã³ã³ããŒãã³ããšåŒã°ããŠããããã®ã³ã³ããŒãã³ãã衚ãJComponentãåGUIéšåã¯ã©ã¹ãç¶æ¿ããŠãã圢ã«ãªã£ãŠããŸãããã®ã³ã³ããŒãã³ããç¶æ¿ããåGUIéšåã¯ã©ã¹ãç¬èªã«æ¡åŒµããããšã§å®£èšçUIåãããç®ç®ã§ããããå°ãå
·äœçã«èª¬æãããšãåGUIéšåãç¶æ¿ããã¯ã©ã¹ãäœæããããã«å®£èšçUIåã«é©åãããã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ãããããšã§ãæ¡åŒµããã¯ã©ã¹ãå
±éçã«æ±ããããã«ããŸãã
Widgetã¯åGUIéšåãå¿
ãå®è£
ããªããŠã¯ãªããªããéã«èšãã°ãã©ããªGUIéšåã察å¿ã§ããåºæ¬çãªã¡ãœãããå®çŸ©ããŸããäŸãã°padding()ã¯GUIéšåã®åšå²ã«äœçœãäœãã¡ãœããã§ãããframe()ã¯ããã®GUIéšåã®å¹
ãé«ãã®ãµã€ãºã決ããŸãããšããã§ãŠã£ãžã§ãããšããåç§°ã¯Linuxçã®UNIXç³»OSã§çšŒåããX Windowã§GUIéšåãæãåèªã§ããFlutterã§ãåæ§ã«åŒã°ããŠããŸãããæŠå¿µçã«ã³ã³ããŒãã³ãâãŠã£ãžã§ããã§ãããã³ã³ããŒãã³ãã¯Swingã®GUIéšåã衚ãäžè¬çãªéç§°ããŠã£ãžã§ããã¯ç®æããšããã®SwingUIã«ãããGUIéšåã衚ããã®èšäºïŒãããã¯SwingUIïŒã§ã®åŒç§°ã§ãããããã«ããããã®Widgetã§å®çŸ©ãããŠãããããåã¡ãœãããèªåèªèº«ãè¿åŽããããšããã¢ã§ããå
ã«ãè§Šãããããã¡ãœãããã§ãŒã³ãå®çŸããä»çµã¿ã«ãªããŸãã
ã§ã¯å®éã«ãã®Widgetãå®è£
ããGUIéšåãäœæããŸãããŸãã¯JPanelãæ¡åŒµããPanelWTã§ããã¡ãªã¿ã«æ«å°Ÿã®WTã¯Widgetã衚ããŸãã
ä»åã®èšäºã§ã¯ããã®PanelWTãBoxLayoutã§GUIéšåã瞊ããããã¯æšªäžŠã³ã«ããããšããã²ãšãŸãã®ãŽãŒã«ã§ããã¡ãªã¿ã«Javaã®ããŒãžã§ã³ã¯åºãé©çšã§ãããããJava8ã«ããŠãããŸãã
ããŠãPanelWTã§ãããJPanelãç¶æ¿ããWidgetãå®è£
ããŠããŸããå
ã«ãã¡ãã£ãšè§ŠãããããJPanelãGUIéšåãªã®ã§ãWidgetãå®è£
ããã®ã§ãã詳ããå®è£
ã®è©±ã¯ãŸã次å以éã«åããŸãããä»å䜿çšããã®ã¯padding(int), frame(int, int), background(UIValue)ã«ãªããŸãããããã®å®è£
ã§ãããé ã«èª¬æãããšãpadding(int)ã¯PanelWTã®åšå²ã«æå®ãããæ°å€(px)ã®äœçœã確ä¿ããŸããæ¬æ¥ã¯äžéšã®ã¿ãšããå·Šå³ã®ã¿ã«äœçœãèšå®å¯èœã«ãããšããã§ããããŸãã¯äžçªåçŽãªãã®ã§å®è£
ã§ããæ¬¡ã«frame(int, int)ã§ãããããã¯PanelWTã®ãµã€ãºãåºå®ãµã€ãºã«èšå®ãããã®ã«ãªããŸããã¬ã€ã¢ãŠãã«äŸåããã®ã§ãå¿
ãããåºå®ãµã€ãºã«ãªãããšãä¿èšŒãããã®ã§ã¯ãããŸããããåºæ¬çã«ã³ã³ããŒãã³ãã®ãµã€ãºãå¹
(width)ãšé«ã(height)ã§åºå®ããŸããæåŸã«background(UIValue)ã§ãããèæ¯è²ãæå®ãããã®ã§ããJPanelã¯åãªãèæ¯ã ãã®ååšããšå
ã»ã©è¿°ã¹ãŸãããããã®èæ¯è²ãå€ããããšãã§ããŸããã§ãèå¿ã®è²æå®ã§ãããColorãšãããã®åã®éããè²ã衚çŸããã¯ã©ã¹ã䜿ããŸãããã ããçŽæ¥Colorãæå®ããã®ã§ã¯ãªããUIValueãšããã¯ã©ã¹ãä»ããŠæž¡ãããã«ããŸãããã®UIValueã¯æ¬¡å以é説æããŸãããšãããããbackground(UIValue)ã«è²ãæž¡ãããšã§ããã®æå®è²ã«èæ¯ãå¡ãããããšããããã«èããŠãã ããã
ãã£ã宣èšçUIã£ãœããã®ãâŠ
ãããŸã§ã¯ããŸã 宣èšçUIã®åºç€å·¥äºã¿ãããªãã®ã§ããŸã ãã®æçµçãªå§¿ãã€ã¡ãŒãžã§ããªããšæããŸããããåŸ ããããŸããããããã宣èšçUIã®å§¿ãç®æããæ®µã«å ¥ããŸããã
ãã®èšäºã®ç®æšã¯SwiftUIã¿ãããªèšè¿°ãããããšã§ã宣èšçUIãç®æãããšã§ãããããVStack, HStackã§åŒã³åºãããã®å
éšã«åã³ã³ããŒãã³ãã䞊ã¹ãã®ã§ãããŸãã¯VStackã§èª¬æããŸãã
Javaã¯ã€ã³ã¹ã¿ã³ã¹ãäœæããã®ã«ãnewããŒã¯ãŒãã¯å¿
é ã§ããã宣èšçUIã«ã¯äŒŒåããŸãããããã§staticã¡ãœããã«ããããšã§ãnewããŒã¯ãŒãèšè¿°ãåé¿ããŸããpublicã®ã¡ãœããof()ãïŒã€ãããŸãããåºæ¬çã«ã©ã¡ããæåŸã®åŒæ°ïŒå¯å€åŒæ°ïŒãéèŠã§ããinit()ãèŠãŠãã ãããåã³ã³ããŒãã³ããè€æ°æå®ããããšã§ãBoxLayoutã§ã¬ã€ã¢ãŠãããPanelWTäžã«æå®ãããåã³ã³ããŒãã³ãã䞊ã¹ãŠãããŸããããã§ã¯çžŠæ¹åã§ãã
ãã®å®è£
ã«ãããVStack.of(JComponent...)ãåŒã³åºãããšã§ã³ã³ããŒãã³ãã®ã¬ã€ã¢ãŠãã瞊䞊ã³ã«ããããã«GUIéšåã䞊ã¹ãããšããSwiftUIã®äŸã§ç€ºãããããªããšãå¯èœã«ãªãã®ã§ãã
Startup#buildUpInVertical()ãèŠãŠãã ãããVStack.of()ãšHStack.of()ã®çµåãã§ãå
šäœã瞊䞊ã³ã§éäžã§æšªäžŠã³ããå®çŸããŠããŸããVStackãå€åŽã®PanelWTã§ãããHStackãå
åŽã®PanelWTã§ããPanelWTã¯ã³ã³ããŒãã³ãã®ç¶æ¿è
ãªã®ã§ãVStack.of(JComponent...)ã®åŒæ°ãšããŠHStackãæå®ã§ããã®ã§ããã¡ãªã¿ã«text(String)ã¯æååã衚瀺ããã³ã³ããŒãã³ããè¿ããŸãããããã¯ãããã¡ãããšå®£èšçUIã®GUIéšåãšããŠäœæããããšã«ããŸãã
以äžã®å®è¡çµæã¯èŠçŽãã«ãããèŠãç®ã®å€åããããŸãã
詳ããã¯ãèšäºã®æåŸã«ãã远èš(2025.11.27)ãã芧ãã ããã
ã»çžŠäžŠã³ VStack ã®äžã«æšªäžŠã³ HStack ãå®çŸ
VStack, HStackããããã«èæ¯è²ãæå®ããŠããŸããããã«ãããããããã®PanelWTã®æç»ç¯å²ãåããããããªã£ãŠãããšæããŸããåè
ãã·ã¢ã³ãåŸè
ãé»è²ã§å¡ãåããŠããŸãã
ãŸãVStackã«padding(int)æå®ããããšã§åšå²ã«äœçœãçããŠããããšã確èªã§ããã§ããããå ããŠframe(int, int)ã«ãããèµ·åæã®VStackã®å¹
ãé«ããå®çŸã§ããŠããããã§ãïŒãã¬ãŒã ã®ãµã€ãºã§ã¯ãªãã®ã§ããæ³šæãïŒããããå®è¡ã§ããç°å¢ãããã°ããŠã£ã³ããŠãã¬ãŒã ãåºããããšã§ãããã«åãããŠPanelWTã®ããããã®é åãå€åããããšã確èªããŠã¿ãŠãã ãããã¡ãªã¿ã«ãããžã§ã¯ãã¯Visual Studio Codeã§äœããŸããïŒgradle䜿çšïŒãç§ã¯å
æ¥EclipseããããªãæããŠããã®ã§ãããæè¿ã®è¥è
ã¯ãã®ãããªããã°ã©ããEclipseãããããšåŒã¶ããã§ãããŸãã§åäŸéšå±ãããããšåŒã°ããŠãããããªæ°ãããã®ã§ãæ
£ããªãã§ããã¬ãã³ã§ãã
ã€ãã§ã«éã®HStackã®äžã«VStackããããŸãã®ã§ããã®ç»åãä¹ã£ããŠãããŸãã
ã»æšªäžŠã³ HStack ã®äžã«çžŠäžŠã³ VStack ãå®çŸ
SwiftUIã®ä»æ§ãšããŠãã³ã³ããŒãã³ãã¯åºæ¬çã«äžå¿ã«å¯ãããèšèšãããŠããã®ã§ããããèžè¥²ããŠããŸããæåŸã«åæ§ãªç»é¢ãæ¬å®¶ã®SwiftUIãšæ¯ã¹ãŠã¿ãŸãããã
ã»æ¬å®¶SwiftUIãšæ¯èŒïŒ
SwiftUIã¯åã³ã³ããŒãã³ãã®ãµã€ãºã«åãããŠé åã調æŽããã®ã«å¯ŸããSwingUIã®VStackã¯åçã«é åãå²ãåœãŠãã®ã§ãé åã®ãµã€ãºã«éãããããŸããããã¯BoxLayoutã®ä»æ§ãªã®ã§ä»æ¹ãªããšå²ãåããŸãããŸãããããªæãã§SwiftUIãç®æããªãããããããç®æãSwingUIãšèããŠãã ãããããªããªãã§ããããã
ãããã«
次å以éã¯ä»ã®GUIéšåã宣èšçUIã®ä»²éã«å ããŠãããŸãããŸããSwiftUIã®@Stateã®ãããªã倿°ãå€åãããããšã§GUIéšåã®èŠãç®ãå€ãããããæ©èœã玹ä»ããã®ã§ããèå³ã®ããæ¹ã¯æ¥œãã¿ã«ãåŸ
ã¡ãã ãããã§ã¯ð
è¿œèš (2025.11.27)
SwiftUIã®ä»æ§ãšããŠãã³ã³ããŒãã³ãã¯åºæ¬çã«äžå¿ã«å¯ãããèšèšãããŠããã®ã§ããããèžè¥²ããŠããŸãã
SwiftUIã®ä»æ§ã«å£ã£ãŠãã³ã³ããŒãã³ããäžå¿ã«å¯ãããã«VStack,HStackã調æŽããã®ã§ãããå°ã
åé¡ãçããŸããããã
ãŠã£ã³ããŠã»ãã¬ãŒã ã倧ããããæã«ãªã¹ãçãé åãå¢ããåã倧ããèŠãããã³ã³ããŒãã³ããããããªããªããªããŸããŠâŠ ã§ãæçµçã«äžå¿ã«å¯ããããšã«ãã ããããšãæ¢ããŸããã
ã»ãŠã£ã³ããŠã®å€§ããã«åãããŠãªã¹ã衚瀺ã倧ãããªãäŸïŒèŠçŽãåŸïŒ
調æŽãæ¢ããããšã§ãå ã«ãèŠãããå®è¡çµæã¯ä»¥äžã®ããã«äœçœ®ãåã£ãŠããŸããŸãããå¥ã®æ¹æ³ã§èª¿æŽå¯èœãªäºå®ã§ãã®ã§ãã²ãšãŸãã¯ã³ã¬ã§ãããããšæããŸãã
ã»äžéšã«å¯ã£ãŠããŸã£ãå®è¡çµæâŠ
ã¡ãªã¿ã«çŸç¶ãStartupã¯ã©ã¹ã®VStack#frame(int, int)ãã³ã¡ã³ãã¢ãŠããããšãé©åãªã³ã³ããŒãã³ããµã€ãºã§ããŠã£ã³ããŠã®äžå¿ã«äœçœ®ããããã«ãªã£ãŠããŸãïŒäœåºŠãGithubã«ã³ããããã¡ãã£ãŠãã®ã§ããªããªãæ¹ã¯èœãšãçŽããŠãã ãã⊠ãããã¯ãµã€ð¥žïŒã
ã»ãŠã£ã³ããŠäžå¿ã«ã³ã³ããŒãã³ããé 眮ïŒframe()ã¡ãœããã¯ã³ã¡ã³ãã¢ãŠãïŒ
ãŸããèŠæ¹ã«ãã£ãŠã¯æ¬å®¶SwiftUIã®çµæã«ããè¿ããªã£ãããšãèšããããâŠð