فرآیند توسعه یک برنامه رابط کاربری گرافیکی ساده در جاوا. ایجاد یک Java GUI ایجاد یک برنامه Java GUI

رابط گرافیکی در جاوا مسیر توسعه و شکل گیری بسیار سختی را طی کرده است. او برای مدت طولانی متهم به کندی کار، طمع منابع سیستم و عملکرد محدود بود.

جاوا AWT

اولین تلاش خورشید برای ایجاد رابط کاربری گرافیکییک کتابخانه برای جاوا وجود داشت A.W.T.(Abstract Window Toolkit) - یک جعبه ابزار برای کار با محیط های مختلف پنجره. Sun یک لایه جاوا ساخته است که متدهایی را از کتابخانه های نوشته شده به زبان C فراخوانی می کند. روش های کتابخانه AWT اجزای گرافیکی محیط عملیاتی را ایجاد و استفاده می کنند. از یک طرف، این خوب است، زیرا یک برنامه جاوا شبیه برنامه های دیگر در همان سیستم عامل است. اما وقتی آن را روی پلتفرم دیگری اجرا می کنید، ممکن است تفاوت هایی در اندازه اجزا و فونت ها وجود داشته باشد که ظاهر برنامه را خراب کند.

برای اطمینان از چند پلتفرم A.W.T.رابط های فراخوانی کامپوننت یکپارچه شده اند و در نتیجه عملکرد کمی کاهش یافته است. و مجموعه اجزاء بسیار کوچک بود. به عنوان مثال، هیچ جدولی در AWT وجود ندارد و نمادها در دکمه ها پشتیبانی نمی شوند. با این حال، بسته java.awtاز اولین نسخه همراه با جاوا گنجانده شده است و می توان از آن برای ایجاد رابط کاربری گرافیکی استفاده کرد.

بنابراین اجزاء A.W.T.هیچ "کاری" انجام نده. این فقط یک "جلد جاوا" برای کنترل آن است سیستم عاملکه روی آن کار می کنند. تمام درخواست‌های این مؤلفه‌ها به سیستم عامل هدایت می‌شوند که تمام کارها را انجام می‌دهد.

منابع استفاده شده A.W.T.سعی می کند به طور خودکار آزاد شود. این کمی معماری را پیچیده می کند و بر عملکرد تأثیر می گذارد. نوشتن چیزی جدی با استفاده از AWT تا حدودی دشوار خواهد بود. اکنون فقط برای اپلت ها استفاده می شود.

مفاهیم اولیه SWING

بعد از A.W.T. Sun یک کتابخانه اجزای گرافیکی ایجاد کرده است تاب خوردن، به طور کامل در جاوا نوشته شده است. 2D برای رندر استفاده می شود که چندین مزیت را به همراه دارد. مجموعه قطعات استاندارد از نظر تنوع و عملکرد بسیار فراتر از AWT است. Swing ایجاد اجزای جدید را با به ارث بردن از اجزای موجود آسان می کند و از انواع سبک ها و پوسته ها پشتیبانی می کند.

سازندگان کتابخانه UI جدید تاب خوردنچرخ را دوباره اختراع نکردند و AWT را به عنوان پایه ای برای کتابخانه خود انتخاب کردند. البته، ما در مورد استفاده از اجزای خاص AWT سنگین وزن (که توسط کلاس های Button، Label و موارد مشابه ارائه می شود) صحبت نکردیم. فقط اجزای سبک وزن، انعطاف پذیری و کنترل پذیری لازم را فراهم می کردند. نمودار وراثت رابطه بین AWT و Swing را نشان می دهد.

مهمترین تفاوت تاب خوردناز AWT این است که اجزای Swing به هیچ وجه به سیستم عامل متصل نیستند و بنابراین بسیار پایدارتر و سریعتر هستند. چنین مولفه هایی در جاوا سبک وزن نامیده می شوند و درک اصول اولیه نحوه کار آنها به توضیح نحوه عملکرد Swing کمک زیادی می کند.

کانتینرهای سطح بالا Swing

برای ایجاد رابط گرافیکی یک برنامه، باید از اجزای خاصی از کتابخانه Swing استفاده کنید که کانتینرهای سطح بالا نامیده می شوند. آنها ویندوزهای سیستم عامل هستند که میزبان اجزای رابط کاربری هستند. کانتینرهای سطح بالا شامل پنجره‌های JFrame و JWindow، کادر محاوره‌ای JDialog و اپلت JApplet (که یک پنجره نیست، اما برای نمایش یک رابط در مرورگر در حال اجرا این اپلت نیز در نظر گرفته شده است). کانتینرهای Swing سطح بالا اجزای سنگین وزن هستند و از قاعده کلی مستثنی هستند. سایر اجزای Swing سبک هستند.

ساده تاب خوردنمثال رابط پنجره jFrame.

