الوقت/التاريخ الآن هو الجمعة أبريل 26, 2024 11:23 pm

2 نتيجة بحث عن JTextField

تخصيص مكونات Java Swing باستخادم سمات Material Design ...المكون JTextField

أهلا وسهلا بكم

Material Design هي لغة تصميم واجهة المستخدم موجهة أساسا لنظام Android تم إنشاؤها بواسطة #Google ، وتعمل  على تحسين تجربة المستخدمين مع واجهات رسومية غامرة ومتسقة عالية الجودة لأجهزة Android و iOS و Flutter والويب.

الوسم jtextfield على المنتدى منتدى مصر التقني 104250513

سنقوم إن شاء الله تعالى فى كتابة عدة مقالات عن كيفية تنسيق و تخصيص وتنسيق مكونات الفئة Java Swing بتصميم متعدد الابعاد Material Design


وسنبدء بأول مكون وهو الحقل النصي #JTextField و الذى يحتوي على العناصر التالية :

الوسم jtextfield على المنتدى منتدى مصر التقني KnKlyId57kL90arh5ia2UpHhlSNPNHHsVASOi2IFFa7civVP28alXeU0hqJB3XXxNoGPcNG4afyR4J_Xb2S70ohigHA0TEPnf_zmrg=w1064-v0

كما فى الصور أعلاه نجد عناصر المكون JTextField على النحو التالى :

1. حاوية المكون                    Container
2. ايقونة البداية (اختياري)          Leading icon
3. نص التسمية المتحرك            Floating Label  
4. مدخل النص                     Input text
5. أيقونة النهاية (اختياري)         Trailing icon
6. خط التنشيط                     Activation Line
7. نص مساعد (اختياري)          Helper text

1_إنشاء حاوية المكون مع خط التنشيط


الخطوة الاولى : قم بإنشاء فئة جديدة وليكن بأسم #EgyTextField مع تمديد تلك الفئة بالفئة  JTextField لوراثة كافة الصفات للحقل النصي :

الخطوة الثانية :إنشاء منشيء الفئة وذلك لتهيئة الكائن الذي تم إنشاؤه حديثًا من الفئة قبل استخدامه مع تحديد بعض الخصائص الاولية وذلك على النحو التالى :

الكود:

import java.awt.Color;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

/**
 *
 * @author ahmed manna
 */
public class EgyTextField extends JTextField{
    
    private boolean mouseOver = false;      // الاعلان عن متغير منطقي لمعرفة حركة الماوس

    public EgyTextField() {
        
        setBorder(new EmptyBorder(20, 3, 10, 3));     // إنشاء إطار فارغ بالقيم المحددة
        setSelectionColor(new Color(76, 204, 255));   // إضافة لون تركوازي عند تحديد النص
      
        // إضافة الوجهة مستمع الماوس
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent me) {   //تنفبذ الطريقة دخول الماوس
                mouseOver = true;                      
                repaint();                            // إستدعاء طريقة إعادة رسم المكون
            }

            @Override
            public void mouseExited(MouseEvent me) {  //تنفبذ الطريقة خروج الماوس
                mouseOver = false;
                repaint();
            }
        });
        
        // إضافة الوجهة مستمع التركيز على المكون
        addFocusListener(new FocusAdapter() {      
            @Override
            public void focusGained(FocusEvent fe) {  // تنفيذ الطريقة التركيز
                
            }

            @Override
            public void focusLost(FocusEvent fe) {  // تنفيذ طريقة فقد التركيز
                
            }
        });
              
    }
          
}



الخطوة الثالثة : رسم المكون وذك باستخدام الطريقة paintComponent التى يجب أن نضع شفرة الرسومات الخاصة لنا وذلك على النحو التالى :

