ورود

View Full Version : نحوه انتقال متغیر بین پنجره ها



mhjbarnamenevis
پنج شنبه 15 مهر 1395, 20:25 عصر
سلام

چطور می توانم متغیری را در یک پنجره jframe تعریف کنم و بعد پنجره ای دیگر باز کنم و از آن متغیر استفاده کنم؟

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

https://vgy.me/1aigT6.png

با استفاده از constructor فقط می توانم مقادیر اولیه به متغیرم بدهم نه آخرین مقادیر تغییر یافته ی متغیر را (مقادیری که کاربر به برنامه می دهد).
دنبال چیزی مثل یک متغیر سراسری هستم که در سرتاسر برنامه رویش کار کنم...

متشکر

mhjbarnamenevis
پنج شنبه 15 مهر 1395, 20:51 عصر
خودم متوجه شدم...
(دو روز بود داشتم در سایت های خارجی دنبال روش می گشتم و تعجب می کردم از اینکه یک کار به این سادگی در جاوا شدنی نیست!!! آخر فهمیدم مشکلی نبوده و بدبخت داشته درست کار می کرده! )

به هر حال اگر کس دیگری این مشکل را داشت خیلی راحت می توان این کار را انجام داد به این ترتیب که در کلاس اول (در برنامه ی اول ، در پنجره ی اول)، متغیری از کلاس ِ دوم (پنجره ی دوم) را تغییر دهد. این گونه:
Class2.Var2="contents";


یا در کلاس ِ دوم متغیری از کلاس اول را بارگیری کند. مثل این:

var2=class1.var1;


البته متغیر ها انگار باید public static باشند.

vahid-p
پنج شنبه 15 مهر 1395, 23:08 عصر
نه لزوما static باشن.
روش های مختلفی داره، مثلا میتونید آبجکت صفحه قبل رو به صفحه جدید پاس بدید و به تمام فیلدهای public اش دسترسی داشته باشید یا getter هاش.
یا جایی که کار با داده ها زیاد باشه، از کلاس هایی جهت نگه داری داده ها استفاده می کنند و معمولا از الگوی طراحی singleton استفاده می کنند (این عبارت رو سرچ کنید)

در کل هیچ لزوم و تاکیدی وجود نداره از کدوم استفاده کنید، بهترین کار اینه از همش استفاده کنید و به مرور ببینید کدوم منظم تر و بهتره.

مثلا در constructor صفحه داخلی یک فیلد برای پدر (صفحه اولی) در نظر بگیرید و صفحه پدر رو بهش پاس بدید.

ParentClass:


new ChildClass(this);


ChildClass:

private ParentClass parent;
public ChildClass(ParentClass parent){
this.parent=parent;
}

private void aMethod(){
String x=parent.nameTextField;
}


ولی بد نیست الگوی Singleton هم سرچ کنید و اگر کار با داده هاتون زیاد هست از این استفاده کنید.

mhjbarnamenevis
دوشنبه 26 مهر 1395, 03:40 صبح
جناب وحید؛
سلام؛
خیلی متشکرم بابت توضیحات خوبتان. البته بنده زیاد وارد نیستم و برای همین زیاد هم متوجه نشدم.
(بنده مهندس الکترونیک هستم و یکی دو هفته است با جاوا آشنا شده ام و حتی نحوه ی کاربرد همین this ها را هم بلد نیستم!)

==============

این روش یگانه که اشاره کردید را یک مقدار جستجو کردم ولی چون یادگیری اش زمان بر به نظر رسید رهایش کردم.

روش دیگری که خودتان در بالا نوشته اید اگر اشتباه نکنم متغیر ها و فیلد ها را کپی می کند، درست است؟ همین طور نیاز به تعریف متغیرهای ثانوی دارد، درست است؟ (یعنی یک بار باید در کلاس اصلی متغیری تعریف شود و یک بار هم در کلاس دوم و بعد متغیر اصلی در متغیر دوم کپی شود...)