واردات java.awt.Dimension; واردات javax.swing.JFrame; واردات javax.swing.JLabel; کلاس عمومی JFrameTest ( public static void createGUI() ( JFrame frame = new JFrame ("Test frame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)؛ JLabel label = new JLabel("Test label")؛ frame.getContentPane(). add(label) frame.setPreferredSize(new Dimension(200, 100)) frame.pack() frame.setVisible(true)) public void main(string args) (JFrame.setDefaultLookAndFeelDecorated(true)؛ javax. swing.SwingUtilities.invokeLater(New Runnable() ( public void run() (createGUI(); ) )); ) )

سازنده JFrame()بدون پارامتر یک پنجره خالی ایجاد می کند. سازنده JFrame (عنوان رشته)یک پنجره خالی با عنوان عنوان ایجاد می کند. خلق كردن ساده ترین برنامهبا یک پنجره خالی، روش های زیر باید استفاده شود:

  • setSize (عرض int، ارتفاع int) - تعیین اندازه پنجره.
  • setDefaultCloseOperation (عملیات int) - تعریف عمل در خاتمه برنامه.
  • setVisible (بولی قابل مشاهده) - پنجره را قابل مشاهده کنید.

اگر اندازه پنجره را تعریف نکنید، بدون توجه به آنچه در آن است، ارتفاع آن صفر خواهد بود. ابعاد پنجره نه تنها منطقه "کار"، بلکه مرزها و نوار عنوان را نیز شامل می شود.

متد setDefaultCloseOperation عملی را که باید در هنگام "خروج از برنامه" انجام شود را مشخص می کند. برای انجام این کار، ثابت EXIT_ON_CLOSE را که در کلاس JFrame توضیح داده شده است، به عنوان پارامتر عملیات ارسال کنید.

به طور پیش فرض، پنجره نامرئی ایجاد می شود. برای نمایش پنجره روی صفحه، متد setVisible با پارامتر true فراخوانی می شود. اگر آن را با پارامتر false فراخوانی کنید، پنجره نامرئی می شود.

رابط کاربری گرافیکی سوئینگ جاوامثال ایجاد پنجره jFrameدر شکل زیر نشان داده شده است.

برای اتصال کتابخانه تاب خوردنبرنامه باید کتابخانه را وارد کند javax.swing.

هر بار که یک ظرف سطح بالا ایجاد می شود، خواه یک پنجره معمولی، کادر محاوره ای یا اپلت باشد، سازنده کانتینر ایجاد می کند پانل ریشه JRootPane. کانتینرهای Swing سطح بالا اطمینان حاصل می کنند که سایر مؤلفه ها نمی توانند خارج از JRootPane «خزنده شوند».

ریشه رنگ پریده JRootPaneویژگی "عمق" را به کانتینرها اضافه می کند، و این توانایی را فراهم می کند که نه تنها اجزا را روی هم قرار دهید، بلکه در صورت لزوم، آنها را تعویض کنید، عمق اجزا را افزایش یا کاهش دهید. این ویژگی هنگام ایجاد یک برنامه چند سندی ضروری است. تاب خوردن، که پنجره های آن اجزای سبک وزنی را که روی هم چیده شده اند، و همچنین منوهای کشویی (زمینه ای) و نکات ابزار را نشان می دهد.

شکل زیر ساختار پانل ریشه را به وضوح نشان می دهد JRootPane.

پنل ریشه JRootPaneظرفی است که از کلاس پایه Swing JComponent به ارث می رسد. در این کانتینر، یک layout manager ویژه که در کلاس داخلی RootPaneLayout پیاده سازی شده است، وظیفه چیدمان کامپوننت ها را بر عهده دارد. این مدیر چیدمان وظیفه دارد اطمینان حاصل کند که تمام اجزای پانل ریشه همانطور که باید قرار می گیرند: پانل لایه ای کل فضای پنجره را اشغال می کند. FRAME_CONTENT_LAYER آن شامل نوار منو و پانل محتوا است و بالاتر از همه آن یک پانل شفاف است.

تمام اجزای پانل ریشه JRootPaneقابل دریافت یا تغییر است. برای این کار مجموعه‌ای از روش‌های get/set دارد. به صورت برنامه ای JRootPaneرا می توان با استفاده از متد getRootPane() بدست آورد.

علاوه بر کانتینرهای سطح بالا، پنجره ریشه در پنجره‌های داخلی JInternalFrame که در برنامه‌های چند سندی ایجاد شده‌اند و در "دسک‌تاپ" JDesktopPane قرار دارند، استفاده می‌شود. این به شما امکان می دهد فراموش کنید که این پنجره ها اجزای سبک وزن معمولی هستند و با آنها طوری کار کنید که گویی ظروف سطح بالایی واقعی هستند.

پنل لایه ای JLayeredPane

در پایه پانل ریشه (کانتینر) به اصطلاح پانل لایه ای قرار دارد JLayeredPane A که تمام فضای موجود در ظرف را اشغال می کند. در این پنل است که تمامی قسمت های دیگر پنل روت از جمله تمامی اجزای رابط کاربری قرار دارند.

JLayeredPaneبرای افزودن ویژگی عمق به ظرف استفاده می شود. یعنی پانل چند لایه به شما امکان می دهد بعد سوم را در ظرف سازماندهی کنید که در امتداد آن لایه ها (لایه های) جزء قرار دارند. در یک کانتینر معمولی، محل یک جزء توسط یک مستطیل مشخص می شود که نشان می دهد این جزء چقدر از ظرف را اشغال می کند. هنگام اضافه کردن یک کامپوننت به یک پانل چند لایه، باید نه تنها مستطیل اشغال شده توسط مولفه، بلکه لایه ای که در آن قرار دارد را نیز مشخص کنید. یک لایه در یک پانل لایه ای با یک عدد صحیح تعریف می شود. هر چه عددی که لایه را تعریف می کند بزرگتر باشد، لایه بالاتر است.

اولین جزء اضافه شده به ظرف بالاتر از اجزایی است که بعدا اضافه می شود. اغلب اوقات، توسعه دهنده با موقعیت های اجزا سروکار ندارد. هنگامی که اجزاء را اضافه می کنید، موقعیت آنها به طور خودکار تغییر می کند. با این حال، پانل لایه ای به شما این امکان را می دهد که موقعیت اجزا را پس از اضافه شدن به ظرف به صورت پویا تغییر دهید.

قابلیت های پانل لایه ای به طور گسترده توسط برخی از اجزا استفاده می شود تاب خوردن. آنها به ویژه برای برنامه های چند سندی، راهنمای ابزار و منوها مهم هستند. چند سند تاب خوردنبرنامه ها از یک ظرف مخصوص استفاده می کنند JDesktopPane("رومیزی") به ارث رسیده از JLayeredPane A که پنجره های Swing داخلی را نگه می دارد. مهمترین عملکردهای یک برنامه چند سندی - قرار دادن پنجره "فعال" بالاتر از سایرین، به حداقل رساندن پنجره ها، کشیدن آنها - توسط مکانیسم های پانل لایه ای ارائه می شود. مزیت اصلی استفاده از پنل لایه ای برای راهنمای ابزارها و منوها سرعت آنهاست. به جای ایجاد یک پنجره سنگین وزن جدید برای هر راهنمای ابزار یا منو، واقع در بالای مؤلفه ای که در آن راهنمای ابزار یا منو درخواست شده است، تاب خوردنیک جزء سبک وزن سریع ایجاد می کند. این کامپوننت در یک لایه به اندازه کافی بلند از پانل لایه ای بالا در پشته همه اجزای دیگر قرار می گیرد و برای نمایش یک راهنمای ابزار یا منو استفاده می شود.

پانل چند لایه به شما امکان می دهد تعداد نامحدودی از لایه ها را سازماندهی کنید. ساختار JLayeredPaneشامل چندین لایه استاندارد است که توسط تمام اجزای Swing استفاده می شود، که تضمین می کند که تمام مکانیزم های پانل لایه ای به درستی کار می کنند. لایه های استاندارد JLayeredPane در شکل زیر نشان داده شده است.

لایه Default برای میزبانی تمام اجزای عادی که به کانتینر اضافه می شوند استفاده می شود. این لایه شامل پنجره های داخلی برنامه های چند سندی است.

لایه پالت برای میزبانی ویندوز با مجموعه ای از ابزارها طراحی شده است که معمولاً با بقیه رابط همپوشانی دارند. پنل JDesktopPane به شما امکان می دهد چنین پنجره هایی را ایجاد کنید که آنها را روی این لایه قرار می دهد.

لایه Modal برای میزبانی جعبه های محاوره ای سبک وزن در نظر گرفته شده بود. با این حال، چنین جعبه های محاوره ای هنوز پیاده سازی نشده اند، بنابراین این لایه در حال حاضر در Swing استفاده نمی شود.

پرکاربردترین لایه برای منوهای بازشو و نکات ابزار.

بالاترین لایه در نظر گرفته شده برای عملیات کشیدن و رها کردن ( کشیدن و انداختن drop)، که باید به وضوح در رابط برنامه قابل مشاهده باشد.

یک مثال کوچک از یک JLayeredPane با یک پنل لایه ای نشان می دهد که چگونه می توان اجزا را به لایه های مختلف اضافه کرد و چگونه لایه ها روی هم قرار می گیرند:

واردات javax.swing.*; واردات java.awt.*; // کلاس برای ترسیم دو نوع شکل با کلاس متن شکل JComponent را گسترش می‌دهد (سریال طولانی استاتیک خصوصیVersionUID = 1L؛ رنگ رنگ خصوصی؛ نوع int خصوصی؛ متن رشته خصوصی؛ // پارامترها: رنگ و نوع شکل شکل (رنگ رنگ، بین‌المللی type, String text) ( this.color = color; this.type = type; this.text = text; setOpaque(false); ) public void paintComponent(Graphics g) ( // شکل g.setColor(color) را بکشید. سوئیچ (نوع ) ( مورد 0: g.fillOval(0, 0, 90, 90)؛ break؛ case 1: g.fillRect(0, 0, 130, 80); break; ) g.setColor(Color.yellow) ؛ g. drawString(text, 10, 35); ) ) کلاس عمومی JLayeredPaneTest JFrame را گسترش می دهد (سریال طولانی استاتیک خصوصی خصوصیVersionUID = 1L؛ عمومی JLayeredPaneTest() (// create window super("Example LayeredTest"); // خروج از پنجره بسته است setDefaultCloseOperation(EXIT_ON_CLOSE)؛ // تعریف پانل لایه ای JLayeredPane lp = getLayeredPane()؛ // ایجاد سه شکل شکل figure1 = شکل جدید(Color.red , 0, "Figure po توله سگ") Figure figure2 = new Figure(Color.blue, 0, "Figure 1"); شکل شکل3 = شکل جدید(Color.cyan, 1, "Figure 2"); // تعیین مکان شکل ها در پنجره figure1.setBounds(10, 40, 120, 120); figure2.setBounds(60, 120, 160, 180); figure3.setBounds(90, 55, 250, 180); // افزودن اشکال به لایه های مختلف lp.add(figure1, JLayeredPane.POPUP_LAYER); lp.add(figure2, JLayeredPane.PALETTE_LAYER); lp.add(figure3, JLayeredPane.PALETTE_LAYER); // تغییر موقعیت یکی از شکل ها lp.setPosition(figure3, 0); // تعیین اندازه و باز کردن پنجره setSize(280, 250); setVisible (true); ) public static void main (String args) ( JFrame.setDefaultLookAndFeelDecorated(true)؛ جدید JLayeredPaneTest(); ))

مثال یک پنجره کوچک ایجاد می کند jFrameو چندین مؤلفه Figure به پنل لایه ای اضافه می شود. برای دریافت یک پانل لایه لایه در هر ظرف Swing سطح بالا، فقط روش را فراخوانی کنید getLayeredPane().

کلاس Figure helper خصوصیات کلاس پایه JComponent را به ارث می برد و به شما اجازه می دهد دو نوع شکل (دایره و مستطیل) با رنگ های مختلف ترسیم کنید. پارامترهای ترسیم اشکال در سازنده کلاس تنظیم می شوند.

هنگام تعریف یک رابط، سه شکل با رنگ های مختلف (دو دایره و یک مستطیل) ایجاد می شود. دایره در لایه POPUP_LAYER و مستطیل ها در لایه PALETTE_LAYER قرار می گیرند. هنگام قرار دادن کامپوننت ها، مختصات صفحه نمایش مطلق آنها مشخص می شود، زیرا مدیران مکان های معمول در یک پانل لایه ای کار نمی کنند.

در پایان، موقعیت یکی از مستطیل ها به گونه ای تغییر می کند که در لایه اول باشد، اگرچه در ابتدا دومی اضافه شده بود. هنگامی که برنامه را اجرا می کنید، می بینید که پنل لایه ای کار می کند و اجزا را بر اساس لایه ها و موقعیت هایشان مرتب می کند.

در برنامه های معمولی، پنل لایه ای به ندرت به طور مستقیم استفاده می شود، که در آن عملکردهای خود را به صورت نامرئی انجام می دهد. با این حال، گاهی اوقات به ایجاد جلوه‌های شگفت‌انگیز و رابط‌های غیرمعمول کمک می‌کند، به عنوان مثال، امکان قرار دادن انیمیشن یا ویدیو بر روی اجزای معمولی بدون نیاز به تلاش‌ها و ترفندهای غیرانسانی از سوی توسعه‌دهنده را فراهم می‌کند.

ContentPane

ContentPane قسمت بعدی پنجره ریشه است و برای میزبانی اجزای رابط کاربری برنامه استفاده می شود. ContentPaneبیشتر فضای پانل لایه ای را اشغال می کند (به جز فضای اشغال شده توسط نوار منو). برای جلوگیری از پوشاندن پنل محتوا اجزایی که متعاقباً به پنجره اضافه می شوند، پانل لایه لایه آن را روی یک لایه بسیار پایین مخصوص به نام FRAME_CONTENT_LAYER با شماره -30000 قرار می دهد.

با استفاده از آن می توانید به پنل محتوا دسترسی پیدا کنید getContentPane()کلاس JFrame. با استفاده از متد add(Component Component) می توانید هر کنترلی را به آن اضافه کنید. جایگزین کردن ContentPaneهر پنل دیگری از نوع JPanel، می توانید از روش استفاده کنید setContentPane()

نمونه ای از افزودن دکمه به پنل محتوا:

JButton newButton = new JButton(); getContentPane().add(newButton);

در نتیجه، ما یک پنجره با یک دکمه دریافت می کنیم. دکمه کل منطقه موجود پنجره را اشغال می کند. این افکت در همه برنامه ها کاربردی نیست، بنابراین باید از روش های مختلفی برای چیدمان عناصر روی پنل استفاده کنید.

پنل محتوا به طور کامل قابل تعویض است. موارد زیر را در نظر بگیرید تاب خوردننمونه پنل محتوا ContentPane.

واردات javax.swing.*; کلاس عمومی ContentPaneReplace JFrame را گسترش می‌دهد (سریال طولانی استاتیک خصوصی، VersionUID = 1L؛ عمومی ContentPaneReplace() ( super("Test ContentPane"); setDefaultCloseOperation(EXIT_ON_CLOSE)؛ // ایجاد یک پانل با دو دکمه JPanel محتویات = محتوای جدید JPanel. افزودن (جدید JButton("خانواده")); contents.add(new JButton("مدرسه"))؛ // جایگزینی صفحه محتوا setContentPane(contents); // تعیین اندازه پنجره setSize(200, 100); // باز کردن پنجره setVisible (true)؛ ) public static void main(String args) (JFrame.setDefaultLookAndFeelDecorated(true)؛ ContentPaneAdd();) جدید)

مثال یک پنجره کوچک و یک پانل با دو دکمه ایجاد می کند که پس از آن است setContentPane()پنل محتوای پنجره را جایگزین می کند. بنابراین، یک جایگزین به جای یک اضافه ساده تر - فراخوانی متد add () استفاده شد. رابط پنجره در تصویر زیر نشان داده شده است.

پنل محتوا ContentPaneبه خودی خود چیز خاصی نیست فقط باید به یاد داشته باشید که اجزا به آن اضافه شده اند.

JOptionPane شفاف

پنل شفاف JOptionPaneبه عنوان پانل ریشه در بالای همه عناصر پانل لایه لایه قرار می گیرد. قرار دادن JOptionPane توسط پنجره ریشه انجام می شود، که قاب شفاف را در بالای صفحه لایه لایه قرار می دهد به طوری که به طور کامل کل منطقه پنجره، از جمله منطقه اشغال شده توسط نوار منو را پوشش می دهد.

JOptionPaneبه ندرت در برنامه ها استفاده می شود، بنابراین به طور پیش فرض پانل ریشه آن را نامرئی می کند، که بار روی سیستم ترسیم را کاهش می دهد. به خاطر داشته باشید که اگر یک پنل شفاف را قابل مشاهده کنید، باید از شفاف بودن آن اطمینان حاصل کنید (ویژگی مات آن false است)، زیرا در غیر این صورت تمام عناصر دیگر پانل ریشه را پوشش می دهد و بقیه رابط نامرئی می شود. .

در چه مواردی می توان از پنل شفاف استفاده کرد؟ JOptionPane? می توان از آن برای تعریف ویژگی های برنامه استفاده کرد که برای پیاده سازی از ابتدا به تلاش قابل توجهی نیاز دارد. پانل شفاف را می توان برای تست رابط کاربری خودکار تطبیق داد. رویدادهای ترکیب شده در آن به شما امکان می دهد تا نتایج میانی اشکال زدایی را ردیابی کنید. گاهی اوقات این روش بسیار موثرتر از تست دستی است.

پنل شفاف JOptionPaneمی توان از آن برای ساخت انیمیشن های فانتزی که در بالای همه اجزاء، از جمله نوار منو، شناور هستند، استفاده کرد، یا در صورتی که برخی از آنها قبل از ارسال به رابط کاربری اصلی نیاز به مدیریت داشته باشند، برای گرفتن رویدادها استفاده می شود.

نمونه ای از استفاده از Swing JOptionPane شفاف:

// استفاده پانل شفاف JOptionPane واردات java.awt.Dimension. واردات java.awt.Font; وارد کردن java.awt.event.WindowEvent; وارد کردن java.awt.event.WindowListener. واردات javax.swing.JDialog; واردات javax.swing.JFrame; واردات javax.swing.JLabel; واردات javax.swing.JOptionPane. واردات javax.swing.UImanager; کلاس عمومی JOptionPaneTest JFrame را گسترش می دهد (سریال طولانی استاتیک خصوصی، VersionUID = 1L؛ فونت نهایی ثابت عمومی FONT = فونت جدید ("Verdana", Font.PLAIN, 11)؛ public void istatic createGUI() ( فریم JFrame = JFrame جدید ("Test JOptionPane ")؛ frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE)؛ frame.addWindowListener(newWindowListener() ( public void windowActivated(WindowEvent) () public void windowClosed(WindowEvent event) () public void windowEventEvent)() public void windowEventEvented(() public void windowEventDeactivated) windowDeiconified(رویداد WindowEvent) () public void windowIconified(WindowEvent) () public void windowOpened(WindowEvent) () public void windowClosing(WindowEvent event) ( گزینه های شی = ( "بله"، "خیر!")؛ int rc = JOptionPane.showOptionDialog(event.getWindow()، "بستن پنجره؟"، "تأیید"، JOptionPane.YES_NO_OPTION، JOptionPane.QUESTION_MESSAGE، null، گزینه ها، گزینه ها؛ (نادرست);System.exit(0); ) ) ))؛ JLabel label = new JLabel("استفاده از پانل شفاف هنگام بستن پنجره"); frame.getContentPane().add(label); frame.setPreferredSize(new Dimension(350, 80)); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); ) public static void main(string args) (javax.swing.SwingUtilities.invokeLater(new Runnable() ( public void run() ( UIManager.put("Button.font", FONT); UIManager.put("Label.font "، FONT)؛ JFrame.setDefaultLookAndFeelDecorated(true); JDialog.setDefaultLookAndFeelDecorated(true); createGUI(); ) ))); )

اگر متد setDefaultCloseOperation یک عدد ثابت ارسال شود JFrame.EXIT_ON_CLOSE، پس از بسته شدن پنجره، برنامه از کار می افتد. در مثال، یک ثابت به این روش داده شده است JFrame.DO_NOTHING_ON_CLOSEبه طوری که با بسته شدن پنجره هیچ اتفاقی نمی افتد. خروج از برنامه در مثال از شنونده JFrame WindowListener در متد انجام می شود پنجره بسته شدن. هنگامی که پنجره بسته می شود، روش بسته شدن پنجره با یک پارامتر رویداد WindowEvent فراخوانی می شود، که در یک JOptionPane Swing شفاف یک گفتگوی تایید را باز می کند.

تصویر زیر دو پنجره برنامه را نشان می دهد. پنجره اصلی بالا با بستن این پنجره، کادر محاوره ای تایید قصد پایین باز می شود.

نوار منو JMenuBar

یکی از ویژگی های مهم استفاده از پنجره ریشه JRootPane در Swing، نیاز به قرار دادن نوار منو در پنجره است. JMenuBar. یک برنامه جدی بدون منویی برای دسترسی به عملکردهای برنامه ساخته نمی شود. کتابخانه Swing امکانات بسیار خوبی را برای ایجاد JMenuBarهای راحت که اجزای سبک وزن نیز هستند فراهم می کند.

نوار منو JMenuBarدر یک پانل لایه لایه در یک لایه خاص FRAME_CONTENT_LAYER قرار می گیرد و فضای کمی را در بالای پنجره اشغال می کند. طول نوار منو برابر با اندازه پنجره است. عرض نوار منو به اجزای موجود در آن بستگی دارد.

پانل ریشه از پنل محتوا و نوار منو مطمئن می شود JMenuBarهمپوشانی نداشتند. اگر نوار منو مورد نیاز نباشد، پانل ریشه از تمام فضا برای قرار دادن پنل محتوا استفاده می کند.

نمونه های چرخش

کدهای منبع نمونه های مورد بحث در متن صفحه قابل دانلود است.

در این مقاله کوتاه می‌خواهم روند ایجاد یک برنامه کوچک که از رابط کاربری گرافیکی در زبان پشتیبانی می‌کند، توضیح دهم جاوا. فرض بر این است که خواننده با مبانی زبان آشنا است. جاوا.

و بنابراین، به چه ابزارهایی نیاز داریم:

  • ماشین مجازی جاوا (OpenJDK یا Oracle JDK)
  • Intellij IDEA (یا IDE دیگر برای جاوا)

پس از نصب نرم افزار لازم، باز کن ایده IntelliJو یک پروژه جدید ایجاد کنید: File -> New Project…

اسم پروژه رو گذاشتم guiBase. همانطور که در تصویر می بینید، پوشه srcهیچ چیزی را شامل نمی شود، بنابراین کلاس اصلی خود را که حاوی تابع است در آن ایجاد می کنیم اصلی.

کلاس عمومی Main ( public static void main (String args) ( System.out.println ("Hello, Govzalla!"); ))

محتویات کلاس اصلی را در بالا ببینید. اکنون می توانیم یک پروژه ایجاد کنیم ( ساخت پروژه ) و آن را اجرا کنید ( اجرا کن ). پایین در ترمینال شما IDEپیامی خواهید دید سلام گوزالا!. اما همانطور که خودتان فهمیدید - از رابط کاربری گرافیکی پشتیبانی نمی کند.

در این مرحله، ما از قبل یک برنامه کاری داریم، اما بدون پشتیبانی از رابط کاربری گرافیکی. و حالا در همان پوشه srcایجاد کردن فرم رابط کاربری گرافیکی: جدید -> فرم رابط کاربری گرافیکی

فرم GUI ایجاد شده را باز کنید، روی آن کلیک کنید jPanelو شناسه آن را در فیلد قرار دهید نام زمینه، من پرسیدم پانل.

سپس روی فرم سمت راست بکشید و رها کنید JTextField, JPasswordFieldو jButton:

باقی مانده است که کد را اضافه کنیم و فرم خود را به آن پیوند دهیم. وقتی فرم را اضافه کردیم پنجره اصلی، کلاس به طور خودکار ایجاد شد پنجره اصلی، این کلاس کلاس فرم تولید شده است، i.e. این کلاس تمام رویدادهای فرم داده شده را ارائه می دهد.

اگرچه کلاس پنجره ما حاوی عناصر لازم است، حتی در حال حاضر هم ربطی به رابط کاربری گرافیکی ندارد، بنابراین اجازه دهید آن را با jFrameو تمام قابلیت های اساسی و ضروری رابط کاربری گرافیکی را به ارث می برند .

در حال حاضر فرم را داریم پنجره اصلیو کلاس پنجره اصلیتمدید شده با jFrame. اکنون باید تمام عناصر GUI اضافه شده را به عنوان محتوای کلاس تعریف کنیم پنجره اصلی this.getContentPane().add(panel); پس از آن، محتویات فایل MainWindow.java به صورت زیر تغییر می کند:

واردات javax.swing.*; کلاس عمومی MainWindow JFrame را گسترش می دهد (JTextField خصوصی textField1؛ خصوصی JPasswordField passwordField1؛ خصوصی JButton button1؛ پانل خصوصی JPanel؛ عمومی MainWindow() ( this.getContentPane().add(panel); ))

اگر سعی کنید کد را اجرا کنید، دوباره همان پیام "Hello, Govzalla!" را خواهید دید. موضوع این است که ما یک کلاس و فرم برای آن ایجاد کردیم، اما نمونه ای از این کلاس ایجاد نکردیم.

زمان آن رسیده است که فایل Main.java را تغییر داده و کد ایجاد رابط کاربری گرافیکی خود را در آنجا اضافه کنیم:

واردات java.awt.*; کلاس عمومی Main ( public static void main(string args) ( // ایجاد نمونه ای از کلاس MainWindow MainWindow mainWindow = new MainWindow(); // بسته بندی همه عناصر از فرم mainWindow.pack(); // تغییر اندازه پنجره mainWindow.setSize( new Dimension(200, 200)); // نمایش پنجره ایجاد شده mainWindow. setVisible(true); ) )

در حال اجرای کد

با کلیک بر روی دکمه متوجه می شوید که برنامه به هیچ وجه واکنشی نشان نمی دهد. مسئله این است که ما هنوز شنونده را اضافه نکرده ایم ( شنونده) برای رویدادها ( مناسبت ها) از دکمه.

شنونده رویداد ( شنونده رویداد) jButtonباید پیاده سازی آداپتور باشد ActionListener، پس کد زیر را به بدنه کلاس اضافه کنید پنجره اصلی:

کلاس خصوصی MyButtonListener ActionListener را پیاده سازی می کند ( @Override public void actionPerformed(ActionEvent actionEvent) ( ) )

روش اقدام انجام شد() همه رویدادهای دکمه 1 را مدیریت می کند، اما ابتدا باید به button1 بگویید که با چه کلاسی کار می کند، بنابراین کد زیر را به سازنده کلاس MainWindow اضافه کنید: this.button1.addActionListener(new MyButtonListener()); برای اینکه هندلر ما بی معنی نباشد کد زیر را به متد اضافه کنید اقدام انجام شد():

@Override public void actionPerformed(ActionEvent actionEvent) ( if (textField1.getText().equals(passwordField1.getText())) ( JOptionPane.showMessageDialog(null، "Success")؛ ) other ( JOptionPane.showMesnullure, "alog ")))

اکنون برنامه به رویدادها پاسخ صحیح خواهد داد، البته نه به همه رویدادها. به عنوان مثال، اگر بخواهید برنامه را با کلیک بر روی ضربدر غیرفعال کنید، پنجره ناپدید می شود، اما برنامه همچنان کار می کند، زیرا. کنترل کننده رویداد پنجره اصلی اضافه نشده است.

شرح ارائه ایجاد یک رابط گرافیکی در کتابخانه های گرافیک جاوا توسط اسلایدها

کتابخانه های گرافیکی جاوا جاوا دارای بسته های زیر برای ایجاد رابط های گرافیکی است: جعبه ابزار انتزاعی ویندوز (AWT) - همراه با JDK، هر جزء AWT دارای مولفه بصری (همتا) خود برای یک سیستم عامل خاص است، قابلیت حمل توسط بسته جاوا ارائه می شود. awt همتا؛ مجموعه اجزای گرافیکی محدود است. ظاهر بستگی به سیستم عامل دارد. جعبه ابزار ویجت استاندارد (SWT) - به طور جداگانه برای سیستم عامل خاص ارائه شده است، که در محیط Eclipce گنجانده شده است، با سیستم عامل با استفاده از رابط های همتا تعامل می کند، بر خلاف AWT، دامنه مولفه ها افزایش یافته است. Swing - با JDK ارائه می شود، کلاس های AWT را گسترش می دهد، به اجزای همتای سیستم عامل وابسته نیست. Java 3 D - گرافیک سه بعدی.

اجزای سنگین و سبک اجزای سنگین وزن – ارائه شده توسط سیستم عامل – اکثر اجزای AWT اجزای سبک وزن (سبک وزن) – ارائه شده توسط کد جاوا – همه اجزای Swing به جز پنجره های سطح بالا (پنجره برنامه) اجزای سنگین وزن همیشه در بالای موارد سبک کشیده می شوند.

معماری Model-View-Controller (MVC) الگوی طراحی MVC داده های برنامه، رابط کاربری و منطق کنترل را به سه جزء مجزا-مدل، نما و کنترلر- جدا می کند تا هر جزء را بتوان به طور مستقل تغییر داد. مدل (مدل) داده های کامپوننت را ذخیره می کند و تغییر یا دریافت این داده ها را بدون مراجعه به خود مؤلفه آسان می کند. View (نما) داده ها را برای ارائه به کاربر روی صفحه نمایش می دهد. کنترلر تعیین می کند که نمای و داده های مدل چگونه باید در پاسخ به اقدامات کاربر واکنش نشان دهند.

مزایای MVC شما می توانید چندین نما را به یک مدل متصل کنید بدون اینکه بر اجرای مدل تأثیر بگذارد. به عنوان مثال، برخی از داده ها ممکن است در یک صفحه گسترده، یک نمودار میله ای و یک نمودار دایره ای به طور همزمان ارائه شوند. بدون تأثیر بر اجرای نماها، می توانید واکنش ها را به اقدامات کاربر تغییر دهید (کلیک کردن روی یک دکمه، وارد کردن داده)، برای این کار کافی است از یک کنترلر دیگر استفاده کنید. تعدادی از توسعه دهندگان تنها در یکی از زمینه ها تخصص دارند: یا توسعه یک رابط گرافیکی یا توسعه منطق تجاری. بنابراین، می توان اطمینان حاصل کرد که برنامه نویسانی که در توسعه منطق تجاری (مدل) دخیل هستند، اصلاً از کدام نمایندگی استفاده نمی کنند.

تعامل بین مدل، نمای و کنترلر مدل کلاسیک رابطه نزدیک بین کنترلر و مدل و کنترلر و نمای. یک View (نما) با یک Controller و هر Controller با یک View مرتبط است. View و Controller یک پیوند مستقیم به مدل دارند.

نمونه MVC کلاس عمومی Model ( int int. آرایه = (1، 2، 3، 4، 5)؛ رشته عمومی دریافت. String. Array() ( return "int. Array=" + Arrays. to. String(int. آرایه)؛ ) public void set.Int.Array(int index, int value) (this.int.Array = value; ) ) public class Controller ( Model model = new Model(); مشاهده نمای= newView(); Controller()( update. View(); ) void set. آرایه. مقدار (شاخص int، مقدار int) (مدل. مجموعه. آرایه داخلی (شاخص، مقدار)؛ به روز رسانی. View(); ) به روز رسانی خالی. View() ( view. show. Array(model. get. String. Array()); ) ) class public View ( public void show. Array(String array. String)( System. out. println("View"); System.out.println(array.String); System.out.println(); ) ) class public User (statc public void main(string args) ( controller controller = new controller(); controller.set.Array.Value( چهارده)؛ ) )

مدل Swing پیاده‌سازی را ساده می‌کند. مدل نمی‌داند با کدام نماینده UI همکاری می‌کند یا از کدام مؤلفه استفاده می‌کند، ظاهر و احساس را برای همه مؤلفه‌های کتابخانه تنظیم می‌کند که فقط از طریق کلاس مؤلفه با مدل ارتباط برقرار می‌کند. نمای کنترلر رویدادهای کاربر را مدیریت می کند و جزء را روی صفحه نمایش می کشد دکمه ها، لیست ها، جداول، فیلدهای متنی...

دکمه اجزای رابط - دکمه؛ JCheck. جعبه - چک باکس؛ jCombo. جعبه - لیست کشویی؛ JLabel - برچسب، کتیبه؛ jList - list; JPassword. فیلد - فیلد متنی برای ورودی مخفی. JProgress. نوار - مؤلفه ای برای نمایش یک عدد در یک محدوده خاص. JRadio. دکمه - سوئیچ ها، دکمه های رادیویی، معمولاً با مولفه Button استفاده می شود. گروه; JSlider - مؤلفه ای که به شما امکان می دهد مقداری را از یک محدوده مشخص انتخاب کنید. JTable - جدول; jtext فیلد یک فیلد متنی تک خطی است. jtext Area یک فیلد متنی چند خطی است. JTree یک درخت است.

کانتینرهای رابط بخش‌هایی از رابط کاربری حاوی اجزای دیگر ظروف سطح بالا: فریم، JFrame - پنجره برنامه. JDialog - محاوره برنامه. jcolor انتخابگر - گفتگوی انتخاب رنگ. jfile. Chooser - محاوره ای برای انتخاب فایل ها و دایرکتوری ها. فایل. گفتگو - گفتگو برای انتخاب فایل ها و دایرکتوری ها (جزء awt). ظروف ساده: JPanel - یک پانل ساده برای گروه بندی عناصر، از جمله پانل های تو در تو. jTool. نوار - نوار ابزار (معمولا دکمه ها)؛ JScroll. صفحه - یک نوار پیمایش که به شما امکان می دهد محتویات یک عنصر فرزند را پیمایش کنید. JDesktop. پانل - محفظه ای برای ایجاد دسکتاپ مجازی یا برنامه های کاربردی مبتنی بر MDI (واسط چند سند). JEditor. پانل، JText. پانل - ظروف برای نمایش یک سند پیچیده به صورت HTML یا RTF. JTabed. پانل - محفظه ای برای مدیریت نشانک ها؛

ایجاد جاوا واردات پنجره. awt *؛ کلاس هم ساده. فریم Frame را گسترش می‌دهد(statc public void main(string args)( Frame fr = new Too. Simple. Frame(); fr. set. Size(400, 150); // اندازه پنجره fr. set. Visible(true); / /رندر پنجره) // دکمه بستن کار نمی کند) Swing

پنجره با آیکون سفارشی واردات جاواکس. تاب خوردن. *؛ قاب کلاس عمومی بستن، JFrame را گسترش می‌دهد (قاب عمومی. بستن() ( super("عنوان پنجره"); // عملیات هنگام بستن مجموعه پنجره. پیش‌فرض. بستن. Operaton(EXIT_ON_CLOSE); // هنگام بستن پنجره، از نماد // برای مجموعه پنجره. Icon.Image(get. Toolkit(). get. Image("icon. gif")); // C: / icons / icon. png // نمایشگر مجموعه. Size(300, 100); // پنجره اندازه عرض و ارتفاع تنظیم شده است. Visible(true); // render window ) public stac void main(string args) ( new Frame.Closing(); ) ) Swing

جعبه‌های گفتگوی استاندارد نوع جعبه گفتگو شرح NFORMATION_MESSAGE جعبه محاوره‌ای اطلاعات هدف عمومی را با نماد نوع مناسب نمایش می‌دهد. که کادر محاوره ای به هیچ یک از انواع بالا تعلق ندارد. بدون نماد استاندارد روی صفحه نمایش داده می شود. جعبه‌های گفتگو می‌توانند مودال یا بدون حالت باشند جعبه‌های گفتگو می‌توانند مودال (تمرکز روی پنجره تا فشار دادن دکمه) یا بدون حالت باشند.

ورودی و پیام ویندوز جاوا را وارد می کند. awt *؛ واردات جاواکس تاب خوردن. *؛ کلاس عمومی Soluton ( public static void main (string args) ( JOpton. Pane. show. Message. Dialog (null , "Hello, World"); String s = JOpton. Pane. show. Input. Dialog ("نام خود را وارد کنید" )؛ ) ) تاب خوردن

چیدمان استاندارد جاوا 1. طرح بندی حاشیه. چیدمان (قرارگیری قطبی). 2. Flow Composer. چیدمان (قرار دادن متوالی). 3. پیوند دهنده. توری. چیدمان (طرح جدول). 4. پیوند دهنده بهار. چیدمان (قرارگیری نسبی). 5. پیوند دهنده جعبه. چیدمان (قرار دادن بلوک).

طرح بندی قطبی (طرح حاشیه. طرح بندی) Border.Lyout مقدار. چیدمان. NORTH یا رشته "شمال" - جزء در امتداد مرز بالایی (شمالی) پنجره قرار دارد و به کل عرض آن کشیده می شود. این معمولاً جایی است که نوار ابزار قرار دارد. ارزش مرزی چیدمان. SOUTH یا رشته "South" - جزء در امتداد مرز پایین (جنوبی) قرار دارد و تا تمام عرض پنجره کشیده می شود. این موقعیت برای نوار وضعیت ایده آل است. ارزش مرزی چیدمان. WEST یا رشته "غرب" - جزء در امتداد مرز چپ (غربی) پنجره قرار دارد و تا کل ارتفاع آن امتداد دارد، با این حال، اندازه های اجزای شمالی و جنوبی در نظر گرفته می شود (اولویت دارند). ارزش مرزی چیدمان. EAST یا رشته "East" - جزء در امتداد مرز سمت راست (شرق) پنجره قرار دارد. در غیر این صورت محل آن شبیه مولفه غربی است. ارزش مرزی چیدمان. CENTER یا خط "Center" - جزء در مرکز پنجره قرار می گیرد و حداکثر فضای ممکن را اشغال می کند.

نمونه ای از استفاده از طرح بندی Border. طرح بندی واردات جاواکس. تاب خوردن. *؛ واردات جاوا awt *؛ مرز کلاس عمومی چیدمان. نمونه JFrame را گسترش می‌دهد (حاشیه عمومی. طرح‌بندی. Sample() (super("Border. Layout. Sample"); set. Size(400, 300); set. default. Close. Operaton(EXIT_ON_CLOSE); // دریافت محتوای کلاس JFrame Container c = get.Content.Pane(); // به طور پیش‌فرض، Swing از مدیر Border.Layout استفاده می‌کند // با استفاده از ثابت‌های رشته‌ای c.add(new JButton("North")، "North") اجزا را به پنل اضافه می‌کند. ؛ c. add(new JButton("South")، "South"); // یا ثابت های کلاس Border. Layout // عنصر JLabel برای نمایش متن c. add(new JLabel("West")، Border. Layout. WEST)؛ c. add(new JLabel("East")، Border. Layout. EAST)؛ // اگر پارامتر اصلاً مشخص نشده باشد، جزء به طور خودکار به مرکز اضافه می شود. c. add(new JButton(" مرکز"))؛ // نمایش پنجره به روی صفحه نمایش set.Visible(true); ) public stac void main(string args) ( new Border.Layout.Sample(); ) ) Swing

قرارگیری متوالی (جریان. طرح‌بندی چیدمان) طرح‌بندی اجزا را از چپ به راست، از بالا به پایین (پیش‌فرض در Jpanels) تنظیم می‌کند. واردات جاواکس تاب خوردن. *؛ واردات جاوا awt *؛ جریان کلاس عمومی چیدمان. Sample JFrame را گسترش می‌دهد (جریان عمومی. طرح‌بندی. نمونه c = get.Content.Pane(); // کامپوننت ها را به صورت متوالی و تراز وسط قرار دهید c.set.Layout(new Flow.Layout(Flow.Layout.CENTER)); // کامپوننت ها را اضافه کنید c.add(new JButton ("یک"))؛ c. add(new JButton("دو"))؛ c. add(new JButton("Three"))؛ // نمایش مجموعه پنجره. Visible(true)؛ ) public stac void main( string args) ( new Flow.Layout.Sample(); ) ) import java. awt *؛ واردات جاواکس تاب خوردن. *؛ کلاس عمومی Soluton ( public static void main (string args) ( JOpton. Pane. show. Message. Dialog (null , "Hello, World"); ) ) Swing

طرح جدول (Grid. Layout layout) همه اجزا دارای اندازه یکسانی هستند. فضای موجود به همان تعداد سلول تقسیم می شود که در هر کدام از آنها جزء قرار می گیرد. همه اجزاء همیشه به سمت صفحه نمایش کشیده می شوند، صرف نظر از اینکه فضای موجود چقدر بزرگ یا کوچک است. واردات جاوا awt *؛ واردات جاواکس تاب خوردن. *؛ واردات جاوا utl. *؛ گرید کلاس. تست JFrame را گسترش می دهد ( Grid. Test(String s)( super(s)؛ Container c = get. Content. Pane(); // 4 ردیف 4 ستون فاصله بین سطرها و ستون ها در پیکسل c. Layout (new Grid. Layout(4, 4, 5, 5)); String. Tokenizer st = new String. Tokenizer("7 8 9 / 4 5 6 * 1 2 3 - 0. = +"); while(st. has. More. Tokens()) c. add(new Button(st. next. Token()))؛ set. Size(200, 200)؛ set. Visible (true)؛ ) public stac void main(string args)( new Grid. تست ("مدیر شبکه. طرح بندی")؛ ) ) نوسان

طرح بندی جدولی به دکمه ها اندازه یکسانی می دهد، در حالی که چیدمان متوالی از تار شدن آنها جلوگیری می کند و در همان زمان آنها را با لبه سمت راست I mport java تراز می کند. awt *؛ واردات جاواکس تاب خوردن. *؛ فرماندهی کلاس عمومی Buttons JFrame را گسترش می دهد (دستور عمومی. Buttons() ( super("Command. Buttons"); set. Size(350, 250); set. Locaton(150, 100); set. Default. Close. Operaton(EXIT_ON_CLOSE); / / ایجاد یک پانل با طرح جدول برای تراز کردن اندازه دکمه JPanel grid = new JPanel(new Grid. Layout(1, 2, 5, 0))؛ // 1 ردیف، 2 ستون، 5 پیکسل به صورت افقی، 0 به صورت عمودی. // افزودن کامپوننت grid. add(new JButton("OK")); grid. add(new JButton("Cancel")); // نتیجه را در یک پانل متوالی راست چین قرار دهید JPanel flow = new JPanel( new Flow.Layout (جریان. چیدمان. RIGHT))؛ جریان. add(grid)؛ // دریافت صفحه محتوا Container c = get. Content. Pane(); // ردیف دکمه ها را در پایین پنجره قرار دهید c. add( flow, Border .Layout.SOUTH؛ // نمایش پنجره مجموعه. Visible(true) ) public void main(string args) ( new Command.Buttons(); ) ) Swing

طرح بندی جعبه (Box. Layout layout) مدیر طرح بندی جعبه اجزا را در یک ظرف در بلوک ها قرار می دهد: یک ستون (در امتداد محور Y) یا یک نوار (در امتداد محور X)، در حالی که هر جزء جداگانه می تواند در مرکز تراز شود. چپ یا راست، و همچنین در بالا یا پایین.

بلاک قرار دادن نمونه واردات جاوا. awt *؛ واردات جاواکس تاب خوردن. *؛ کلاس عمومی جعبه 1 JFrame را گسترش می دهد ( جعبه عمومی 1() ( super("Box 1 - Y"); set. Size(400, 200); set. default. Close. Operaton(EXIT_ON_CLOSE); // دریافت پانل محتوا Container c = get.Content.Pane(); // تنظیم y-box layout Box.Layout boxy = new Box.Layout(c, Box.Layout.Y_AXIS)؛ c.set.Layout(boxy)؛ // افزودن مؤلفه های c افزودن(جدید JButton("یک"))؛ ج. افزودن(JButton جدید("دو"))؛ ج. افزودن(JButton جدید("سه"))؛ // نمایش مجموعه پنجره. قابل مشاهده (درست)؛ ) کلاس statc Box 2 JFrame را گسترش می دهد ( public Box 2() ( super("Box 2 - X"); // اندازه و موقعیت مجموعه جعبه را تنظیم کنید. Size(400, 200); set. Locaton(100, 100 )؛ set.Default.Close.Operaton(EXIT_ON_CLOSE)؛ // دریافت پنل محتوا Container c = get.Content.Pane()؛ //تنظیم کادر x موقعیت (نوار) ​​Box.Layout boxx = New Box.Layout (c , Box. Layout. X_AXIS؛ c. set. Layout(boxx); // add components c. add(new JButton("One"))؛ c. add(new JButton("Two")); c .add (JButton جدید ("سه"))؛ // پنجره را روی مجموعه صفحه نمایش می دهد. قابل مشاهده (درست)؛ ) ) public stac void main(string args) ( new box 1(; new box 2(); ) ) Swing 5 این مثال دو پنجره ایجاد می کند. یکی از آنها طرح بلوک را در امتداد محور Y پیاده سازی می کند، دیگری - طرح بندی بلوک را در امتداد محور X.

داویدوف آنتون والریویچ
دانشجوی TSU، روسیه، تولیاتی
مشاور علمی: Erofeeva E.A.

رابط کاربری در جاوا مسیر بسیار پر پیچ و خم شکل گیری و توسعه را طی کرده است. مدتهاست که متهم به حریص بودن برای منابع سیستم، عملکرد کند و عملکرد محدود شده است. ظهور دات نت با اجزای گرافیکی سریعتر موقعیت جاوا را بیشتر متزلزل کرده است. اما چنین رقابتی فقط تحریک شد توسعه دهندگان جاواتوسعه و بهبود کتابخانه های گرافیکی. و در این مقاله خواهیم دید که چه چیزی از آن حاصل شد.

جعبه ابزار پنجره چکیده

جعبه ابزار پنجره انتزاعی (به اختصار AWT) اولین بار در سال 1995 توسط Sun Microsystems منتشر شد. این اولین تلاش برای ایجاد رابط کاربری گرافیکی برای جاوا بود. AWT به عنوان لایه ای عمل می کند که متدهایی را از کتابخانه های نوشته شده به زبان C فرا می خواند. و این روش ها به نوبه خود از اجزای گرافیکی سیستم عامل استفاده می کردند. از یک طرف، برنامه ای که به این روش ساخته شده است، از نظر ظاهری شبیه به سایر برنامه های موجود در سیستم عامل مورد استفاده است، اما از طرف دیگر، یک برنامه مشابه می تواند در سیستم عامل های مختلف کاملاً متفاوت به نظر برسد، که توسعه را پیچیده می کند. علاوه بر این، به خاطر چند پلتفرم، لازم بود رابط های تماس کامپوننت ها یکپارچه شوند، که منجر به عملکرد تا حدودی کوتاه شد. مجموعه اجزاء نیز بسیار کم است. به عنوان مثال، هیچ جدولی وجود ندارد و نمادها را نمی توان در دکمه ها قرار داد. AWT سعی می کند به طور خودکار منابع استفاده شده را آزاد کند. این بر عملکرد تأثیر می گذارد و معماری را پیچیده می کند. یادگیری AWT آسان است، اما نوشتن چیزی پیچیده دشوار است. اکنون AWT عمدتاً برای اپلت ها استفاده می شود. اوراکل در حال حاضر توسعه‌دهندگان را تشویق می‌کند تا به Swing روی بیاورند زیرا ایمن‌تر است.

شکل 1 - یک نمونه برنامه نوشته شده با استفاده از AWT در محیط ویندوز

پس از AWT، در سال 1998، Sun Swing را منتشر کرد. این به طور کامل در جاوا نوشته شده است و از 2D برای رندر استفاده می کند. Swing نسبت به AWT دارای تنوع بسیار بیشتری از قطعات است. خود مؤلفه ها با به ارث بردن از موجود بسیار آسان تر شده اند. قابلیت استفاده از سبک ها و پوسته های مختلف نیز معرفی شد. با این حال، سرعت نسخه های اولیه Swing نسبتاً آهسته بود و اشتباهات در نوشتن یک برنامه حتی می تواند منجر به مسدود شدن سیستم عامل شود.

با این حال، به دلیل سهولت یادگیری و در دسترس بودن حجم زیادی از اسناد، Swing به محبوب ترین رابط کاربری گرافیکی در جاوا تبدیل شده است. بر اساس آن، افزونه‌های زیادی مانند SwingX و JGoodies ظاهر شده‌اند که ساخت برنامه‌های بصری پیچیده را آسان‌تر می‌کنند. تمام محیط های برنامه نویسی جاوا مدرن شامل ویرایشگر گرافیکیتاب خوردن. حتی اگر چارچوب های مدرن تری در حال حاضر وجود داشته باشد، Swing همچنان محبوب ترین است.


شکل 2 - نمونه برنامه نوشته شده با استفاده از Swing

ابزار استاندارد ویجت

SWT توسط IBM در زمانی منتشر شد که Swing هنوز کند بود و عمدتاً برای ترویج محیط برنامه نویسی Eclipse بود. مانند AWT، SWT از اجزای سیستم عامل استفاده می کند، اما رابط های تعاملی متفاوتی برای پلتفرم های مختلف استفاده می شود. بنابراین، یک کتابخانه JAR جداگانه باید برای هر سیستم عامل ارسال شود. این به شما امکان می دهد تا به طور کامل از عملکردهای مربوط به سیستم عامل های مختلف استفاده کنید. و اجزای گمشده با استفاده از دو بعدی پیاده سازی شدند. با این حال، تسلط بر SWT دشوارتر از Swing بود. علاوه بر این، برنامه نویس باید خودش آزادسازی منابع توسط اپلیکیشن را پیاده سازی کند.

شکل 3 - نمونه برنامه نوشته شده با استفاده از Swing

JavaFX در سال 2008 توسط Oracle منتشر شد. این به عنوان یک پلت فرم برای ایجاد یک برنامه اینترنتی غنی قرار گرفته است. برای رندرینگ از یک خط لوله گرافیکی استفاده می شود که به میزان قابل توجهی سرعت برنامه را افزایش می دهد. مجموعه بزرگی از اجزای داخلی وجود دارد. همچنین اجزای جداگانه ای برای رسم نمودارها وجود دارد. پشتیبانی از محتوای چند رسانه ای، انیمیشن و حتی چند لمسی. ظاهر کامپوننت ها با استفاده از سبک های CSS پیکربندی می شود. علاوه بر این، مجموعه ابزارهای JavaFX شامل توانایی ایجاد یک نصب کننده بومی برای محبوب ترین سیستم عامل ها است: exe یا msi برای ویندوز، deb یا rpm برای لینوکس، dmg برای مک. وب سایت اوراکل دارای مستندات دقیق و تعداد زیادی نمونه آماده است.

بنابراین، با شرح ویژگی‌های اصلی و معایب رابط‌های کاربری گرافیکی فوق، می‌توانیم تصمیم بگیریم که برای کدام وظایف مناسب‌تر هستند. Abstract Window Toolkit برای ایجاد اپلت مناسب تر است. یک مبتدی می تواند Swing را با توجه به این واقعیت توصیه کند که می توانید اسناد زیادی را برای آن در اینترنت پیدا کنید، از جمله به زبان روسی. JavaFX برای ساختن برنامه های کاربردی اینترنتی غنی عالی است.

فهرست منابع استفاده شده

    Ryzhenko A. V. برنامه نویسی شی گرا: مجموعه آموزشی و روش شناختی برای رشته تخصصی 010501 - "ریاضیات کاربردی و انفورماتیک". – 2007.

    Khabibullin I. Sh. Java 7 (ویرایش چهارم). - BHV-Petersburg، 2012.

    Clarke J., Connors J., Bruno E. J. JavaFX: Developing Rich Internet Applications. – آموزش پیرسون، 2009.

    Northover S., Wilson M. Swt: the standard widget toolkit, volume 1. - Addison Wesley Professional، 2004.

رابط کاربری در جاوا مسیر بسیار پر پیچ و خم شکل گیری و توسعه را طی کرده است. برای مدت طولانیاو متهم به کار کند، طمع برای منابع سیستم، عملکرد محدود بود. ظهور دات نت با اجزای گرافیکی سریعتر موقعیت جاوا را بیشتر متزلزل کرده است. اما هر ابری یک پوشش نقره ای دارد - همه این حرکت ها فقط توسعه دهندگان جاوا را به توسعه و بهبود کتابخانه های گرافیکی تشویق کرد. بیایید ببینیم چه نتیجه ای از آن حاصل شد.

جعبه ابزار پنجره چکیده

AWT اولین تلاش Sun برای ایجاد رابط کاربری گرافیکی برای جاوا بود. آنها مسیر آسان را در پیش گرفتند و به سادگی یک لایه جاوا ساختند که متدها را از کتابخانه های نوشته شده به زبان C فرا می خواند. از یک طرف، این خوب است، زیرا یک برنامه جاوا مشابه سایر برنامه های این سیستم عامل است. اما از سوی دیگر، هیچ تضمینی وجود ندارد که تفاوت در اندازه و فونت کامپوننت، ظاهر برنامه را هنگامی که روی پلتفرم دیگری اجرا می‌شود، خراب نکند. علاوه بر این، برای اطمینان از چند پلتفرم، لازم بود رابط های تماس اجزاء یکپارچه شوند، به همین دلیل است که عملکرد آنها کمی کوتاه شده است. و مجموعه اجزاء بسیار کوچک بود. برای مثال، AWT جداول ندارد و دکمه‌ها از نمایش نمادها پشتیبانی نمی‌کنند.

منابع استفاده شده AWT سعی می کند به طور خودکار آزاد شود. این کمی معماری را پیچیده می کند و بر عملکرد تأثیر می گذارد. یادگیری AWT بسیار آسان است، اما نوشتن چیزی پیچیده می تواند کمی مشکل باشد. اکنون فقط برای اپلت ها استفاده می شود.

مزایای:

  • بخشی از JDK؛
  • سرعت کار؛
  • اجزای گرافیکی مشابه موارد استاندارد هستند.

ایرادات:

  • استفاده از اجزای بومی محدودیت هایی را در استفاده از ویژگی های آنها اعمال می کند. برخی از مؤلفه‌ها ممکن است اصلاً روی پلتفرم‌های «غیر بومی» کار نکنند.
  • برخی از ویژگی ها، مانند نمادها و راهنمای ابزار، به هیچ وجه در AWT وجود ندارند.
  • اجزای استاندارد AWT بسیار کمی وجود دارد، برنامه نویس باید بسیاری از موارد سفارشی را پیاده سازی کند.
  • برنامه متفاوت به نظر می رسد پلتفرم های مختلف(ممکن است کج باشد).

نتیجه:

در حال حاضر، AWT بسیار به ندرت استفاده می شود - عمدتاً در پروژه ها و اپلت های قدیمی. Oracle آموزش ها را پنهان کرده و انتقال به Swing را به شدت تشویق می کند. این قابل درک است، دسترسی مستقیم به اجزای محور می تواند یک حفره امنیتی جدی باشد.

تاب خوردن


به دنبال AWT، Sun مجموعه ای از اجزای گرافیکی به نام Swing را توسعه داد. اجزای Swing به طور کامل در جاوا نوشته شده اند. 2D برای رندر استفاده می شود که چندین مزیت را به همراه دارد. مجموعه قطعات استاندارد از نظر تنوع و عملکرد بسیار فراتر از AWT است. ایجاد اجزای جدید، به ارث بردن از اجزای موجود و ترسیم هر آنچه دلتان می خواهد، آسان شده است. پشتیبانی از سبک ها و پوسته های مختلف امکان پذیر شده است. با این حال، سرعت نسخه‌های اول Swing چیزهای زیادی را باقی گذاشت. یک برنامه اشتباه نوشته شده حتی می تواند ویندوز را محکم آویزان کند.

با این وجود، به دلیل سهولت استفاده، اسناد غنی و اجزای انعطاف پذیر، Swing شاید به محبوب ترین چارچوب گرافیکی در جاوا تبدیل شده است. افزونه های زیادی بر اساس آن ظاهر شده اند، مانند SwingX، JGoodies، که ایجاد رابط های کاربری پیچیده را بسیار ساده می کند. تقریباً تمام محیط های برنامه نویسی محبوب جاوا شامل ویرایشگرهای گرافیکی برای فرم های Swing هستند. بنابراین، درک و شروع استفاده از Swing دشوار نخواهد بود.

مزایای:

  • بخشی از JDK، بدون نیاز به نصب کتابخانه های اضافی.
  • کتاب‌ها و پاسخ‌های انجمن زیادی در Swing وجود دارد. همه مشکلات، به ویژه برای مبتدیان، به طور کامل برای گوگل شناخته شده است.
  • ویرایشگر فرم داخلی تقریباً در تمام محیط های توسعه.
  • افزونه های زیادی بر اساس نوسان مانند SwingX وجود دارد.
  • پشتیبانی از سبک های مختلف (نگاه و احساس).

ایرادات:

  • یک پنجره با اجزای زیادی شروع به کند شدن می کند.
  • کار با مدیران layout می تواند یک کابوس واقعی در رابط های پیچیده باشد.

نتیجه:

سوئینگ زندگی کرده است، سوینگ زنده است، سوئینگ زندگی خواهد کرد. اگرچه اوراکل در تلاش برای ترویج JavaFX است، Swing امروزه محبوب ترین چارچوب جاوا UI باقی مانده است.

ابزار استاندارد ویجت


چگونه
به نظر می رسد
SWT

SWT در روزهایی که Swing هنوز کند بود در IBM توسعه یافت و عمدتاً برای ترویج محیط برنامه نویسی Eclipse انجام شد. SWT مانند AWT از اجزای سیستم عامل استفاده می کند، اما رابط های تعاملی خاص خود را برای هر پلتفرم دارد. بنابراین برای هر کدام سیستم جدیدشما باید یک کتابخانه JAR جداگانه با نسخه SWT مناسب ارسال کنید. این امکان استفاده کامل تری از ویژگی های موجود اجزا در هر محور را فراهم کرد. ویژگی‌ها و مؤلفه‌های گمشده با استفاده از دوبعدی، مانند Swing، پیاده‌سازی شدند. SWT طرفداران زیادی دارد، اما، با صداقت، نمی توان قبول کرد که همه چیز آنطور که ما می خواهیم ساده نیست. یک مبتدی باید زمان بیشتری را صرف یادگیری SWT کند تا اینکه با همان Swing آشنا شود. علاوه بر این، SWT وظیفه انتشار منابع را بر عهده برنامه نویس می گذارد و بنابراین او باید هنگام نوشتن کد دقت ویژه ای داشته باشد تا یک استثنا تصادفی منجر به نشت حافظه نشود.

مزایای:

  • از اجزای سیستم عامل استفاده می کند - سرعت بالاتر است.
  • Eclipse فراهم می کند ویرایشگر بصریتشکیل می دهد؛
  • مستندات گسترده و مثال های فراوان؛
  • امکان استفاده از قطعات AWT و Swing وجود دارد.

ایرادات:

  • برای هر پلت فرم لازم است یک کتابخانه جداگانه تهیه شود.
  • شما باید به طور مداوم بر استفاده از منابع نظارت داشته باشید و آنها را به موقع آزاد کنید.
  • معماری پیچیده، برانگیختن افکار خودکشی پس از تلاش های بیهوده برای پیاده سازی یک رابط سفارشی.

نتیجه:

می توان دید که IBM تلاش کرده است. ولی خیلی آماتوری معلوم شد...

JavaFX


JavaFX را می توان بدون اغراق یک پیشرفت نامید. برای رندرینگ از یک خط لوله گرافیکی استفاده می شود که به میزان قابل توجهی سرعت برنامه را افزایش می دهد. مجموعه اجزای داخلی گسترده است، حتی اجزای جداگانه ای برای رسم نمودار وجود دارد. پشتیبانی از محتوای چند رسانه ای، بسیاری از جلوه های نمایشی، انیمیشن ها و حتی چند لمسی. با استفاده از استایل های CSS می توان به راحتی ظاهر تمامی اجزا را تغییر داد. و بهترین چیز این است که JavaFX شامل مجموعه ای از ابزارها است که به شما امکان می دهد یک نصب کننده بومی برای محبوب ترین سیستم عامل ها ایجاد کنید: exe یا msi برای ویندوز، deb یا rpm برای لینوکس، dmg برای مک. در وب سایت اوراکل، می توانید مستندات دقیق و تعداد زیادی نمونه آماده را بیابید. این امر برنامه نویسی با JavaFX را آسان و لذت بخش می کند.

مزایای:

  • کار سریع به دلیل خط لوله گرافیکی؛
  • بسیاری از اجزای مختلف؛
  • پشتیبانی از سبک؛
  • ابزارهای کمکی برای ایجاد یک نصب کننده برنامه؛
  • برنامه را می توان به عنوان دسکتاپ و در مرورگر به عنوان بخشی از صفحه راه اندازی کرد.

ایرادات:

  • چارچوب هنوز در حال توسعه است، بنابراین خرابی ها و برخی اشکالات اتفاق می افتد.
  • JavaFX هنوز به طور گسترده مورد استفاده قرار نگرفته است.

نتیجه:

کار خوب، اوراکل. چارچوب تنها تأثیرات مثبتی را به جا می گذارد. درک آن آسان است، روش ها و رابط ها منطقی به نظر می رسند. من می خواهم دوباره و دوباره استفاده کنم!

کتابخانه های تصویری در عمل

SWT: ویجت آب و هوا

برای نشان دادن قابلیت های محبوب ترین کتابخانه های گرافیکی و اصول اولیه کار با آنها، چندین ویجت کوچک می سازیم که اطلاعات مختلفی را نمایش می دهند.

و بیایید شروع کنیم، شاید، با محبوب ترین ویجت - نمایش آب و هوای فعلی، که برای اجرای آن SWT را انتخاب می کنیم.

هر برنامه SWT با ایجاد یک شیء Display شروع می شود. این به عنوان نوعی زمینه برنامه عمل می کند که شامل روش های لازم برای دسترسی به منابع سیستم است و یک حلقه رویداد را فراهم می کند. گام بعدی ایجاد شیء به همان اندازه مهم Shell است. Shell یک پنجره معمولی سیستم عامل است. نمایش برای ایجاد یک پنجره سطح بالا به سازنده پوسته داده می شود.

Display display = new Display(); shell = new Shell(display, SWT.NO_TRIM);

از آنجایی که ما در حال ایجاد یک ویجت هستیم، نیازی به نمایش قاب پنجره استاندارد و دکمه های کنترلی نداریم، برای این کار ما پرچم NO_TRIM را مشخص کرده ایم. برای پس زمینه، ما از یک تصویر استفاده خواهیم کرد - یک مستطیل با گوشه های گرد. در اصل، یک پنجره SWT می تواند هر شکلی به خود بگیرد. برای رسیدن به این اثر از کلاس Region استفاده می کنیم. تنها چیزی که لازم است این است که تمام نقاط قابل مشاهده از تصویر پس زمینه را با صرف نظر از موارد شفاف به این کلاس اضافه کنید.

آپلود تصویر:

تصویر تصویر = تصویر جدید (نمایش، "images/bg.png#26759185");

در تصاویر با فرمت های مختلف، شفافیت به روش های مختلف تنظیم می شود، بنابراین اطلاعات مربوط به مناطق شفاف نیز به یک شکل بازیابی نمی شود. یک ناحیه پس زمینه ایجاد کنید و تمام نقاط قابل مشاهده را در آنجا اضافه کنید:

Region region = new Region(); ImageData imageData = image.getImageData(); if (imageData.alphaData != null) ( Rectangle pixel = new Rectangle(0, 0, 1, 1); for (int y = 0; y< imageData.height; y++) { for (int x = 0; x < imageData.width; x++) { if (imageData.getAlpha(x, y) == 255) { pixel.x = imageData.x + x; pixel.y = imageData.y + y; region.add(pixel); } } } } else { ImageData mask = imageData.getTransparencyMask(); Rectangle pixel = new Rectangle(0, 0, 1, 1); for (int y = 0; y < mask.height; y++) { for (int x = 0; x < mask.width; x++) { if (mask.getPixel(x, y) != 0) { pixel.x = imageData.x + x; pixel.y = imageData.y + y; region.add(pixel); } } } }

تنظیم شکل پنجره:

Shell.setRegion(region);

اکنون باید یک رویداد شنونده برای پنجره ایجاد کنیم. ما به رویدادهای طراحی پنجره، رویدادهای ماوس و فشار دادن کلیدها علاقه مند خواهیم بود تا بتوان پنجره را در اطراف صفحه حرکت داد.

شنونده شنونده = New Listener() ( int startX, startY; public void handleEvent(Event e) ( if (e.type == SWT.KeyDown && e.character == SWT.ESC) ( shell.dispose(); ) if (e.type == SWT.MouseDown && e.button == 1) ( startX = e.x; startY = e.y; ) اگر (e.type == SWT.MouseMove && (e.stateMask & SWT.BUTTON1) != 0 ) ( نقطه p = shell.toDisplay(e.x، e.y)؛ p.x -= startX؛ p.y -= startY؛ shell.setLocation(p؛ ) if (e.type == SWT.Paint) (به عنوان مثال، drawImage( تصویر، imageData.x، imageData.y); ) ) );

بنابراین با فشردن کلید Esc پنجره بسته می شود. هنگامی که دکمه سمت چپ ماوس را در ناحیه پنجره فشار می دهید، مختصات کلیک را به خاطر بسپارید. هنگام حرکت دادن ماوس با فشار دادن دکمه سمت چپ، پنجره را مطابق با حرکت روی صفحه حرکت می دهیم. در رویداد ترسیم مجدد - تصویر پس زمینه را با استفاده از زمینه گرافیکی GC بکشید.

یک شنونده به رویدادهای پنجره مربوطه اختصاص دهید:

Shell.addListener (SWT.KeyDown، شنونده)؛ shell.addListener (SWT.MouseDown، شنونده)؛ shell.addListener (SWT.MouseMove، شنونده)؛ shell.addListener (SWT.Paint، listener);

اندازه پنجره را به اندازه تصویر تنظیم کنید:

Shell.setSize(imageData.x + imageData.width، imageData.y + imageData.height)؛

پنجره را باز کنید و حلقه رویداد را اجرا کنید:

Shell.open(); while (!shell.isDisposed ()) ( if (!display.readAndDispatch ()) display.sleep (); )

فراموش نکنید که منابع استفاده شده را در پایان منتشر کنید:

region.dispose(); image.dispose(); display.dispose();

با اجرای برنامه در این مرحله مستطیلی به دست می آید که با موس قابل جابجایی و با Esc بسته می شود.

زمان اضافه کردن محتوا فرا رسیده است. آب و هوای فعلی را در قالب یک نماد وضعیت (آفتابی، باران، برف ...)، خوانش دما و زمان آخرین به روز رسانی نمایش خواهیم داد.

از مدیران Layout برای چیدمان اجزای گرافیکی در پنجره به شکل دلخواه استفاده می شود. مدیر layout نه تنها به چیدمان اجزا، بلکه به تغییر اندازه آنها در هنگام تغییر اندازه پنجره نیز توجه دارد. ما از GridLayout برای ویجت خود استفاده خواهیم کرد. این مدیر اجزاء را در سلول های یک جدول خیالی مرتب می کند. یک GridBagLayout برای دو ستون با عرض ستون های مختلف ایجاد کنید (پرچم نادرست در سازنده)، آن را به عنوان مدیر طرح بندی پنجره تنظیم کنید:

طرح بندی GridLayout = جدید GridLayout(2, false); shell.setLayout(layout);

برای تصویر وضعیت، از مولفه Label استفاده می کنیم. شی پنجره را به عنوان والد ارسال می کنیم. پارامتر دوم تنظیم سبک کامپوننت است. برای هر مؤلفه، مجموعه پرچم‌های سبک ممکن متفاوت است، آنها را می‌توان در مستندات یا مستقیماً در کد منبع مؤلفه یافت.

//تصویر وضعیت را رسم Label imageLabel = new Label(shell, SWT.NONE); imageLabel.setLayoutData(GridData جدید(SWT.LEFT، SWT.TOP، true، true، 1، 1));

پرچم‌ها در کلاس GridData به این معنی است که برچسب در سمت چپ بالا قرار می‌گیرد، زمانی که فضای خالی وجود داشته باشد به صورت افقی و عمودی کشیده می‌شود (پرچم‌ها روی true تنظیم می‌شوند) و یک سطر و یک ستون از جدول طرح‌بندی را اشغال می‌کنند.

در SWT نیست پس زمینه شفافکامپوننت ها و پس زمینه سفید پشت تصویر وضعیت خودنمایی می کند که البته مطلوب نخواهد بود. بنابراین بیایید یک شی Color با رنگ پس‌زمینه پنجره ایجاد کنیم:

رنگ bgColor = رنگ جدید (نمایش، 0x2b، 0x2b، 0x2b)؛

در پایان برنامه، این شی نیز باید با فراخوانی متد dispose پاک شود. رنگ پس‌زمینه و تصویر وضعیت را تنظیم کنید، که می‌تواند از یک فایل به همان روشی که تصویر پس‌زمینه را در ابتدا بارگذاری کردیم، بارگذاری شود:

ImageLabel.setBackground(bgColor); وضعیت تصویرImage = تصویر جدید (نمایش، "images/1.png#26759185"); imageLabel.setImage(statusImage);

حالا بیایید یک برچسب با دمای فعلی اضافه کنیم و آن را در قسمت سمت راست بالای پنجره قرار دهیم:

label temperatureLabel = new Label(shell, SWT.NONE); temperatureLabel.setLayoutData(GridData جدید(SWT.RIGHT، SWT.TOP، false، false، 1، 1));

بیایید مقداری دما را تنظیم کنیم:

TemperatureLabel.setText("+1 \u2103");

برای ثبت دما بر حسب سلسیوس، از عدد یونیکد کاراکتر مربوطه با کاراکترهای سرویس \u استفاده می شود.

فونت پیش فرض برای برچسب های متنی بسیار کوچک است. بنابراین بیایید یک جدید و بزرگتر ایجاد کنیم:

FontData fD = temperatureLabel.getFont().getFontData(); fD.setHeight(30); fD.setStyle(SWT.BOLD); فونت newFont = فونت جدید (نمایش، fD); temperatureLabel.setFont(newFont); فونت، مانند سایر اشیاء منبع، باید آزاد شود. برای انجام این کار، از شنونده رویداد تخریب برچسب استفاده می کنیم:

TemperatureLabel.addDisposeListener(new DisposeListener() ( public void widgetDisposed(DisposeEvent e) ( newFont.dispose(); ) ));

در نهایت، بیایید یک برچسب برای توصیف شرایط آب و هوایی اضافه کنیم:

توضیحات برچسبLabel = new Label(shell, SWT.WRAP); descriptionLabel.setLayoutData(GridData جدید(SWT.FILL، SWT.CENTER، true، true، 2، 1)); descriptionLabel.setText("ابری همراه با پاکی، باران ملایم"); descriptionLabel.setBackground(bgColor); descriptionLabel.setForeground(display.getSystemColor(SWT.COLOR_WHITE));

متن می تواند بسیار طولانی باشد، بنابراین هنگام ایجاد برچسب، پرچم WRAP را مشخص می کنیم تا در صورت کمبود فضای کافی، متن به طور خودکار به چندین خط تقسیم شود. بیایید جزء را در مرکز قرار دهیم و اجازه دهیم کل فضای افقی را پر کند. همچنین مشخص می کنیم که کامپوننت دو ستون از جدول layout را اشغال کند. ما پنجره ای را از تصویر "ویجت آب و هوا" راه اندازی می کنیم و دریافت می کنیم.

اکنون می توانید نوعی سرویس آب و هوا را وصل کنید، یک تایمر برای به روز رسانی خودکار ایجاد کنید - و ویجت آماده است.

نوسان: همیشه اخبار تازه

در Swing، یک ویجت برای نمایش فیدهای RSS خواهیم نوشت. مانند دفعه قبل با ایجاد یک پنجره شروع می کنیم. کلاسی که عملکرد استاندارد پنجره را در Swing پیاده سازی می کند JFrame نامیده می شود. به‌طور پیش‌فرض، بستن پنجره برنامه در Swing باعث توقف برنامه نمی‌شود، بنابراین بهتر است نحوه عملکرد پنجره در هنگام بسته شدن را مشخص کنید:

فریم JFrame = new JFrame(); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

جدول برای ارائه اخبار بهترین است. Swing بر اساس الگوی Model-View-Controller (MVC) ساخته شده است. در معماری MVC، Model داده ها را ارائه می دهد، View مسئول نمایش داده ها (مثلا متن، فیلدهای ورودی) است و Controller تعامل بین Model و View را فراهم می کند. جدول این رویکرد را به خوبی نشان می دهد. برای نمایش داده ها از کلاسی استفاده می شود که رابط TableModel را پیاده سازی می کند.

برای ذخیره اطلاعات در مورد اخبار موجود، بیایید یک کلاس FeedMessage با فیلدهایی برای عنوان مقاله و تاریخ انتشار ایجاد کنیم:

کلاس عمومی FeedMessage (عنوان رشته عمومی؛ تاریخ انتشار عمومی تاریخ؛ )

برای ساده‌سازی و سرعت بخشیدن به توسعه، مدل داده‌های خود را از کلاس AbstractTableModel به ارث می‌بریم، که پیاده‌سازی آماده‌ای از تقریباً تمام روش‌های رابط TableModel را ارائه می‌دهد.

کلاس عمومی RssFeedTableModel را گسترش می دهد AbstractTableModel (فهرست خصوصی ورودی = ArrayList جدید<>()؛ عمومی void updateData(فهرست ورودی) ( this.entries = ورودی؛ fireTableDataChanged(); ) public int getRowCount() ( return entries.size(); ) public int getColumnCount() ( return 2; ) public Object getValueAt(int rowIndex, int columnIndex) ( switch (columnIndex) ( case 0: return entries.get(rowIndex).title; case 1: return entries.get(rowIndex).publicationDate; ) return null; ) )

متد fireTableDataChanged به این دیدگاه می گوید که مدل داده تغییر کرده است و باید دوباره ارائه شود.

یک جدول ایجاد می کنیم و ظاهر آن را کمی تغییر می دهیم تا بیشتر شبیه یک ویجت شود. خطوط بین سطرها و ستون ها را حذف می کنیم، ارتفاع ردیف را افزایش می دهیم و هدر جدول را با نام ستون ها حذف می کنیم:

جدول JTable = جدید JTable(جدید RssFeedTableModel()); tablesetShowGrid(false); table.setIntercellSpacing(new Dimension(0, 0)); tablesetRowHeight(30); table.setTableHeader(null);

حالا بیایید مشغول شویم ظاهرسلول ها. Swing به شما امکان می دهد تا کلاس های view جداگانه را به انواع داده های مختلف اختصاص دهید. کلاسی که رابط TableCellRenderer را به ارث می برد، مسئول رندر کردن تک تک سلول های جدول است. پیش فرض DefaultTableCellRenderer است که یک برچسب متنی است.

بیایید رندر سلول خود را به داده های رشته ای اختصاص دهیم. بیایید رنگ فونت پیش‌فرض را تغییر دهیم و رنگ پس‌زمینه را جایگزین کنیم تا خوانایی بهتر شود.

Table.setDefaultRenderer(String.class، جدید DefaultTableCellRenderer() (رنگ oddColor = رنگ جدید (0x25، 0x25، 0x25)؛ Color evenColor = رنگ جدید (0x1a، 0x1a، 0x1a)، عنوان رنگColorColor = رنگ جدید (0x2x0، ) کامپوننت عمومی getTableCellRendererComponent(جدول JTable، مقدار Object، Boolean isSelected، Boolean hasFocus، int row، int column) (super.getTableCellRendererComponent(جدول، مقدار، isSelected، hasFocus، ردیف، ستون)؛ setBackground(0 ٪) ?oddColor: evenColor)؛ setForeground(titleColor)؛ setFont(font)؛ این را برگردانید؛ ) )).

برای اینکه جدول شروع به استفاده از رندر ما کند، باید روشی اضافه کنیم که نوع داده هر سلول را به مدل داده برمی گرداند:

کلاس عمومیgetColumnClass(int columnIndex) ( سوئیچ (columnIndex) ( case 0: return String.class؛ case 1: return Date.class; ) return Object.class؛ )

ممکن است اخبار زیادی وجود داشته باشد، بنابراین بیایید جدول را روی نوار اسکرول قرار دهیم و نوار اسکرول را نامرئی کنیم تا طراحی ویجت ما را خراب نکند:

JScrollPane scrollPane = جدید JScrollPane(جدول); table.setFillsViewportHeight(true); scrollPane.getVerticalScrollBar().setPreferredSize(new Dimension(0,0));

افزودن یک جزء اسکرول به صفحه اصلی پنجره. آرگومان دوم می تواند محل کامپوننت باشد. به طور پیش فرض، صفحه اصلی یک پنجره از مدیر طرح بندی BorderLayout استفاده می کند که اجزا را بر اساس جهت های اصلی قرار می دهد. بیایید جدول را با اسکرول در مرکز قرار دهیم.

Frame.getContentPane().add(scrollPane, BorderLayout.CENTER);

مانند دفعه قبل، قاب استاندارد پنجره را حذف می کنیم. و به عنوان عنوان پنجره، از یک برچسب متنی سبک استفاده می کنیم که آن را در بالای پنجره قرار می دهیم.

JLabel titleLabel = new JLabel("Xakep RSS"); Font titleFont = new Font("Arial", Font.BOLD, 20); titleLabel.setFont(titleFont); titleLabel.setHorizontalAlignment(SwingConstants.CENTER); titleLabel.setForeground(Color.WHITE); titleLabel.setPreferredSize(new Dimension(0, 40)); frame.getContentPane().add(titleLabel, BorderLayout.NORTH);

بر خلاف SWT، اشیاء "رنگ" و "فونت" به طور خودکار توزیع می شوند، بنابراین دیگر لازم نیست نگران نشت حافظه باشید.

ما شنونده های ماوس را اضافه می کنیم تا بتوان پنجره را در اطراف صفحه حرکت داد.

شنونده MouseAdapter = جدید MouseAdapter() (int startX; int startY; public void mousePressed(MouseEvent e) ( if (e.getButton() == MouseEvent.BUTTON1) ( startX = e.getX(); startY = e.getY( ) ) ) public void mouseDragged(MouseEvent e) ( Point currCoords = e.getLocationOnScreen(); frame.setLocation(currCoords.x - startX, currCoords.y - startY); ) ); titleLabel.addMouseListener(شنونده); titleLabel.addMouseMotionListener(شنونده);

حالا شکل پنجره را به مستطیل با گوشه های گرد تغییر دهید. بهتر است این کار را در شنونده کامپوننت انجام دهید، زیرا اگر اندازه پنجره تغییر کند، شکل پنجره به درستی محاسبه می شود:

Frame.addComponentListener(new ComponentAdapter() ( public void componentResized(ComponentEvent e) (frame.setShape(RoundRectangle2D.Double جدید(0, 0, frame.getWidth(), frame.getHeight(), 20, 20)); ) )

اندازه پنجره را تنظیم کنید، قاب را بردارید و پنجره را نیمه شفاف کنید.

Frame.setSize(520, 300); frame.setUndecorated(true); frame.setOpacity(0.85f);

در نهایت یک پنجره در تاپیک گرافیک باز می کنیم. SwingUtilities.invokeLater(new Runnable() ( public void run() (frame.setVisible(true); ) ));

باقی مانده است که بارگذاری داده را در یک موضوع جداگانه اضافه کنید و ما چنین ویجتی را با آخرین اخبار از مجله مورد علاقه شما دریافت خواهیم کرد :).


JavaFX: بیایید به موسیقی گوش کنیم

و در نهایت، نقطه برجسته فصل JavaFX است. بیایید از قابلیت های چند رسانه ای و جزء نموداری آن استفاده کنیم و یک اکولایزر ساده بسازیم.

ابتدا کلاس ویجت را از Application به ارث می بریم. این کلاس برنامه اصلی در JavaFX است. برنامه شامل روش های اصلی چرخه عمر برنامه است. اجزای فرم در متد start ایجاد می شوند که آرگومان آن کلاس Stage است. Stage نمایانگر پنجره برنامه است. برای حذف حاشیه و دکمه ها، سبک پنجره را به TRANSPARENT تغییر دهید. کلاس Stage شامل کلاس Scene است که اندازه پنجره و رنگ پس زمینه را تعیین می کند. در Scene، به نوبه خود، کلاس Group را پشت سر می گذاریم، که در آن اجزای فرزند را قرار می دهیم:

شروع خالی عمومی (مرحله اصلی مرحله) (primaryStage.initStyle(StageStyle.TRANSPARENT)؛ ریشه گروه = گروه جدید()؛ صحنه صحنه = صحنه جدید (ریشه، 400، 200، رنگ. TRANSPARENT); primarStage.setScene(صحنه);

برای نمایش اکولایزر از نمودار میله ای استفاده می کنیم که در امتداد محورهای آن فرکانس و توان صدا را نمایش می دهیم:

CategoryAxis xAxis = new CategoryAxis(); NumberAxis yAxis = New NumberAxis(0,50,10); BarChart bc = BarChart جدید (xAxis,yAxis)؛ bc.setPrefSize(400, 200); bc.setLegendVisible(false); bc.setAnimated(false); bc.setBarGap(0); bc.setCategoryGap(1); bc.setVerticalGridLinesVisible(false); bc.setHorizontalGridLinesVisible(false); xAxis.setLabel("فرکانس"); yAxis.setLabel("Power"); yAxis.setTickLabelFormatter(New NumberAxis.DefaultFormatter(yAxis, null, "dB"));

نمودار را با داده های اولیه پر کنید:

XYChart.Series series1 = XYChart.Series جدید ()؛ series1Data = XYChart.Data جدید; دسته بندی رشته = رشته جدید; برای (int i=0; i (مقوله [i]، 50)؛ series1.getData().add(series1Data[i]); ) bc.getData().add(series1);

یک مستطیل با گوشه های گرد ایجاد کنید تا به ویجت شکل مناسب بدهد:

مستطیل مستطیل = مستطیل جدید(0، 0، 400، 200); توقف توقف = توقف جدید ( توقف جدید (0، رنگ جدید (0، 0، 0، 0.8))، تهی). LinearGradient lg2 = New LinearGradient(0, 0, 0, 0, false, CycleMethod.NO_CYCLE, stops); rectangle.setFill(lg2); rectangle.setArcHeight(20); rectangle.setArcWidth(20);

هر دو جزء را به گروه اضافه کنید:

Root.getChildren().addAll(مستطیل، bc);

شنوندگان ماوس را به گروه اختصاص دهید تا پنجره را در اطراف صفحه حرکت دهند:

Root.setOnMousePressed(EventHandler جدید () ( handle public void(MouseEvent me) ( initX = me.getScreenX() -primaryStage.getX(); initY = me.getScreenY() -primaryStage.getY(); ) )); root.setOnMouseDragged(EventHandler جدید () ( handle public void (MouseEvent me) (primaryStage.setX(me.getScreenX() - initX);primaryStage.setY(me.getScreenY() - initY); ) ));

دانلود آهنگ در پلیر:

File file = new File("let me out of here.mp3"); رسانه audioMedia = null; audioMedia = رسانه جدید(file.toURI().toURL().toString()); audioMediaPlayer = MediaPlayer جدید (audioMedia);

شنونده ای اضافه کنید که نمودار میله ای را به روز کند:

AudioMediaPlayer.setAudioSpectrumListener(New AudioSpectrumListener() ( طیف خالی عمومیDataUpdate (مهر زمانی مضاعف، مدت زمان مضاعف، اندازه های شناور، فازهای شناور) ( برای (int i = 0; i< series1Data.length; i++) { series1Data[i].setYValue(magnitudes[i] + 60); } } });

صحنه را قابل مشاهده کنید و آهنگ را پخش کنید:

PrimaryStage.show(); audioMediaPlayer.play();

ما برنامه را شروع می کنیم:

اصلی خالی استاتیک عمومی (آرگس های رشته ای) (راه اندازی (args)؛ )

و از این زیبایی لذت ببرید.