PDA

View Full Version : GUI : افزودن لغزاننده به این برنامه !



jlover
شنبه 01 اسفند 1388, 19:31 عصر
درود
دوستان عزیز،کل پکیج برنامه رو ضمیمه میکنم تا با اجراش متوجه عرضم بشید،اما قسمتی ککه من سوال دارم :
در کلاس اجرایی برنامه از یک فریم به عنوان پنجره ی سطح بالا و یک ج پنل به نام main با طرحبندی BorderLayout به عنوان کانتینر اصلی فریم استفاده شده :

public PortrateFrame() {
super("Essi's Portrate !!!");
p = new SelfPortrate();
initControlPanel();
main = new JPanel(new BorderLayout(0,20));
canvas = new Canvas() ;
main.add(canvas,"Center");
main.add(controlPanel,"South");
this.getContentPane().add(new JScrollPane(main));
}

اما خروجی برنامه رفتار مورد انتظار رو در هنگام کوچک شدن پنجره نداره
دقیقن وقتی ارتفاع پنجره کوچیک میشه :
http://myup.ir/images/ofa6wp4ufyhdld4p3on8.png (http://myup.ir/)
البته اگر قدری کوچیکترش کنید،نوارلغزاهای عمودی هم ظاهر میشن،ولی دیگه چیزی تقریبن از پنل canvas (که همون شکل ترسیمی باشه)باقی نمیمونه !
ضمن اینکه گرچه در تصویری که بار کردم،مشخص نیست،اما لغزاننده ی افقی مشکلی نداره
خودم خیلی روش کار کردم،نتونستم ردیفش کنم :افسرده:

با سپاس

ermia2008
شنبه 01 اسفند 1388, 22:38 عصر
سلام دوست عزیز
من جواب سوالتون رو با طرح یه سوال میدم:
چه موقعی یک اسکرول بار باید نمایش داده بشه؟

خوب مسلما وقتی که کانتینر آن قادر به نمایش همه آیتم ها یا کامپوننت ها نباشد!
وقتی که فرمتون رو در جهت افقی تغییر انداره میدید اگه توجه کرده باشید می بینید که کامپپوننت ها اونقدر جابجا میشن و Align خودشون رو تغییر میدن تا اونجایی که دیگه طاقتشن سر میاد و دیگه از این بیشتر نمیتونن جاشون رو تغییر بدن! اینجاست که جناب اسکرول بار تشریفشون رو میارن!
برای حالت vertical هم دقیقا به همین صورته! ولی یه جا احتمالا گول ظاهر فریبندش رو خوردید!
چون داخل پنلی که تصویر هست هیچ کامپوننتی وجود نداره فقط یه canvas هست که اون رو به عنوان یک کامپوننت (مثل کومبوباکسهاتون) در نظر نمیگیره! بنابراین تا حد ماکسیمم خودش کوچیک میشه تا جایی که اونم دیگه نمیتونه از یه حدی کوچیکتر بشه. اونجاست که اسکرول بار عمودی هم سرو کلش پیدا میشه!

امیدوارم خوب توضیح داده باشم
موفق باشید

jlover
شنبه 01 اسفند 1388, 23:11 عصر
دوست عزیز ممنون

اما سوال اینجاست که چه راهکاری میشه براش در نظر گرفت ؟

خود canvas رو هم به عنوان زیرکلاسی از ج پنل تعریف کردم که خب یه کمپوننت در نظر گرفته میشه
به علاوه
لغزاننده برای پنل main که کانتینر دو پنل canvas و controlPanel هست ، در نظر گرفته شده،

چون داخل پنلی که تصویر هست هیچ کامپوننتی وجود نداره
اما داخل پنل main دو تا پنل دیگه داریم و بحث سر اونه !

باز هم ممنون

soheril.server
یک شنبه 02 اسفند 1388, 17:14 عصر
با سلام،
الان حقیقتا" سرم شلوغه!!!!برای همین به جای جواب دادن به سوال شما، صورت سوال را پاک می کنم....یعنی اصلا" شما کاری کنید که کاربر نتواند پنجره تان را Resize بکند !!!!!
آن هم با این تابع انجام می گیرد:

Panel1.setresizable(false);اگر نمی خواهید این طور عمل کنید لطف کنید بگید تا در اسرع وقت مشکلتان را حل نمایم....:لبخندساده:

jlover
یک شنبه 02 اسفند 1388, 19:09 عصر
از شما هم ممنونم
ولی این مورد را هم بنده در نظر داشتم :چشمک: خیلی فوت و فنهای دیگه رو هم امتحان کردم...

نه خیرم

دقیقن طوری که ذکر کردم میخام باشه...

کسی میتونه ! ؟

jlover
دوشنبه 03 اسفند 1388, 23:03 عصر
با اضافه کردن یک خط دستور در متد سازنده،مشکل تا حدود زیادی مرتفع میشه :

canvas.setPreferredSize(new Dimension(600,350));

این هم متد اصلی برنامه :

public static void main(String[] args) {
PortrateFrame f = new PortrateFrame();
f.setVisible(true);
f.setSize(700,580);
f.addWindowListener(new java.awt.event.WindowAdapter() { // Quit the application
public void windowClosing(java.awt.event.WindowEvent e) {
System.exit(0);
}
});
} // main


و نتیجه :

http://tisfoon.net/images/jlh8aa2463sp65denut.png (http://tisfoon.net/)

در این نمونه،مقیاس روی 160 درصد تنظیم شده و میبینید که گوشه های تصویر ترسیم شده از پنل canvas بیرون افتاده و نوار لغزان تنها به خاطر کم کردن ارتفاع پنجره توسط کاربر ( خودم :لبخند: ) ظاهر شده

داره ردیف میشه،اگه کمک کنید ها ... :قلب:

فعلن بدرود

jlover
چهارشنبه 05 اسفند 1388, 02:14 صبح
خب جاواکاران گرامی
از اونجاییکه مطمئنم همه ی شما مشتاقانه و بیصبرانه منتظر بودید تا ببینید کار این برنامه به کجا میکشه و از همه ی کار و زندگیتون دست کشیده بودید و این تاپیک رو زیر نظر گرفته بودید،بیش از این شما دوستان عزیز رو منتظر نمیگذارم و راه حل رو خدمتتون عرض میکنم :
:چشمک:
قطعات اصلاح شده از متد سازنده و متد actionPerformed و متد جدید اضافه شده در کلاس اجرایی برنامه رو اینجا قرار میدم :



// constructor
public PortrateFrame() {
super("Essi's Portrate !!!");
p = new SelfPortrate();
initControlPanel();
main = new JPanel(new BorderLayout(0,20));
canvas = new Canvas() ;
main.add(canvas, "Center");
main.add(controlPanel,"South");
canvas.setPreferredSize(new Dimension(670,385));
this.getContentPane().add(new JScrollPane(main));
}
/*******************************************/
public void actionPerformed(java.awt.event.ActionEvent e) {

int hatColor = hatColors.getSelectedIndex();
int hairColor = hairColors.getSelectedIndex();
int eyeColor = eyeColors.getSelectedIndex();
int shirtColor = shirtColors.getSelectedIndex();
Color hat = decodeSelectedColor(hatColor);
Color hair = decodeSelectedColor(hairColor);
Color eye = decodeSelectedColor(eyeColor);
Color shirt = decodeSelectedColor(shirtColor);
p.setColors(hat, hair, eye, shirt);
double scale = decodeSize(sizes.getSelectedItem());
p.scale(scale);
setAllignment(alligns.getSelectedIndex());

canvas.revalidate();
canvas.repaint();
canvas.setPreferredSize(setCanvasSize(canvas.getPr eferredSize(),scale));

}
/*************متد اضافه شده ی جدید*************/
private Dimension setCanvasSize(Dimension currentDimension, double scale){
Dimension preffered = new Dimension(0,0);
preffered.width = (int)Math.round( currentDimension.width * scale );
preffered.height = 5 + (int)Math.ceil( currentDimension.height * scale );
return preffered ;
}

باشد که این انجمن هر چه بیشتر رشد کند :قلب:

پیروز باشید
اسماعیل