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

النسخة الأولى من برنامج Matrix Multiplayer

بدأه khaled_prg في 14 أكتوبر 2012 · 18 رد · 1,631 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

أملك فسحة من الوقت هذه الأيام لذا أحببت أن أقوم ببعض التدريبات البسيطة على كتابة برامج GUI بالجافا.

أول هذه البرامج هو "ضارب المصفوفات", و هو برنامج صغير وجدته في الإنترنت بينما كنت أبحث عن برامج للتسلية و التدريب :)

يقوم ضارب المصفوفات بإيجاد ناتج جداء مصفوفتين يُدخلهما المستخدم بشرط أن تكون الأبعاد أقل أو تُساوي 3. (البرنامج مكتوب بالفيجوال)

مثال :

post-225348-075853900 1350246107_thumb.p

البرنامج جيد في ظاهره و لكنه في نفس الوقت يحتوي على كوارث مخيفة إذا ما دققنا النظر :D

في ما يلي استعراض مختصر لبعض الأخطاء التي وقع فيها صاحب البرنامج :

توجد عدة أخطاء في الخوارزمية المسؤولة عن ضرب المصفوفات, ناتج ضرب المصفوفتين السابقتين يجب أن يُعطي :

post-225348-065320800 1350246368_thumb.p

العنصر الموجود عند تقاطع السطر الأول مع العمود الأول يُساوي 31 و ليس 34 !

أيضا, ما دامت الأبعاد تُساوي 2x2 فيجب أن تظهر المصفوفة في الجزء العلوي بدلا من السفلي.

كذلك من الأفضل تعطيل زر التحقق عندما تكون الأبعاد متناسقة.

و الخطأ الأكبر الذي وقعه فيه صديقنا هو عدم تسيير الإستثناءات, فعندما تُدخل قيم غير صحيحة في إحدى الخانات أو تتركها فارغة, ستحدث كوارث :)

للفائدة, قمت بإصلاح جميع الأخطاء المُوضحة أعلاه في البرنامج المُرفق.

صور توضيحية :

برنامج الفيجوال :

post-225348-099916500 1350247155_thumb.p

Easy-Math.rar

برنامج الجافا : (الأبعاد اعتبرتُ أنها تُقرأ من اليسار إلى اليمين)

post-225348-003554200 1350247180_thumb.p

Matrix Multiplayer.rar

النسخة الثانية من البرنامج ستحتوي على العديد من التحسينات (على مستوى الكود و على مستوى الواجهة الرسومية أيضا) بالإضافة إلى إدراج بعض العمليات الأخرى مثل :

  • إيجاد مقلوب المصفوفة. (Matrix Inverse)
  • إيجاد منقول المصفوفة. (transposed matrix)
  • حساب قيمة المحدد. (determinant)
  • قسمة المصفوفات.

هل هناك من يرغب بمشاركتي في تطوير البرنامج ؟ :)

المرفقات
14-10-2012 20-21-04.png14-10-2012 20-24-34.pngMohamed.pngKhaled_prg.png

تم تعديل هذه المشاركة بواسطة khaled_prg في 15 أكتوبر 2012 في 02:20

1
#2

شكرا على البرنامج لكني لم اجد الكود .

#3

مرحبا أستاذي, نورت الموضوع :)

لا أحب أن أضع الكود جاهز فيأخذه البعض على طريقة الــ Copy and Paste لكن سأضع أهم الدوال المُستخدمة في الكود مع بعض التفاصيل.

أول ما قمتُ به, هو رسم واجهة البرنامج على طريقة Drag and Drop في NetBeans.

اعتبرت أن المصفوفات عبارة عن هيكل ثنائي البعد من الــ JTextField :

JTextField MtrxOne[][] = new JTextField[3][3];
JTextField MtrxTwo[][] = new JTextField[3][3];

أيضا, اعتبرت أن المصفوفة الناتجة عبارة عن هيكل ثنائي البعد من الــ JLabel :

JLabel MtrxResult[][] = new JLabel[3][3];

قمت بتمرير القيمة null للدالة setLocationRelativeTo حتى تكون النافذة في منتصف الشاشة.

