الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

طريقة تصميم L&F خاص بك

مغلق
بدأه رامي العيساوي في 31 يناير 2003 · 6 رد · 1,235 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

ان L&F يمكن تشبيهه بواجهة للبرنامج يتحدد فيه الالوان و الصفات المشتركة لجميع العناصر و هذا يسهل عليك الكثير من الوقت و الجهد اذا كنت ترغب بتحديد لون مشترك لعناصر برامجك مثل الوان الازرار و القوائم الخ ويمكنك ايضا ان تضيف شيئ مشترك لجميع الازرار مثلا لنفترض انك تريد من الزر عند مرور الماوس من فوقه ان يتغير لونه و لون النص الخاص به و عند ذهاب الماوس يعود لونه الى طبيعته بالطريقة العادية و بدون L&F تضيف للزر متنصت احداث عند مرور الماوس غير الالوان كذا و كذا و متنصت احداث آخر عند ذهاب الماوس غير الالون الى كذا و كذا مرة اخرى ...وهذا فقط بالنسبة لزر واحد فقط فكيف لبرنامج ملئ بالازرار و كل زر متنصت احداث خاص به . ( افضل هذه الطريقة لانها تسبب صداع شديد عند تنفيذها على عشرة ازرار فقط و هذا ما حصل معي قبل L&F )

والآن لحل هذه المشكلة و الكثير من غيرها اقدم لكم الطريقة الاسهل و الاسرع لتصميم L&F :

1- تنسخ جميع ملفات المصدر الموجودة ضمن المجلد srcjavaxswingplafmetal

2- تدخل الى كل ملف و تغير اسم الحزمة الى اسم الذي ترغب به و مثلا javaman و من ثم تضعهم بعد التعديل في مجلد له نفس اسم الحزمة javaman

3- و الآن سوف احدد لكم اهم الملفات التي سوف نعمل بها وهي

DefaultMetalTheme.java و لنسمه (ِأ)

MetalLookAndFeel.javaو لنسمه (ِب)

MetalTheme.javaو لنسمه (ج)

MetalButtonUI.javaو لنسمه (د)

في الملف (ِأ)سوف تجد الالوان التالية primary1 primary2 primary3 secondary1 secondary2 secondary3 و هي الالوان الاساسية غيرها على مزاجك و يوجد بعض الخطوط ايضا واظن انها ليست ضرورية لذا اتركها كما هي .

في الملف (ب) غيرالطرق التالية حسب معلوماتك getName() getID()getDescription()

و غير هذا حسب اسم الحزمة لديك من

String metalPackageName = "javax.swing.plaf.metal.";

الى

String metalPackageName = "javaman.";

و الآن اطلع في الملف كله و سوف تجد تحديد لالوان وخطوط جميع العناصر و لكن الطرق التي تحدد الالوان موجودة في الملف (ج) و اغلبها من الملف (أ) و يمكنك هنا اما ان تعتمد كليا على الملف (ج) و تتجاهل الملف (أ) و اما تغير في الملف (أ) و من ثم تغير المتبقى في الملف (ج) و لتوضيح الفكرة افتح الملف (ج) و سوف تجد انه ياخذ معظم الالوان من الملف (أ) و يضيف عليها الوان من عنده ليصبح(ج) مخزن الملف (ب) لجميع طرق الالوان في النهاية .

وفي الملف (د)قم بالتعديل في الصف MetalButtonListener و اضيف متنصتي الاحداث كم احببت فهي سوف تنفذ على جميع الازرار

على فكرة هناك طرق أخرى لتصميم L&F وهي كتابته بنفسك و لكنها طويلة جدا و تقريبا جميع طرق الL&F متشابهة فلماذا تكتب واحد جديد و هو موجود جاهز فقط عدل فيه و توفر الجهد و الوقت و من اجل اسماء الملفات تستطيع تغيرها و لكن يجب ان تعدل الملف (ب) باسماء الملفات الجديدة.

و لتشغيل L&F الخاص بك

try {

          UIManager.setLookAndFeel("javaman.MetalLookAndFeel" );

      } 

      catch (Exception e) { 

      }

ارجو ان يثبت الدرس لكي يستفيد منه الاخوة على مر الوقت و لكي لا يضيع مع الزمن و اود ان ارجوا اخواني الاعزاء ان يساعدوني مهما استطاعوا في الموضوع " كيف استطيع ان ارسل بايتات الى منفذ تسلسلي" و اكون لكم من الشاكرين .

اي سؤال حول الدرس انا جاهز

Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why

#2

مشكور على الشرح،، لكن لو وضعت لنا الطريقه بالتفصيل كان افضل ..

و لو وضعت ملفاتك المعدله ;)

#3

بسم الله الرحمن الرحيم

مشكور أخى و ياليت لو تضع الملفات المعدلة حتى يستطيع الأخوة المتابعة.

ايضا قد قمت بتثبيت الموضوع :D

شكرا جافا مان

خالد المصرى

#4

الف شكر يا ابن عمي علي الدرس اللذيذ ..

و هجربه أن شاء الله ..

مع تحياتي ..

أحمد ..

