PDA

View Full Version : نمایش یک پنجره به صورت dialog



jeus
جمعه 07 تیر 1387, 21:03 عصر
سلام دوستان من 2 سئوال اینجا دارم
ابتدا اینکه من میخواهم jframe دوم که توسط jframe اول باز میشه مثل یک jdialog باشه و نشه به پنجره jframe اول دسترسی داشت

دوما : اینکه من می خواهم که jdialog را نمایش بدم باید چه کنم ؟

saeedIRHA
شنبه 08 تیر 1387, 01:12 صبح
اگر خود کلمه Dialog رو در همين تالار Search ميکردی به این جوب ميرسيدی:
http://barnamenevis.org/forum/showthread.php?t=66818&highlight=dialog

javaphantom
شنبه 08 تیر 1387, 02:38 صبح
سلام دوستان من 2 سئوال اینجا دارم
ابتدا اینکه من میخواهم jframe دوم که توسط jframe اول باز میشه مثل یک jdialog باشه و نشه به پنجره jframe اول دسترسی داشت

دوما : اینکه من می خواهم که jdialog را نمایش بدم باید چه کنم ؟

تو روش اول اینکه وقتی یک object از طرف یک object دیگه صدا زده می شه، اونی که صدا زده شده یا همان new گرفته شده قابل دسترس از طرف کلاس اولی هست ولی برعکس نمی شه.
راه حل
Composite Pattern.
مثال: درFirstFrame می آییم SecondFrame را new می کنیم یا همان صدا می کنیم و از طریق SecondFrame رنگ پشت زمینه FirstFrame را عوض می کنیم.
کد.

import javax.swing.*;

public class FirstFrame extends JFrame {

private JPanel jPanel1;

public FirstFrame() {
this.jPanel1 = new JPanel();
this.setBounds(new java.awt.Rectangle(300,300));
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setTitle("First Frame");
this.getContentPane().add(jPanel1);
this.setVisible(true);
// pass the first to second with "this"
new SecondFrame(this);
}

public void setPanelColor(java.awt.Color c) {
this.jPanel1.setBackground(c);
}

public static void main(String[] s) {
new FirstFrame();

}
}


import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class SecondFrame extends JFrame {

private FirstFrame fsf;
private JButton jButton1;
private JButton jButton2;

// look at the constructor argument
public SecondFrame(Object obj) {
// here i've got the FirstFrame
fsf = (FirstFrame) obj; // cast obj to FirstFrame
this.jButton1 = new JButton("Red");
this.jButton2 = new JButton("Blue");


// your answer is here
this.jButton1.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
doRed(fsf);
}
});

// your answer is here
this.jButton2.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
doBlue(fsf);
}
});


this.setLayout(new java.awt.FlowLayout());
this.setBounds(new java.awt.Rectangle(300,300));
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setTitle("Second Frame");
this.getContentPane().add(this.jButton1);
this.getContentPane().add(this.jButton2);

this.setVisible(true);
}

// this method is very important for you
// I use fsf
private void doRed(FirstFrame obj) {
obj.setPanelColor(Color.RED);
}

// this method is very important for you
// I use fsf
private void doBlue(FirstFrame obj) {
obj.setPanelColor(Color.BLUE);
}

}

اما برای قسمت سوال دوم می خوای چه dialog داشته باشی برای فایل.
می خوای مثلا یک فایل انتخاب کنی برای مثال یک فایل jpeg بعد بندازیش توی صفحه نشونش بده آره؟

jeus
شنبه 08 تیر 1387, 08:18 صبح
قربون هر دوتون برم که منظور منو نفهمیدید
عزیزان من منظورم از دسترسی اینه که پنجره دوم وقتی رو قرار میگیره تا وقتی بسته نشده به پنجره اول دسترسی نداشته باشیم و مثل این باشه که یک fileChoser یا یک dialog یگه از این قبیل را انتخاب میکنیم من قبلا jdialog ام را ساختم و در نمایش دادنش هم مشکل ندارم اما میخواهم وقتی باز میشه پنجره پشتیش غیر فعال بشه و من توی این کار مشکل دارم یعنی از دستور

this.enable(false)
استفاده کردم اما نمیدونم وقتی میبندمش چگونه باید دوباره به حالت اولش برش گردونم و enable را دوباره true کنم ؟