عندما يضغط المستخدم على زر التحقق قبل أن يحدد الأبعاد, ستعيد الدالة getSelectedItem القيمة null, عندها يتم إظهار رسالة الخطأ :

JLabel message1 = new JLabel("من فضلك, أدخل أبعاد كلا المصفوفتين");
message1.setFont(new java.awt.Font("Tahoma", 0, 12));
if (jCmbBxMtrx1.getSelectedItem() == null || jCmbBxMtrx2.getSelectedItem() == null)
     JOptionPane.showMessageDialog(null, message1,
                 "لم يتم تحديد الأبعاد بشكل كامل", JOptionPane.INFORMATION_MESSAGE);

في حالة الــ else نقوم بالتقاط آخر رقم من بُعد المصفوفة الثانية و أول رقم من بُعد المصفوفة الأولى :

char debut = jCmbBxMtrx2.getSelectedItem().toString().charAt(0),
     fin = jCmbBxMtrx1.getSelectedItem().toString().charAt(length1 - 1);

إذا كانا مُتساويين, نُظهر رسالة تفيد بذلك ثم نجعل الــ JTextField للقراءة فقط و نقوم بتعطيل الــ JcomboBox و زر التحقق و تنشيط زر الضرب :

if (debut == fin) {
    JLabel message2 = new JLabel("اضغط على الزر اضرب لحساب المصفوفة الناتجة");
    message2.setFont(new java.awt.Font("Tahoma", 0, 12));*
    JOptionPane.showMessageDialog(null, message2,
               "تم التحقق من  تناسق الأبعاد", JOptionPane.INFORMATION_MESSAGE);
    setEnabledJTextFieldMtrx(jCmbBxMtrx1);
    setEnabledJTextFieldMtrx(jCmbBxMtrx2);
    jCmbBxMtrx1.setEnabled(false);
    jCmbBxMtrx2.setEnabled(false);
    Verif.setEnabled(false);
    Mult.setEnabled(true);
}

في حالة الــ else سنقوم بإظهار رسالة تفيد بعدم تناسق الأبعاد :

else {
    JLabel message3 = new JLabel("عدد أعمدة المصفوفة الأولى يجب أن يكون مُساوياً لعدد صفوف المصفوفة الثانية");
    message3.setFont(new java.awt.Font("Tahoma", 0, 12));  
    JOptionPane.showMessageDialog(null, message3,
                "الأبعاد غير متناسقة", JOptionPane.INFORMATION_MESSAGE);
}

عند الضغط على مسألة جديدة, نقوم بعمل Reset لجميع العناصر :

jCmbBxMtrx1.setEnabled(true);
jCmbBxMtrx2.setEnabled(true);
jCmbBxMtrx1.setSelectedItem(null);
jCmbBxMtrx2.setSelectedItem(null);

Verif.setEnabled(true);
Mult.setEnabled(false);

for (int i = 0; i < 3; i++) {
     for (int j = 0; j < 3; j++) {
           MtrxOne[j].setText(null);
           MtrxOne[j].setEnabled(false);
           MtrxTwo[j].setText(null);
           MtrxTwo[j].setEnabled(false);
           MtrxResult[j].setText(null);
     }
}

الدالة convTxtFldtoInt تقوم بتحويل محتوى JTextField[][] إلى int[][] إن أمكن, إذا حدث استثناء من نوع NumberFormatException ستعيد الدالة null :

public int[][] convTxtFldtoInt(JTextField TxtFld[][]) {

        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (TxtFld[j].isEnabled() == true) {
                    x = i + 1;
                    y = j + 1;
                }
            }
        }
        int result[][] = new int[x][y];
        for (int i = 0; i < x; i++) {
            for (int j = 0; j < y; j++) {
                try {
                    result[j] = Integer.parseInt(TxtFld[j].getText());
                } catch (NumberFormatException e) {
                    return null;
                }
            }
        }
        return result;
}

بعد وضع محتوى الــ JTextField[][] في int[][], نقوم باستدعاء الدالة multiplyMatrix التي تعيد مصفوفة الجداء الناتجة :

public int[][] multiplyMatrix(int[][] a, int[][] b) {
        int[][] c = new int[a.length][b[0].length];

        for (int x = 0; x < c.length; x++) {
            for (int y = 0; y < c[0].length; y++) {
                int sum = 0;
                for (int i = 0; i < a[0].length; i++) {
                    sum += a[x] * b[y];
                }
                c[x][y] = sum;
            }
        }
        return c;
}