#5

مثال يستخدم ال L&F



import java.awt.event.*;

import javax.swing.*;



/**

* An application that displays a JButton and several JRadioButtons.

* The JRadioButtons determine the look and feel used by the application.

*/

public class SimpleExample extends JPanel {

   static JFrame frame;



   static String metal= "Metal";

   static String metalClassName = "javax.swing.plaf.metal.MetalLookAndFeel";



   static String motif = "Motif";

   static String motifClassName =

    "com.sun.java.swing.plaf.motif.MotifLookAndFeel";



   static String windows = "Windows";

   static String windowsClassName =

    "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";



   JRadioButton metalButton, motifButton, windowsButton;



   public SimpleExample() {

// Create the buttons.

JButton button = new JButton("Hello, world");

       button.setMnemonic('h'); //for looks only; button does nada



metalButton = new JRadioButton(metal);

       metalButton.setMnemonic('o');

metalButton.setActionCommand(metalClassName);



motifButton = new JRadioButton(motif);

       motifButton.setMnemonic('m');

motifButton.setActionCommand(motifClassName);



windowsButton = new JRadioButton(windows);

       windowsButton.setMnemonic('w');

windowsButton.setActionCommand(windowsClassName);



// Group the radio buttons.

ButtonGroup group = new ButtonGroup();

group.add(metalButton);

group.add(motifButton);

group.add(windowsButton);



       // Register a listener for the radio buttons.

RadioListener myListener = new RadioListener();

metalButton.addActionListener(myListener);

motifButton.addActionListener(myListener);

windowsButton.addActionListener(myListener);



add(button);

add(metalButton);

add(motifButton);

add(windowsButton);

   }





   /** An ActionListener that listens to the radio buttons. */

   class RadioListener implements ActionListener {

public void actionPerformed(ActionEvent e) {

    String lnfName = e.getActionCommand();



           try {

 UIManager.setLookAndFeel(lnfName);

 SwingUtilities.updateComponentTreeUI(frame);

 frame.pack();

           }

    catch (Exception exc) {

 JRadioButton button = (JRadioButton)e.getSource();

 button.setEnabled(false);

 updateState();

               System.err.println("Could not load LookAndFeel: " + lnfName);

           }

   

}

   }



   public void updateState() {

 String lnfName = UIManager.getLookAndFeel().getClass().getName();

 if (lnfName.indexOf(metal) >= 0) {

     metalButton.setSelected(true);

 } else if (lnfName.indexOf(windows) >= 0) {

     windowsButton.setSelected(true);

 } else if (lnfName.indexOf(motif) >= 0) {

     motifButton.setSelected(true);

 } else {

     System.err.println("SimpleExample is using an unknown L&F: " + lnfName);

 }

   }



   public static void main(String s[]) {

/*

   NOTE: By default, the look and feel will be set to the

   Cross Platform Look and Feel (which is currently Metal).

   The user may someday be able to override the default

   via a system property. If you as the developer want to

   be sure that a particular L&F is set, you can do so

   by calling UIManager.setLookAndFeel(). For example, the

   first code snippet below forcibly sets the UI to be the

   System Look and Feel. The second code snippet forcibly

   sets the look and feel to the Cross Platform L&F.



   Snippet 1:

      try {

          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

      } catch (Exception exc) {

          System.err.println("Error loading L&F: " + exc);

      }



   Snippet 2:

      try {

          UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());

      } catch (Exception exc) {

          System.err.println("Error loading L&F: " + exc);

             }

*/



SimpleExample panel = new SimpleExample();



frame = new JFrame("SimpleExample");

frame.addWindowListener(new WindowAdapter() {

    public void windowClosing(WindowEvent e) {System.exit(0);}

});

frame.getContentPane().add("Center", panel);

frame.pack();

frame.setVisible(true);



panel.updateState();

   }

}
import java.awt.*;

#6

السلام عليكم ورحمة الله وبركاته ..

(هذه مشاركتي الأولى هنا وللأسف لم أكن أستطيع أن أبدأ من المشاركة الثانية مباشرة :) )

بالنسبة لفكرة نسخ الملفات وعملها في مجلد جديد .. ألم يكن ممكنا عمل ( Inheritance ) من الـ " javax.swing.plaf.metal.MetalLookAndFeel " ؟!

بصراحة .. أفضل أن أكتب الكود كاملا بنفسي بدل أن أنقله من ملف آخر جاهز ( طبعا إلا إذا كنت " مزنوقا " )

على كل حال .. أحببت أن أضيف هذا السطر الذي يمكنني من أخد سمات النظام مباشرة ..

UIManager.setLookAndFeel(

     UIManager.getSystemLookAndFeelClassName());

أظن ذلك الأفضل حتى نرضي جميع الأذواق!

#7

اهلا بك اخي AntiVirus في المنتدى

و بالنسبة لكتابة ملف بنفسك افضل من ان يكون جاهزا فانا دائما مزنوق غلى حد تعبيرك و لذا الجا دائما الى الحل الاقصر و الاسهل;)

Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why

هذا الموضوع مغلق.

مواضيع مشابهة