به هر حال فکر کنم با همان روش ساده ی خودم راحت تر باشم.
البته مشکل هست...
مشکل اول: همین کپی کردن (در حالی که می خواهم متغیر اصلی تغییر کند... به این روش بعد از اینکه هر جای برنامه متغیر دوم را تغییر دادم باید یک بار هم متغیر اصلی را در کلاس اول تغییر دهم...)
مشکل دوم: تعریف کردن های متغیر های دوم (و احیانا مقدار دهی های اولیه شان)
مشکل سوم (بدتر از همه) : ناتوانی در استفاده ی راحت از توابع/متد های کلاس اصلی (باید public باشد و متغیر هایش هم انگار باید public static باشد و بعد انتقال دادن متغیرهای public static کلاس دوم به کلاس اول هم خودش می شود یک داستانی... یا اینکه اصلا باید مدل برنامه نویسی ام را عوض کنم و توابع/متد های زیادی ایجاد کنم که هر کدام ورودی ای مشخص می گیرند و خروجی مشخص می دهند... که در این صورت هم باید برنامه ام را عوض کنم و هم نحوه ی برنامه نویسی و در ضمن باز مشکل تا حدی وجود خواهد داشت...)

===============

فکر کنم مشکل اصلی با netbeans است...
در حقیقت کل برنامه ی من باید یک کلاس واحد باشد و روی یک سری متغیر سرتاسری کارهای مشابهی را انجام دهد...
(مثلا من در یک پنجره می خواهم داده های مربوط به بورس را به داخل پایگاه داده ام بارگیری کنم... در پنجره ای دیگر می خواهم داده ها را در فایل های اکسل ذخیره کنم... در پنجره ای دیگر می خواهم داده ها را جستجو کنم و دوباره نتایج را ذخیره کنم... و در پنجره ای دیگر می خواهم رکورد دستی به پایگاه داده ام وارد کنم و در پنجره ای دیگر می خواهم محاسباتی روی نقل و انتقالات بورسی ام انجام دهم و سود و زیانم را نمایش دهم... همه این ها کار واحدی است و یک سری متغیر می خواهد...)
و من که پنجره ی جدید باز می کنم می خواهم در همان کلاس سابق خودم باشم و از متغیرهای عمومی ام استفاده کنم... ولی رابط گرافیکی netbeans به من این اجازه را نمی دهد که فریم/پنجره ی مخفی ای داشته باشم و در جایی از کلاسی که دارد اجرا می شود پنجره ی کنونی را مخفی کنم و پنجره ی مخفی را آشکار کنم.
(فکر کنم این کار با کد نویسی ممکن باشد ولی من با بخش design بلدم کار کنم و کد نویسی داخل فریم برایم خیلی سخت است...)

==============

یک چیز دیگر هم الان به ذهنم رسید که کار ابلهانه و جالبی به نظر می رسد!
اینکه کلا متغیر ها را بگذارم کنار و یک جدول از پایگاه داده ام را برای متغیر ها در نظر بگیرم! (ستون 1 نام متغیر مثلا SQL + ستون 2 مقدار متغیر به عدد اینتیجر مثلا null + ستون سوم رشته ی کاراکتری مثلا "Select * From Table1" + آرایه هم می شود چند ردیف...)
این طوری در همه جای برنامه با دسترسی داشتن به پایگاه داده می توانم آن را بخوانم یا بنویسم...
منتها امتحان کردن این هم زمان بر است... که در حال حاضر نمی توانم... و نیز معلوم نیست این کار راحت تر باشد و نیز معلوم نیست متدها را بتوانم با این روش اجرا کنم.

vahid-p
پنج شنبه 29 مهر 1395, 14:26 عصر
راحتترینش همین الگوی Singleton هست که گفتم. در اصل شما یک کلاس دارید که از تمام کلاس های دیگه به اون دسترسی دارید و در هر پنجره ای خواستید مقدار فیلدهاش رو تغییر بدید و در هر پنجره ای که خواستید مقدار فیلدهاش رو بخونید. این کلاس میشه راه ارتباطی پنجره های مختلف با همدیگه

موفق باشید