الكود:
@Override
    public void paintComponent(Graphics grphcs) {
        super.paintComponent(grphcs);                  // استدعاء كافة الطرق لحقل النص الى كائن الرسم
        Graphics2D g2 = (Graphics2D) grphcs;  //اشتقاق مثيل من الفئة
      
        // تحديد سمات العرض لرسم الاشكال الهندسية
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
      
      
        int width = getWidth();    // الحصول على عرض الحقل النصي
        int height = getHeight();  // الحصول على إرتفاع الحقل النصي
      
        if (mouseOver) {
            g2.setColor(Color.CYAN);
        } else {
            g2.setColor(new Color(150, 150, 150));
        }
        
        // رسم مستطيل بالاحداثيات المحددة
        g2.fillRect(0, height-2 , width, 1);
        g2.dispose();
    }



الاخراج


الوسم jtextfield على المنتدى منتدى مصر التقني 912709370


2_إنشاء ايقونة البداية  Leading icon


ويتم ذلك عن طريق خطوتين :

الخطوة الاولى :رسم الصورة كخلفية في مربع النص النحو التالى :

الكود:
// قراءة الصور فى تخزينها فى كائن الصور
            BufferedImage image = ImageIO.read(EgyTextField.class.getResource("/icon/user.png"));
            
            // تحديد موقع الايقونة فى حقل النص
            // وذلك من خلال ارتفاع حقل النص مع خصم منه ارتفاع الصورة وقستمتها على اثنين
            // يودى ذلك الى وضع الايقونة فى منتصف حقل النص فى الاحداثي الافقي
            int centerPoint = (getHeight() - image.getHeight())/2;
                                    
            // رسم الايقونة
            g2.drawImage(image, 0, centerPoint, this);


الخطو الثاني :تعيين هامش عرض الصورة للنص داخل مربع النص وذلك بالشفرة التالية :

الكود:
int x = In.left + 5;            // الحصول على قيمة هامش الحد اليسار مع اضاف خمس بيسكل
            int textX = x+image.getWidth(); // الحصول على عرض الصورة مضاف الية قيمة الهامش
            
            
            // رسم الايقونة
            g2.drawImage(image, 0, centerPoint, this);
            
            // إضافة قيمة الهوامش الجديدة لحقل النص
             setMargin(new Insets(20,textX , 10, 0));



و الشفرة الكاملة لرسم المكون على النحو التالى :

