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

مشكلة فى ربط 2 class

بدأه mr.beshoy في 27 فبراير 2010 · 8 رد · 521 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

هنا و فى هذا المثال كنت أجرب ال JPasswordField

لدينا 2 class فى ال class PassWordDilaog أقوم بعمل منادة للدالة getField() من ال class PasswordTest

و لعمل هذه المنادة قمت بكتابة

passwordField = new JPasswordField();

فى الclass PassWordDilaog و لكنه يعطينى خطأ Exception in thread "main" java.lang.StackOverflowError

------------------------------------------------------

الشفيرة :

-----------

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class PassWordTest extends JFrame {

    private JPanel panel, componentPanel;
    private JTextField field;
    private JButton button;
    private PassWordDialog passWordDialog;

    public PassWordTest() {
        panel = new JPanel();
        componentPanel = new JPanel(new FlowLayout());
        /////////////////////////////////////
        field = new JTextField(10);
        button = new JButton("GO");
        passWordDialog = new PassWordDialog();
        button.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                passWordDialog.setSize(new Dimension(500, 250));
                passWordDialog.setVisible(true);
            }
        });
        ///////////////////////////////////////
        componentPanel.add(field);
        componentPanel.add(button);
        ///////////////////////////////////////
        panel.add(componentPanel);
        getContentPane().add(componentPanel);
    }

    public char[] getField() {
        return field.getText().toCharArray();
    }

    public static void main(String[] args) {
        PassWordTest passWordTest = new PassWordTest();
        passWordTest.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        passWordTest.setSize(new Dimension(300, 200));
        passWordTest.setLocationRelativeTo(null);
        passWordTest.setVisible(true);

    }
}

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
public class PassWordDialog extends JDialog {

    private JPanel panel;
    private JPasswordField passwordField;
    private JButton button;
    private PassWordTest passWordTest;

    public PassWordDialog() {
        panel = new JPanel(new BorderLayout());
        passwordField = new JPasswordField();
        button = new JButton();
        panel.add(passwordField);
        panel.add(button);
        /////////////////////////////////////////
        passWordTest = new PassWordTest();
        ////////////////////////////////////////
        button.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                char[] input = passwordField.getPassword();
                if (isCorrectPassWord(input)) {
                    JOptionPane.showMessageDialog(null, "true password");
                } else {
                    JOptionPane.showMessageDialog(null, "false password");
                }
            }

            private boolean isCorrectPassWord(char[] input) {
                boolean isCorrect = true;
                char[] correctPassword = passWordTest.getField();
                if (input.length != correctPassword.length) {
                    isCorrect = false;
                } else {
                    isCorrect = Arrays.equals(input, correctPassword);
                }
                Arrays.fill(correctPassword, '0');
                return isCorrect;
            }
        });
    }
}

الكود فى المرفقات

---------------------------------------

شكراً

PasswordTest.rar

#2

ركز قليلا عندما تكتب الكود

في ال constructor الخاص ب PassWordTest تنادي على ال constructor الخاص ب PassWordDialog، وفي هذا الأخير تنادي على ال constructor الخاص ب PassWordTest الذي بدوره ينادي مرة أخرى على ال constructor الخاص ب PassWordDialog وهكذا إلى أن تمتلأ الذاكرة المخصصة لبرنامجك

#3

أنا محتاج كنت أنادم على ال constructor الخاص ب PassWordTest داخل ال PassWordDialog

حتى أستطيع المنادة على الدالة getField() الموجودة فى PassWordTest

و فى نفس الوقت فى ال passWordTest محتاج أنادم على ال constructor الخاص ب PassWordDialog

حتى أستطيع عمل :

 passWordDialog.setSize(new Dimension(500, 250));
                passWordDialog.setVisible(true);

فما الحل إذن ؟؟

شكراً

#4

اجعل باني الكائنات هذا

public PassWordDialog()

يأخذ كائن من النوع PassWordTest

ثم في صانع الكائات الخاص بـ PassWordTest ناد صانع الكائنات السابق بالطريقة التالية

passWordDialog = new PassWordDialog(this);

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#5

تمام . اتضحت الأمور .

لكن لماذا فى ال class PassWordDialog

عندما كتبت هذا :

public PassWordDialog(final PassWordTest passWordTest)
{
}

طلب غن ال refrence المُمرر يكون final ?

شكراً

#7

Why inner classes can access only local final variables?

Local Inner Classes and Anonymous Inner Classes can access the local final variables of the block of code they have been defined into. This block of code is typically a method.

The reason why the access has been restricted only to the local final variables is that if all the local variables would be made accessible then they would first required to be copied to a separate section where inner classes can have access to them and maintaining multiple copies of mutable local variables may lead to inconsistent data. Whereas final variables are immutable and hence any number of copies to them will not have any impact on the consistency of data.

Note: All the inner classes will continue to have access to all the members of the enclosing class. No inner class instance can exist without the corresponding enclosing class instance.

1
#8

محمد الكلام مقنع

لكن هل هو موثق؟ أقصد هل هذا كلام صن

تحيااتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#9

صدقا هذا الكلام من مقالة لمبرمج

لكن انا قرأت كلام مشابه تماما في كتاب ال SCJP

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