ثم نقوم بإظهار المصفوفة الناتجة في الــ JLabel[][] باستخدام الدالة displayMtrx :

public void displayMtrx(int[][] m) {
      for (int i = 0; i < m.length; i++) {
           for (int j = 0; j < m[0].length; j++) {
                MtrxResult[j].setText(String.valueOf(m[j]));
           }
      }
}

نقوم بتجميع الدوال السابقة في الزر اضرب :

a = convTxtFldtoInt(MtrxOne);
b = convTxtFldtoInt(MtrxTwo);
if (a == null || b == null) {
    JLabel message4 = new JLabel("قيم المصفوفة يجب أن تكون أعداداً صحيحة فقط");
    message4.setFont(new java.awt.Font("Tahoma", 0, 12));
    JOptionPane.showMessageDialog(null, message4,
               "يوجد خطأ في الإدخال", JOptionPane.INFORMATION_MESSAGE);
} else {
    int finResult[][] = multiplyMatrix(a, b);
    displayMtrx(finResult);
    Mult.setEnabled(false);

    for (int i = 0; i < 3; i++) {
         for (int j = 0; j < 3; j++) {
              MtrxOne[j].setEditable(false);
              MtrxTwo[j].setEditable(false);
         }
    }
}

بانتظار ملاحظاتكم أحبتي :)

1
#4

شكرا علي الشرح والتوضيح. كنت اتمنا لو كان عندي ايام ما كنت ادرس المصفوفات.

اما بالنسبة للكود فعندما تعرضه ستجد الملاحظات من الزملاء وستجد افكار جديده لتنفيذ البرنامج.

المنتدي عاده يهتم بالكود وليس البرنامج .

من الواضح انك دمجت منطق البرنامج بالواجهات الرسوميه.

سؤال لو اردت زياده الاعمده و الصفوف التي يقبلها البرنامج لكل مصفوفه ، كم ستحتاج من الوقت لتنفيذ ذلك ؟

تم تعديل هذه المشاركة بواسطة العيافـي في 16 أكتوبر 2012 في 10:03

#5
اقتباس
بالنسبة للكود فعندما تعرضه ستجد الملاحظات من الزملاء وستجد افكار جديده لتنفيذ البرنامج.

الكود مُقسم إلى مجموعة دوال و أنا وضعتها مع الشرح :)

تطوير برنامجي يعني تحسين جودة الدوال السابقة و بالتالي يمكن للأعضاء تقديم مقترحاتهم حول جودة الدوال من أجل تطوير البرنامج :happy:

اقتباس
من الواضح انك دمجت منطق البرنامج بالواجهات الرسوميه.

هل تقصد رسم واجهة البرنامج على طريقة Drag and Drop ؟

هل الأمر غير مُحبب ؟

اقتباس
لو اردت زياده الاعمده و الصفوف التي يقبلها البرنامج لكل مصفوفه ، كم ستحتاج من الوقت لتنفيذ ذلك ؟

أممممم .. سيكون الأمر مُعقدا بعض الشيء !

المشكلة التي ستواجهني هي معرفة الأبعاد التي أدخلها المستخدم و إظهار خانات المصفوفة الجديدة (عناصر الــ JTextField)

عموماً, سأحاول القيام بالأمر و أخبرك بالنتائج :)

1
#6

مرحبا من جديد :)

فكرتي كالتالي :

أقوم بالتقاط أبعاد المصفوفة عن طريق استخراج أول و آخر حرف من الــ getSelectedItem, هكذا :

int length = Arg.getSelectedItem().toString().length();
String debut = Arg.getSelectedItem().toString().substring(0, 1),
       fin = Arg.getSelectedItem().toString().substring(length-1,length);
int begin = Integer.parseInt(debut), end = Integer.parseInt(fin);

ثم أقوم بعمل حلقة تمر على المصفوفة ذات الأبعاد begin x end و في كل مرة أقوم بتفعيل الــ JTextField :

for (int i = 0; i < begin; i++) {
     for (int j = 0; j < end; j++) {
          MtrxJTextField[j].setEnabled(true);
          MtrxJTextField[j].setEditable(true);
     }
}

