PDA

View Full Version : سوال: دسترسی به کامپوننت در فرم دیگر



behnam.m
جمعه 04 آذر 1390, 17:46 عصر
سلام
چطور باید از یک کلاس یا از یک jframe به کامپوننت های jframe دیگر دسترسی داشت ؟ (با netbeans کار می کنم)

ممنون میشم کمکم کنید .......

spiderman200700
جمعه 04 آذر 1390, 19:53 عصر
فرض کن اسم JFrameب frame باشه.
داخل کلاسی که میخوای از frame استفاده کنی،باید این دستور رو بنویسی.

frame fr=new frame();
fr.setSize(800,600);

از طریق fr به تمام کامپوننت ها و متغییر های frame دسرسی خواهید داشت.
موفق باشید.

hosein.zare
جمعه 04 آذر 1390, 21:03 عصر
اگر چند JFrame داری و می خواهی JFrame همسایه (:چشمک:) را دستکاری کنی JFrame را public static تعریف کن. اشکالی ندارد

behnam.m
یک شنبه 06 آذر 1390, 12:45 عصر
اگر چند JFrame داری و می خواهی JFrame همسایه (:چشمک:) را دستکاری کنی JFrame را public static تعریف کن. اشکالی ندارد

ممنون از راهنمایتون ولی میشه یه خورده دقیق بگید کجا باید public static کنم من با netbeans کار می کنم

hosein.zare
یک شنبه 06 آذر 1390, 14:44 عصر
بهنام من چون با نت بینز کار نمیکنم اگه می تونی یه تیکه کدت را که با JFrame کار میکنی بذار را بهت بگم.(چون هر IDE یه روشی برای Initialize کردن Component ها داره)

behnam.m
یک شنبه 06 آذر 1390, 19:53 عصر
بهنام من چون با نت بینز کار نمیکنم اگه می تونی یه تیکه کدت را که با JFrame کار میکنی بذار را بهت بگم.(چون هر IDE یه روشی برای Initialize کردن Component ها داره)

از اونجایی که من jFrame به صورتی ویژوالی ایجاد کردم نمی دومم کدهای آن کجاست وگرنه خودم public static می کردم

spiderman200700 (http://barnamenevis.org/member.php?133001-spiderman200700) روشی که شما گفتید نتونستم عملی کنم یعنی تابع component نمی دونم چطوری باهش کار کنم اگه یه مثال بزنید خیلی خوب میشه بازم ممنون از کمکی کردید

ashkanksh
یک شنبه 06 آذر 1390, 21:14 عصر
از متد های setter و getter برای اون کامپوننت استفاده کن و اگر اون جایی که میخوای بهش دسترسی پیدا کنی تو یک پروژه هستند public تعریف کن متد هات رو! که البته دیفالت جاوا public هست.

اگر هم توی یک پروژکت نیست اول باید کامپوننت رو ادد کنی بعد باز هم از همین متد ها استفاده کنی

spiderman200700
یک شنبه 06 آذر 1390, 22:27 عصر
مهم نیست که با چه روشی JFrame ساختید.
فقط کافیه اسمشو بدونید.
اسم تمام کامپوننت ها رو در قسمت inspector که در قسمت پایین و سمت چپ NetBeans قرار داره،میتونی ببینی.
فرض کن یه JFrame ساختی که اسمش Tdform باشه و روش یه JButton و یه JTextField قرار داره.(شما الآن میدونی که اسم JFrameت Tdform هست)
خوب،فرضا میخوای توی یه JFrame دیگه یا هر کلاس دیگه ای، از Tdform استفاده کنی.مثلا میخوای توی یه JFrame که اسمش Testform هست، داخل JTextField موجود بر روی Tdform ،که اسمش tf هست،یه نوشته set کنی.
داخل Testform یه تابع تعریف میکنی که کدهای استفاده از Tdform رو داخلش مینویسی.اینجوری:

public void calltdform(){
Tdform form=new Tdform();//ساختن یه نمونه از کلاس Tdform
form.setSize(800, 600); // سایزش رو ست میکنیم
form.setVisible(true);// form نمایش
form.tx.setText(" test text");// ست کردن متن در تکست فیلد موجود در Tdform
}

حالا هر وقت ، هرجای Testform ،تابع calltdform رو صدا کنی ،یه نمونه از Testform واست میسازه،یعنی یه پنجره جدید باز میشه.این یعنی شما از JFrame دیگه یه JFrame دیگه رو نمایش دادی و خواص اجزای اونو تغییر دادی.
به همین طریق میتونی به سایر اجزای Tdform دسترسی داشته باشی.
اگه بازم نکته ی مبهمی وجود داره بگو.

ashkanksh
دوشنبه 07 آذر 1390, 06:12 صبح
دوست من این روش به هر حال یه بار اضافست روی برنامه! فرضا اگر بخوایم یه پنجره ی جدید باز شه! آره!
که این کار اصلا کار درستی نیست! نه فقط توی جاوا، کلا با هر زبانی!

یه موقع هست شما برنامتون چند تا فریم داره! بعد در هر لحظه فقط میخوای یکیش بسته باشه! توی یکی از تکست باکس هایی که در فریمی که الان داره نمایش میده، میخوای متنی که یوزر در تکست باکس فریم قبلی(که الان نشونش نمیدی) رو نمایش بدی. اون موقع چی!

شاید الان بگی خب خاصیت visible رو false میکنیم! راه خوبیه اما واسه کسی که قراره یه برنامه ی خیلی خوب بنویسه زیاد هم خوب نیست! چون یه thread حداقل اضافه میشه و کمی هم سرعت لود شدن رو میاره پایین، که محسوس نیست.

راه زیاده! اما این که بیایم واسه همین تکست باکسی که گفتم یه متد getter بذاریم و متن وارد شده توسط یوزر رو بخونیم و پاس بدیم به نظر من بهتر از هر راهی هست که البته چند راه دیگه هم ممکنه باشه

spiderman200700
دوشنبه 07 آذر 1390, 14:38 عصر
ما وقتی میتونیم از کامپوننت های یه Frame استفاده کنیم که یه نمونه ی واقعی از کلاس اون فریم بسازیم.حالا چه visible رو true کنیم چه نکنیم ، با ایجاد یه نمونه ی واقعی از کلاس JFrame ، یه thread اضافه میشه.
شما حتی اگه یه getter هم بذاری ، بازم باید یه نمونه از کلاس JFrame بسازی که در بازم یه thread ساخته میشه.پس در عمل هیچ فرقی نداره.
اگه دارم اشتباه میکنم، شما با یه مثال حرفی که زدی رو بیشتر توضیح بده.

hosein.zare
دوشنبه 07 آذر 1390, 14:59 عصر
دوستان تمامی صحبت ها را قبول دارم . مثلا روشی که من گفتم به الگوی طراحی Singleton معروفه و برنامه را مجبور میکنه از یک کلاس (که شما تعیین کردی) فقط و فقط یک بار Object ساخته بشه .
فرض کنید دو کلاس Fram دارم : Frame1 و Frame2

package client;

import java.awt.Dimension;

import java.awt.Rectangle;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Frame1 extends JFrame {
private JPanel jPanel1 = new JPanel();
private JLabel jLabel1 = new JLabel();
private JButton jButton1 = new JButton();

/////////////////////////
private static Frame1 me;

public static Frame1 getFrame(){
if(me==null)
me = new Frame1();
return me;
}

private Frame1() {
try {
jbInit();
} catch (Exception e) {
e.printStackTrace();
}
}

private void jbInit() throws Exception {
this.getContentPane().setLayout( null );
this.setSize( new Dimension(400, 300) );
jPanel1.setBounds(new Rectangle(0, 0, 400, 280));
jLabel1.setText("Label 1");
jButton1.setText("Go Page 2");
jButton1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jButton1_actionPerformed(e);
}
});
jPanel1.add(jLabel1, null);
jPanel1.add(jButton1, null);
this.getContentPane().add(jPanel1, null);
}

private void jButton1_actionPerformed(ActionEvent e) {
Frame2 frame2 = Frame2.getFrame();
frame2 .setTitle("FRAME 2");
frame2.setVisible(true);
dispose();
}

public static void main(String[] args) {
Frame1.getFrame().setVisible(true);
}
}



وقتی Frame2 را خواستی بگیری مطمین هستی که همیشه یک Object واحد برمیگردانید و هیچوقت دوبار New نمیشود:

package client;

import java.awt.Dimension;

import java.awt.Rectangle;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Frame2 extends JFrame {
private JPanel jPanel2 = new JPanel();
private JLabel jLabel1 = new JLabel();

private static Frame2 me;
private JButton jButton1 = new JButton();

public static Frame2 getFrame(){
if(me==null)
me = new Frame2();
return me;
}
private Frame2() {
try {
jbInit();
} catch (Exception e) {
e.printStackTrace();
}
}

private void jbInit() throws Exception {
this.getContentPane().setLayout( null );
this.setSize( new Dimension(400, 300) );
jPanel2.setBounds(new Rectangle(0, 0, 400, 280));
jLabel1.setText("LABEL FRAME 2");
jButton1.setText("Go Page 1");
jButton1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jButton1_actionPerformed(e);
}
});
jPanel2.add(jLabel1, null);
jPanel2.add(jButton1, null);
this.getContentPane().add(jPanel2, null);
}

private void jButton1_actionPerformed(ActionEvent e) {
Frame1.getFrame().setVisible(true);
Frame1.getFrame() .setTitle("FRAME 1");
dispose();
}
}

spiderman200700
دوشنبه 07 آذر 1390, 17:51 عصر
درسته.در برنامه هایی که ممکنه یک فریم چند بار باز بشه، این بهترین راهه.

ashkanksh
دوشنبه 07 آذر 1390, 17:59 عصر
دقیقا چیز هایی که حسین جان گفت درسته! اما ببین سوال خیلی کلی پرسیده شده.

اول جواب اسپایدر من! درسته که یک ترد دیگه ایجاد میکنه. اما منظور من این بود که دسترسی به ی کامپوننت تو یک فرم دیگه زمانی مطرح میشه که شما بخوای ی سری ویژگی ها و اطلاعات رو از اون کامپوننت بگیری و استفاده کنی.

چیزی که شما گفتی به درد زمانی میخوره که ما بخوایم بعد از رفتن از این فرم به فرم بعدی یه سری چیزی از فرم یک براش بفرستیم.

به نظرم جواب حسین خان کامل و واضح هست. ولی ی راه دیگه هم هست که البته اون زیاد کاربرد نداره توی یک کامپوننت. اگر بخوایم به مجموعه ای از کامپوننت ها دسترسی داشته باشیم. میتونیم یک کامپوننت خودمون بسازیم و بعد با اضافه کردنش و غیر فعال کردنش از متد های ست و گت یک سری اطلاعات و ویژگی ها باهاشون رد و بدل کنیم.

beginner_1395
چهارشنبه 30 تیر 1395, 02:52 صبح
حل شد
ممنونم