saeedIRHA
شنبه 08 تیر 1387, 16:05 عصر
منظورت اینکه Frame غير فعال بشه يا منتظر فرمان پنجره Dialog بمونه؟؟
اگر می خوای منتظر بمونه که به پست قبلی روجوع کن در غير این صورت;
اگر ميخوای که پنجره اصليت ديده نشه از این کد استفاده کن
(myFrame.setVisible(false
و اگر ميخوی دوباره پنجرت بعد از Dialog ظاهر بشه از کلاس Dialog این تابع رو صدا کن
(myFrame.setVisible(true

mazdadoost
یک شنبه 09 تیر 1387, 12:38 عصر
سلام به همه دوستان:
دوست عزیز rahman_ramin اگر فایل های سوررس رو بذارید بهتر میتونم کمکتون کنم.

kobari
دوشنبه 10 تیر 1387, 13:41 عصر
با سلام
اگر درست متوجه شده باشم شما نیاز به یک JFrame دارید که در زمان فعال شدنش جلوی تمام فعل و انفعال کاربر با بقیه پروگرام را بگیرد و تنها این JFrame باشد که بعنوان رابط با کاربر عمل کند. این JFrame ها در واقع JDialog هایی هستند که اصطلاحآ به آنها Modal JDialog می گویند و یکی از کاربردهای اصلی آنها اینست که جلوی ساختن instance های پشت سرهم از یک آبژکت را بگیرند مثلا اگر کاربر مرتب روی دکمه ای که یک پنجره را باز میکند، کلیک کند فقط یک بار آن پنجره باز شود . یک روش برای ساختن این JDialog بشکل زیر است: متاسفانه نمی تونم کد نمونه را با فرمت صحیح در ویرایشگر وارد کنم و همه چی جابجا میشه !

mazdadoost
دوشنبه 10 تیر 1387, 16:51 عصر
با سلام
اگر درست متوجه شده باشم شما نیاز به یک JFrame دارید که در زمان فعال شدنش جلوی تمام فعل و انفعال کاربر با بقیه پروگرام را بگیرد و تنها این JFrame باشد که بعنوان رابط با کاربر عمل کند. این JFrame ها در واقع JDialog هایی هستند که اصطلاحآ به آنها Modal JDialog می گویند و یکی از کاربردهای اصلی آنها اینست که جلوی ساختن instance های پشت سرهم از یک آبژکت را بگیرند مثلا اگر کاربر مرتب روی دکمه ای که یک پنجره را باز میکند، کلیک کند فقط یک بار آن پنجره باز شود . یک روش برای ساختن این JDialog بشکل زیر است: متاسفانه نمی تونم کد نمونه را با فرمت صحیح در ویرایشگر وارد کنم و همه چی جابجا میشه !

دوست عزیز :
متاسفانه به دلایل فنی تمام کلاس هایی که از کلاس Dialog در بسته AWT به ارث میبرند مثل JDialog مگر در مواردی که به شکل مشترک از Component-JComponent-Window و JWindow
با کلاس های منشعب شده از Frame و زیر کلاس های Swing ش مثل JFrame دارند هیچ غرابت دیگه ندارند.این باعث میشه ما نتونیم از یه خاصیت ویژه که فرمودین و مختص کلاس Dialog (Modal)و زیر کلاس هاش در کلاس Frame و زیر کلاس هاش استفاده کنی.این ها به دلیل موارد ی هست که در Peer های AWT هست و اینکه مثلا کلاس Dialog از نوعی API سیستمی متفاوت نسبت به Frame در ایجاد پنجره ها استفاده میکنه.برای مثال اینکه دیالوگ های Native در ویندوز تمام پنجره های زیر خودشون رو غیر فعال میکنند و کلیک در هر جای برنتمه به جز دیالوگ باعث چشمک زدن پنجره دیلوگ میشه!
پس به شکل خلاصه ما JFrame از نوع Modal رو نمیتونیم در API داشته باشیم (البته با اطلاعات کنونی من.ممنون میشم اگر زحمتی نیست و روشی برای ساخت JFraeme های مودال با API ذاتی جاوا دارید بذارید.اگر نیتونید کد رو تو تاپیک بذارید میشه سورسش رو بذارید تا دانلود کنم.):تشویق:مگر اینکه رفتاری رو که گفتم در سیستم های مختلف بر اساس استاندارد های خود OS شبیه سازی کنیم.فکر خوبیه.اما اینو میطلبه که تمام منطق Modal کردن رو خودمون به عهده بگیریم.
یه راه نسبتا ارجحتر ایجاد یه JDialog سفارشی یا انشعاب دادن از کلاس Dialog یا JDialog هست.

jeus
سه شنبه 11 تیر 1387, 09:09 صبح
دوست عزیز من arta من موفق شدم که این کار را انجام بدم و فقط می بایستم توی constructor دیالوگ یک قسمت به عنوان java.awt.Frame parent بگیرم و اونو توی super ست کنم همین
ازت هم خیلی ممنونم

kobari
چهارشنبه 12 تیر 1387, 09:11 صبح
.ممنون میشم اگر زحمتی نیست و روشی برای ساخت JFraeme های مودال با API ذاتی جاوا دارید بذارید.اگر نیتونید کد رو تو تاپیک بذارید میشه سورسش رو بذارید تا دانلود کنم.
سلام
روشی که من ازش استفاده میکنم را در فایل ضمیمه نگاه کنید و لطفا اگر ایرادی به آن وارد است توضیح دهید. یکی میتونه بگه چطوری توی این ویرایشگر میشه درست کد نویسی کرد!

mazdadoost
چهارشنبه 12 تیر 1387, 09:40 صبح
دوست عزیز :
kobari با اجازتون متن کد فایل ModalFrame.java رو در تاپیک می ذارم.(در صورتی که موافق نباشید پاک میکنم)برای گذاشتن کد هاتون در پست روی دکمه # در بالای ادیتور کلیک کنید و متن کد رو بین تگ های درج شده بذارید.
سورس کد متعلق به :kobari:



import javax.swing.*;

public class ModalFrame extends javax.swing.JFrame {

private ModalFrameDialog mfd;

public ModalFrame() {

mfd = new ModalFrameDialog(this);
}

public class ModalFrameDialog extends javax.swing.JDialog {
public ModalFrameDialog(JFrame frame) {
super(frame,true);

setTitle("Modal Frame");
setLayout(new java.awt.BorderLayout());
add(new JLabel("Label 1 "), java.awt.BorderLayout.NORTH);
add(new JLabel("Label 2 "), java.awt.BorderLayout.CENTER);
add(new JLabel("Label 3 "), java.awt.BorderLayout.SOUTH);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent wEvt) {
disposeWindow();
}});
setSize(new java.awt.Dimension(200,400));


}
}


public void display() {
mfd.setVisible(true);
}

private void disposeWindow() {
mfd.dispose();
}
}


باید عرض کنم همونطور که گفتم در کد شما هم در Inner Class در واقع از وراثت از کلاس JDialog برای ساختن یه پنجره مودال استفاده شده(حتی خاصیت Modal برای JDialog True ست شده super(frame,true);!)

و چون والد این دیالوگ به JFrame ست شده این دیالوگ در Quie مربوط به JFrame والدش اجرا میشه و در واقع روش قرار میگیره.مسئله اینه که ما باز هم برای مدال کردن پنجره از JDialog استفاده کردیم و نه JFrame و میشد این وراثت از کلاس JDialog رو مستقیما بدون نیاز به کلاس JFrame انجام داد!و به جای این Jframe دومی پارنت رو برای JDialog همون SimpleFrame فراخوان کننده mf قرار بدیم!
سوال من : راهی برای Modal کردن خود JFrame ها در API دارید؟
ممنون از توجهتون.
موفق باشید.

kobari
چهارشنبه 12 تیر 1387, 11:20 صبح
سالام
همانطور که گفتید چون JFrame ها ذاتآ داری قابلیت modal کردن نیستند باید با کد نویسی این قابلیت را به آن بخشید و من قبلا خیلی گشتم تا راهی برای آنها پیدا کنم ولی هنوز روش قابل قبولی برای اینکار بدست نیاوردم. با تشکر از راهنمایی تان این علامت # را که گفتید تست کردم ولی تمام آکولادها باز هم جابجا میشوند.