ثم أقوم بتعطيل البقية :

for (int i = 0; i < rows; i++) {
     for (int j = 0; j < colums; j++) {
          if (MtrxJTextField[j].isEnabled() != true) {
              MtrxJTextField[j].setEnabled(false);
          }
     }
}

و عليه, تكون الدالة هكذا :

public void setEnableOrDisableJTextFieldArray(JComboBox Arg) {
        int length = Arg.getSelectedItem().toString().length();
        String debut = Arg.getSelectedItem().toString().substring(0, 1),
                fin = Arg.getSelectedItem().toString().substring(length-1,length);
        int begin = Integer.parseInt(debut), end = Integer.parseInt(fin);

        for (int i = 0; i < begin; i++) {
            for (int j = 0; j < end; j++) {
                MtrxJTextField[j].setEnabled(true);
                MtrxJTextField[j].setEditable(true);
            }
        }

        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < colums; j++) {
                if (MtrxJTextField[j].isEnabled() != true) {
                    MtrxJTextField[j].setEnabled(false);
                }
            }
        }
    }

مشكلتي الآن هي كيف أحدد اسم الــ JComboBox التي اختارها المُستخدم حتى أعرف هل أعمل على المصفوفة الأولى أم الثانية لأن كل مصفوفة يُقابلها JTextField[][] مختلف.

ملاحظة : إذا نجحتُ في إظهار المصفوفة المناسبة فعملية الضرب ستكون سهلة جداً.

تم تعديل هذه المشاركة بواسطة khaled_prg في 16 أكتوبر 2012 في 13:01

#7

يعطيك الف عافيه

يا ريت ترفق البرنامج .jar حتى يستطيع اصحاب انظمة التشغيل الاخرى تشغيله (لينكس او ماك)

#8
اقتباس
و الخطأ الأكبر الذي وقعه فيه صديقنا هو عدم تسيير الإستثناءات, فعندما تُدخل قيم غير صحيحة في إحدى الخانات أو تتركها فارغة, ستحدث كوارث :)

:happy: ... Try ... Catch ... :happy:

+X

مشكور اخوي على هاد الموضوع المفيد :)

556891961.gif

I am learning from you

it is the programmer eye

#9

تم بحمد الله حل المشكلة الأخيرة عن طريقة إنشاء كائن من الــ ActionEvent و مقارنة ما تعيده getSource مع أسماء الــ JComboBox, هكذا :

public void actionPerformed(ActionEvent arg) {
      if (arg.getSource() == combo1) {
          //...
      }
      if (arg.getSource() == combo2) {
          //...
      }
}

قمتُ بكتابة هذا المثال للتوضيح :

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Fenetre extends JFrame implements ActionListener {

    private JComboBox combo1 = new JComboBox();
    private JComboBox combo2 = new JComboBox();
    private JPanel container = new JPanel();
    private JLabel label = new JLabel("لم يتم الإختيار بعد");

    public Fenetre() {
        this.setTitle("عنوان النافذة");
        label.setFont(new java.awt.Font("Tahoma", 0, 12));
        this.setSize(250, 150);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setResizable(false);
        combo1.setModel(new javax.swing.DefaultComboBoxModel(
                new String[]{"Item 1", "Item 2", "Item 3", "Item 4"}));
        combo2.setModel(new javax.swing.DefaultComboBoxModel(
                new String[]{"Item 1", "Item 2", "Item 3", "Item 4"}));
        container.setLayout(new BorderLayout());
        combo1.addActionListener(this);
        combo2.addActionListener(this);
        JPanel south = new JPanel();
        south.add(combo1);
        south.add(combo2);
        container.add(south, BorderLayout.SOUTH);
        label.setHorizontalAlignment(JLabel.CENTER);
        container.add(label, BorderLayout.NORTH);
        this.setContentPane(container);
        this.setVisible(true);
    }

    public void actionPerformed(ActionEvent arg) {
        if (arg.getSource() == combo1) {
            label.setText("لقد اخترتم الكومبو رقم 2");
        }
        if (arg.getSource() == combo2) {
            label.setText("لقد اخترتم الكومبو رقم 1");
        }
    }

    public static void main(String args[]) {
        new Fenetre();
    }
}

اقتباس
يا ريت ترفق البرنامج .jar حتى يستطيع اصحاب انظمة التشغيل الاخرى تشغيله (لينكس او ماك)

سأرفق ملف الجار في النسخة الثانية إن شاء الله.

#10

السلام عليكم

رائع خالد

اقتباس
لا أحب أن أضع الكود جاهز فيأخذه البعض على طريقة الــ Copy and Paste لكن سأضع أهم الدوال المُستخدمة في الكود مع بعض التفاصيل.
فعلاً لأن المقام الأول لهذا المنتدى هو الإهتمام التعليمى , وإن كان الشخص يريد التعلم سيحاول تجربة الأكواد وعندها سيتعلم أكثر مما لو وضع له البرنامج كامل, ولكن البعض لا يحبذ هذا ويفضل الوجبات السريعةsmile.gif

إسمح لى بتلك المقترحات :

1- أن يتم توليد محتويات JComboBox تلقائياً عند بداية التشغيل " أقصد الـItems " حسبما تريد .

2- يتم تكوين المصفوفات على حسب إختيار المستخدم تلقائياً أثناء وقت التشغيل , أى يتم إنشاء الـJTextField أثناء وقت التشغيل .

- تلك المقترحات ستجعل من برنامجك أكثر ديناميكية وسهولة فى التعامل مع ضرب المصفوفات لأى عدد m*n x n*m

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#11
اقتباس
إسمح لى بتلك المقترحات :

1- أن يتم توليد محتويات JComboBox تلقائياً عند بداية التشغيل " أقصد الـItems " حسبما تريد .

2- يتم تكوين المصفوفات على حسب إختيار المستخدم تلقائياً أثناء وقت التشغيل , أى يتم إنشاء الـJTextField أثناء وقت التشغيل .

- تلك المقترحات ستجعل من برنامجك أكثر ديناميكية وسهولة فى التعامل مع ضرب المصفوفات لأى عدد m*n x n*m

أشكرك أخي أحمد على المقترحات الجميلة :)

جاري العمل على تطوير النسخة التي تسمح بإيجاد جداء مصفوفتين لا على التعيين.

لكن قل لي, أريد أن أستدعي دالة مُعينة بمجرد الكتابة في إحدى الــ الـJTextField, كيف أفعل ذلك ؟

#12

السلام عليكم

اقتباس

لكن قل لي, أريد أن أستدعي دالة مُعينة بمجرد الكتابة في إحدى الــ الـJTextField, كيف أفعل ذلك ؟

يمكنك هذا من خلال التعامل مع الأحداث events

إن كنت تستخدم الواجهة الرسومية لبرنامج النت بينز ستضغط ذر أيمن على العنصر ومن ثًم إختيار events ثم إختار الحدث الذى تريده

- إن كنت تقصد مجرد الكتابة أى عملية التحديد للـJTextField ستكون من خلال الحدث focus ثم إختيار FocusGrained

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#13

جربتُ الحدث FocusGrained و لكنه يعمل في المرة الأولى فقط !

أنا أريد أن يتم استدعاء الدالة أثناء الكتابة في الــ JTextField بشكل تزامني ..

يعني مجرد ما يكتب المستخدم حرف أو يحذف آخر يتم إطلاق الحدث.

#14

وجدتُ الحل :)

الحل في هذه الحالة يتم باستخدام الحدث DocumentEvent و يمكننا معرفة طبيعة التغيرات التي تطرأ على الــ JTextField من خلال الدوال الثلاثة التالية :

changedUpdate, insertUpdate Or removeUpdate

مثال :

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;

public class AddingDocumentListenerJTextFieldSample {

    public static void main(String args[]) {
        final JFrame frame = new JFrame("Default Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTextField textField = new JTextField();
        frame.add(textField, BorderLayout.NORTH);

        DocumentListener documentListener = new DocumentListener() {

            public void changedUpdate(DocumentEvent documentEvent) {
                printIt(documentEvent);
            }

            public void insertUpdate(DocumentEvent documentEvent) {
                printIt(documentEvent);
            }

            public void removeUpdate(DocumentEvent documentEvent) {
                printIt(documentEvent);
            }

            private void printIt(DocumentEvent documentEvent) {
                DocumentEvent.EventType type = documentEvent.getType();
                String typeString = null;
                if (type.equals(DocumentEvent.EventType.CHANGE)) {
                    typeString = "Change";
                } else if (type.equals(DocumentEvent.EventType.INSERT)) {
                    typeString = "Insert";
                } else if (type.equals(DocumentEvent.EventType.REMOVE)) {
                    typeString = "Remove";
                }
                System.out.print("Type : " + typeString);
                Document source = documentEvent.getDocument();
                int length = source.getLength();
                System.out.println("Length: " + length);
            }
        };
        textField.getDocument().addDocumentListener(documentListener);

        frame.setSize(250, 150);
        frame.setVisible(true);
    }
}
1
#15

السلام عليكم

حقيقاً لا أعلم ولكن يمكن البحث عن JTextFiled validation أو JTextFiled text change evevnt أو إستخدم حدث الضغط على المفاتيح بعد حدث FocusGrained .

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#17
اقتباس
أخي أحمد, كيف أحذف الدالة JTextFieldFocusGained التي أضفتها قبل قليل بالــ NetBeans ؟
فعلاً يضع الـNetBeans قيود على الحذف من الكود أحياناً , قم بتحديد العنصر ومن القائمة اليمنى إختر events وأزل ما بداخل الحدث FocusGained ستصبح معك none وستزال من الكود .

وبالنسبة لطريقة وضع حدث الضغط على المفاتيح كما ذكرت لك سابقاً كطريقة من الطرق لكى تستطيع إستدعاء دالة ما أثناء الكتابة فى الـJTextField بشكل تزامنى , ستقوم بإنشاء حدث فتح النافذة WindowOpened ثم تضع بداخلها مستمع لأحداث الضغط على المفاتيح كالتالى :

    	jTextField2.addKeyListener(new KeyAdapter() {
        	public void keyPressed(KeyEvent EVT) {
            	jTextField1.setText("" + EVT.getKeyChar());
        	}
    	});

- أو مباشراً من خلال الحدث KeyTyped ضمن أحداث الـKey

تم تعديل هذه المشاركة بواسطة ahmedsaoud31 في 17 أكتوبر 2012 في 06:57

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#18
اقتباس
قم بتحديد العنصر ومن القائمة اليمنى إختر events وأزل ما بداخل الحدث FocusGained ستصبح معك none وستزال من الكود .

تم, شكراً لك :)

اقتباس
بالنسبة لطريقة وضع حدث الضغط على المفاتيح كما ذكرت لك سابقاً كطريقة من الطرق لكى تستطيع إستدعاء دالة ما أثناء الكتابة فى الـJTextField بشكل تزامنى , ستقوم بإنشاء حدث فتح النافذة WindowOpened ثم تضع بداخلها مستمع لأحداث الضغط على المفاتيح كالتالى :

jTextField2.addKeyListener(new KeyAdapter() {
                public void keyPressed(KeyEvent EVT) {
                jTextField1.setText("" + EVT.getKeyChar());
                }
        });

- أو مباشراً من خلال الحدث KeyTyped ضمن أحداث الـKey

جربتها و لم تنجح معي, لأنه إذا قام المستخدم بإدخال مجموعة حروف في الــ jTextField دُفعة واحدة سيتم التقاط الحرف الأول فقط !

عموما لا تشغل بالك .. أظن ان طريقة الــ DocumentEvent تؤدي المطلوب :happy:

#19

السلام عليكم

اقتباس

جربتها و لم تنجح معي, لأنه إذا قام المستخدم بإدخال مجموعة حروف في الــ jTextField دُفعة واحدة سيتم التقاط الحرف الأول فقط !

عموما لا تشغل بالك .. أظن ان طريقة الــ DocumentEvent تؤدي المطلوب happy.gif

نعم الكود يلتقط الحرف الذى يتم الضغط عليه فقط كمثال على الطريقة لأنى لا أعلم ماذا تريد تحديداً , عموماُ ما دمت وجدت طريقة فالحمد لله , وأيضاً وجدت أن حدث الـKeyTyped ضمن أحداث الـKey يقوم بهذا مباشراً .

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

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