الكود:

     @Override
    public void paintComponent(Graphics grphcs) {
        try {
            super.paintComponent(grphcs);         // استدعاء كافة الطرق لحقل النص الى كائن الرسم
            Graphics2D g2 = (Graphics2D) grphcs;  //اشتقاق مثيل من الفئة
            
            // تحديد سمات العرض لرسم الاشكال الهندسية
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            
                      
            int width = getWidth();    // الحصول على عرض الحقل النصي
            int height = getHeight();  // الحصول على إرتفاع الحقل النصي
            
            if (mouseOver) {
                g2.setColor(Color.CYAN);
            } else {
                g2.setColor(new Color(150, 150, 150));
            }
            
            // رسم مستطيل بالاحداثيات المحددة
             g2.fillRect(0, height-2 , width, 1);
            
            // قراءة الصور فى تخزينها فى كائن الصور
            BufferedImage image = ImageIO.read(EgyTextField.class.getResource("/icon/user.png"));
            
            // تحديد موقع الايقونة فى حقل النص
            // وذلك من خلال ارتفاع حقل النص مع خصم منه ارتفاع الصورة وقستمتها على اثنين
            // يودى ذلك الى وضع الايقونة فى منتصف حقل النص فى الاحداثي الافقي
            int centerPoint = (getHeight() - image.getHeight())/2;
            
                      
            int x = In.left + 5;            // الحصول على قيمة هامش الحد اليسار مع اضاف خمس بيسكل
            int textX = x+image.getWidth(); // الحصول على عرض الصورة مضاف الية قيمة الهامش
            
            
            // رسم الايقونة
            g2.drawImage(image, 0, centerPoint, this);
            
            // إضافة قيمة الهوامش الجديدة لحقل النص
             setMargin(new Insets(20,textX , 10, 0));
            
            g2.dispose();
        } catch (IOException ex) {
            Logger.getLogger(EgyTextField.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    


الاخراج حتى الان :

الوسم jtextfield على المنتدى منتدى مصر التقني 289975834


3_إضافة التسمية المتحركة Floating Label


سنقوم باضافة المكتبة TimingFrameWork الى المشروع و التى سوف نستخدمها لاضافة تاثير الحركة على النص وذلك على النحو التالى:

الكود:

package textfield;

import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.border.Border;
import org.jdesktop.animation.timing.Animator;
import org.jdesktop.animation.timing.TimingTarget;
import org.jdesktop.animation.timing.TimingTargetAdapter;

/**
 *
 * @author ahmed manna
 */
public class EgyTextField extends JTextField{
   
    private boolean mouseOver = false;      // الاعلان عن متغير منطقي لمعرفة حركة الماوس
    private final  Insets In;              // الاعلان عن كائن الهوامش
    private final  Border border;          // الاعلان عن كائن الحدود
    private final Animator animator;        // الاعلان عن كائن الخركة
    private boolean animateHinText = true;  //
    private float location;
    private boolean show;
    private final String labelText = "Floating Label";
   
    public EgyTextField()  {
     
       
        setSelectionColor(new Color(76, 204, 255));      // إضافة لون تركوازي عند تحديد النص
        border = UIManager.getBorder("TextField.border"); // الحصول على حدود حقل النصل
        In = border.getBorderInsets(this);          // الحصول على هوامش الحدود لحقل النص
           
        // إضافة الوجهة مستمع الماوس
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent me) {  //تنفبذ الطريقة دخول الماوس
                mouseOver = true;                     
                repaint();                            // إستدعاء طريقة إعادة رسم المكون
            }

            @Override
            public void mouseExited(MouseEvent me) {  //تنفبذ الطريقة خروج الماوس
                mouseOver = false;
                repaint();
            }
        });
       
        // إضافة الوجهة مستمع التركيز على المكون
        addFocusListener(new FocusAdapter() {     
            @Override
            public void focusGained(FocusEvent fe) {  // تنفيذ الطريقة التركيز
                showing(false);
            }

            @Override
            public void focusLost(FocusEvent fe) {  // تنفيذ طريقة فقد التركيز
                showing(true);
            }
        });
     
        // TimingTarget تنفيذ الواجهة
          // توفر هذه الواجهة الطرق التي يتم استدعاؤها بواسطة الرسوم المتحركة أثناء مسار تسلسل التوقيت
        TimingTarget target = new TimingTargetAdapter() {
           
            // طريقة بداية الحركة
            //تم الاتصال بها مرة واحدة عندما تبدأالحركة.
            @Override
            public void begin() {
                animateHinText = getText().equals("");  // التحقق من أن حقل النص فارغ أم لا
            }
           
            // ستتلقى هذه الطريقة جميع أحداث التوقيت أثناء الحركة
            @Override
            public void timingEvent(float fraction) {
                location = fraction;  //
                repaint();
            }

        };
        animator = new Animator(300, target); // إنشاء كائن الحركة
        animator.setResolution(0);          // الدقةوهي مقدار الوقت بين أحداث التوقيت لكائن الحركة
        animator.setAcceleration(0.5f);
        animator.setDeceleration(0.5f);
    }
   
    // طريقة للتحقق من حركة النص
    private void showing(boolean action) {
        if (animator.isRunning()) {
            animator.stop();
        } else {
            location = 1;
        }
        animator.setStartFraction(1f - location);
        show = action;
        location = 1f - location;
        animator.start();
    }
   
    private void createFloatingLabel(Graphics2D g2) {
        Insets in = getInsets();
        g2.setColor(new Color(150, 150, 150));
        FontMetrics ft = g2.getFontMetrics();
        Rectangle2D r2 = ft.getStringBounds(labelText, g2);
        double height = getHeight() - in.top- in.bottom;
        double textY = (height - r2.getHeight()) / 2;
        double size;
     
       
        if (animateHinText) {
            if (show) {
                size = 18 * (1 - location);
            } else {
                size = 18 * location;
            }
        } else {
            size = 18;
        }
       
        g2.drawString(labelText, 38, (int) (in.top + textY + ft.getAscent() - size));
     
    }
   
    @Override
    public void setText(String string) {
        if (!getText().equals(string)) {
            showing(string.equals(""));
        }
        super.setText(string);
    }
   
    @Override
    public void paintComponent(Graphics grphcs) {
        try {
            super.paintComponent(grphcs);        // استدعاء كافة الطرق لحقل النص الى كائن الرسم
            Graphics2D g2 = (Graphics2D) grphcs;  //اشتقاق مثيل من الفئة
           
            // تحديد سمات العرض لرسم الاشكال الهندسية
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
           
                     
            int width = getWidth();    // الحصول على عرض الحقل النصي
            int height = getHeight();  // الحصول على إرتفاع الحقل النصي
           
            if (mouseOver) {
                g2.setColor(Color.CYAN);
            } else {
                g2.setColor(new Color(150, 150, 150));
            }
           
            // رسم مستطيل بالاحداثيات المحددة
            g2.fillRect(0, height-2 , width, 1);
           
            // قراءة الصور فى تخزينها فى كائن الصور
            BufferedImage image = ImageIO.read(EgyTextField.class.getResource("/icon/user.png"));
           
            // تحديد موقع الايقونة فى حقل النص
            // وذلك من خلال ارتفاع حقل النص مع خصم منه ارتفاع الصورة وقستمتها على اثنين
            // يودى ذلك الى وضع الايقونة فى منتصف حقل النص فى الاحداثي الافقي
            int centerPoint = (getHeight() - image.getHeight())/2;
           
                     
            int x = In.left + 5;            // الحصول على قيمة هامش الحد اليسار مع اضاف خمس بيسكل
            int textX = x+image.getWidth(); // الحصول على عرض الصورة مضاف الية قيمة الهامش
           
           
            // رسم الايقونة
            g2.drawImage(image, 0, centerPoint, this);
           
            createFloatingLabel(g2);
           
            // إضافة قيمة الهوامش الجديدة لحقل النص
            setMargin(new Insets(20,textX , 10, 0));
           
            g2.dispose();
        } catch (IOException ex) {
            Logger.getLogger(EgyTextField.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
   
 
   
}


الاخراج حتى الان :
الوسم jtextfield على المنتدى منتدى مصر التقني 257654547

و لنا تكملة
من طرف أحمد مناع
في الجمعة نوفمبر 26, 2021 9:11 am
 
ابحث في: واجهة المستخدم الرسومية Java Swing
موضوع: تخصيص مكونات Java Swing باستخادم سمات Material Design ...المكون JTextField
المساهمات: 5
مشاهدة: 756

[Swing]القص , النسخ , اللقص فى حقل النص JTextField

كود بسيط لانشاء قائمة منبثقة لعميات القص , النسخ , اللقص فى حقل النص #JTextField  بالخطوات البسيطة التالية :

1_نقوم بانشاء كلاس جديد وليكن باسم TextWithPopUp.java 


الوسم jtextfield على المنتدى منتدى مصر التقني Pop2

2_ قم بتميدي الكلاس السابق بـــ extend JTextField ليصبح بالشكل التالى :


الوسم jtextfield على المنتدى منتدى مصر التقني Pop3

3_ كتابة الشفرة لهذا الكلاس على النحو التالى :

الكود:


// إستيراد المك
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
import javax.swing.undo.CannotRedoException;
import javax.swing.undo.CannotUndoException;
import javax.swing.undo.UndoManager;


public class TextWithPopUp extends JTextField{


// إنشاء كائن القائمة المنبثقة  
JPopupMenu popup = new JPopupMenu();


// إنشاء حقل النص
JTextField text = this;

UndoManager manager = new UndoManager();

// إنشاء عناصر القائمة
JMenuItem menuCut = new JMenuItem("Cut");
JMenuItem menuCopy = new JMenuItem("Copy");
JMenuItem menuPaste = new JMenuItem("Paste");
JMenuItem menuUndo = new JMenuItem("Undo");
JMenuItem menuRedo = new JMenuItem("Redo");
 
public TextWithPopUp() {
super();
initAksi();
initPopup();
}


// طريقة لوضع عناصر القائمة الى كائن القائمة
private void initPopup(){
this.setComponentPopupMenu(popup);
popup.add(menuCut);
popup.add(menuCopy);
popup.add(menuPaste);
JSeparator separator = new JSeparator();
popup.add(separator);
popup.add(menuUndo);
popup.add(menuRedo);
}


// طريقة لوضع ايقونة لعناصر القائمة
private void initAksi(){
menuCut.setIcon(new ImageIcon(getClass().getResource("/blog/ganjar/popupmenu/icon/cut-icon.png")));
menuCut.addActionListener(new ActionListener() {
 
@Override
public void actionPerformed(ActionEvent e) {
text.cut();
}
});
 
menuCopy.setIcon(new ImageIcon(getClass().getResource("/blog/ganjar/popupmenu/icon/Copy-icon.png")));
menuCopy.addActionListener(new ActionListener() {
 
@Override
public void actionPerformed(ActionEvent e) {
text.copy();
}
});
 
menuPaste.setIcon(new ImageIcon(getClass().getResource("/blog/ganjar/popupmenu/icon/Paste-icon.png")));
menuPaste.addActionListener(new ActionListener() {
 
@Override
public void actionPerformed(ActionEvent e) {
text.paste();
}
});
 
text.getDocument().addUndoableEditListener(new UndoableEditListener() {
@Override
public void undoableEditHappened(UndoableEditEvent e) {
manager.addEdit(e.getEdit());
}
});
 
menuUndo.setIcon(new ImageIcon(getClass().getResource("/blog/ganjar/popupmenu/icon/Undo-icon.png")));
menuUndo.addActionListener(new ActionListener() {
 
@Override
public void actionPerformed(ActionEvent e) {
try {
manager.undo();
} catch (CannotUndoException cannotUndoException) {
System.err.println(cannotUndoException);
}
}
});
 
menuRedo.setIcon(new ImageIcon(getClass().getResource("/blog/ganjar/popupmenu/icon/Redo-icon.png")));
menuRedo.addActionListener(new ActionListener() {
 
@Override
public void actionPerformed(ActionEvent e) {
try {
manager.redo();
} catch (CannotRedoException cannotRedoException) {
System.err.println(cannotRedoException);
}
}
});
}
}



4_ قم بحقظ الكلاس السابق

5_ قم بإنشاء نافذة JFrame  

الوسم jtextfield على المنتدى منتدى مصر التقني Pop4



6_أخيرا اسحب الفئة TextWithPopUp.java إلى Jframe حتى تظهر صورة  JTextField العادي على النافذة


الوسم jtextfield على المنتدى منتدى مصر التقني Pop5



7_ قم بتشغيل النافذة ليظهر حقل النص كما فى الصورة التالية مع كافة أوامر النسخ و القص و اللصق 

الوسم jtextfield على المنتدى منتدى مصر التقني Pop6
من طرف السنى
في الأربعاء أكتوبر 02, 2019 6:23 pm
 
ابحث في: واجهة المستخدم الرسومية Java Swing
موضوع: [Swing]القص , النسخ , اللقص فى حقل النص JTextField
المساهمات: 3
مشاهدة: 913

الرجوع الى أعلى الصفحة

انتقل الى: