انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: parsibox در 24 مهر 1388، 08:49 بظ
-
سلام.
برنامه نویسان جاوا :
دوستان کسی میتونه یکgui برای من طراحی کنه؟یا راهنماییم کنه که چیکار کنم؟
تصویری از قالبی که میخوام طراحی کردم .
اول تصویر را ببینید و بعد توضیحاتش را بخونید.
(http://mohsendavari.com/base.jpg)
قالب ۳ قسمت داره که با شماره روی تصویر مشخص شده.
کل قالب در ابعاد ۷۰۰ ( طول ) و ۵۰۰ ( ارتفاع ) باشد.
قسمت ۱ ==> باید به گونه ای باشه که یک سری دکمه به همراه آیکن هاشون در اینجا قرار بگیره.لازم هست که به صورت عمودی اسکرول بخوره چون تعداد دکمه ها زیاد هستند.
قسمت ۲ ==> یک سروی دکمه کنار هم در این قسمت قرار میگیره.در واقع اینجا زیر منوها قرار میگرند و باید بگونه ای باشند که بشه با کلیک کردن روی دکمه های قسمت ۱ این زیر منو ها را تغییر داد.
قسمت ۳ ==> این قسمت محتوای اصلی قسمت های برنامه را نشون میده و باید به صورت عمودی و افقی اسکرول بخورد.محتوای این قسمت با کلیک بر روی دیکمه های قسمت ۲ باید تغییر بکنند.
====
این توضیحات کلی کار من بود.
کسی می تونه راهنماییم کنه؟
خودم میتونم یک سری از کارهای داخلی را انجام بدم ولی کلیات طرح که برنامه را به ۳ قسمت تقسیم کنم را بلد نیستم.
دوستان راهنمایی میکنید؟
-
سلام
خوب اول بگو كه خودت چقدر ميدونی تا واسه بقيهش راهنماييت كنيم.
در كل طراحی gui رو با كد زدن بلدی؟
با توليد و كنترل event ها آشنايي داري؟
ميتونی از layout ها در ساخت پنل ها استفاده كنی؟
اگه كار با layout رو بلدی ميتونی با تركيب چند نوع از اونا قالبی كه ميخوای رو بسازی (با دوتا borderlayout يا يه borderlayout و يه gridlayout يا ...)
-
من اکشن ها را بلدم و به صورت جدا هم بلدم یه کد بنویسم که مثلا یه فریم باشه یا اسکرول بخوره ولی نمیتونم اینا را کنار هم بزارم
یه نمونه که بزاری ۳ قسمت اصلی را داشته باشه من بش ور میرم بقیشا درست میکنم.
فقط جوری باید بیسش نوشته بشه که بشه این تغییراتی که نوشتم را داخلش اجرا کرد.
-
یعنی همه چیزش فانکشن بندی باید باشه که بتونم خودم بهش حالت های مختلف اضافه کنم.
مثلا یه فانکشن باشه برای قسمت شماره ی ۱ و یه فانکش هم برای قسمت شماره ی ۲ و یه فانکش هم برای قسمت شماره ی ۳
فقط این فانکشن ها یه جوری باشند که مثلا یک متغیر ورودی بگیرند و با توجه به اون ورودی محتویات هر قسمت را نمایش بدن مثلا functionyek ( int login ) که من یه بار login را برابر ۱ بزارم و یه محتوا را نشون بده و وقتی login را برابر ۲ گذاشتم یه محتوای دیگه را جایگزین محتوای قبلی بکنه.
من خودم میتونم توی فانکشن های هر قسمت دستکاری کنم.
-
سلام دوست عزیز
فکر کنم اگه کار با layout ها رو یاد بگیری مشکلت حل بشه.
یه layout نحوه آرایش و قرار گرفتن اجزای گرافیکی رو توی یه پنل مشخص میکنه.
چند نوع layout از پیش تعریف شده در کلاسهای جاوا هست که میتونی اینجا (http://java.sun.com/docs/books/tutorial/uiswing/layout/visual.html) ببینیشون.
مثلا borderlayout این شکلیه:
(http://www.freeimagehosting.net/uploads/abbdf2bc8a.gif) (http://www.freeimagehosting.net/)
اگه یه شیئی از نوع Panel یا Container داشته باشی میتونی با دستور setlayout نوع آرایش اجزا رو تعریف کنی:
JFrame myFrame = new JFrame("BorderLayout Test");
Container myPane = myFrame.getContentPane();
myPane.setLayout(new BorderLayout());
حالا کافیه موقع اضافه کردن هر عنصر موقعیتش رو هم تعیین کنی:
myPane.add(new JButton("North"), BorderLayout.NORTH);
myPane.add(new JButton("South"), BorderLayout.SOUTH);
myPane.add(new JPanel(), BorderLayout.EAST);
برای قالبی که میخوای هم میتونی دوتا پنل رو اینجوری با هم ترکیب کنی:
Panel outer = new JPanel();
outer.setLayout(new BorderLayout());
outer.add(panel1, BorderLayout.EAST);
Panel inner = new JPanel();
inner.setLayout(new BorderLayout());
outer.add(inner, BorderLayout.CENTER);
inner.add(panel2, BorderLayout.NORTH);
inner.add(panel3, BorderLayout.CENTER);
-
سلام
ممنون از کمکت.
کلیات موضوع را متوجه شدم و خودم ۳ ساعتی روش وقت گذاشتم و یه چیزی در آوردم.
ولی چندتا مشکل اساسی داره.
توی اون قسمت سفید رنگ میخوام اگه محتویات زیاد بود اسکرول بخوره ولی هرکاری کردم نشد.
وقتی پنل splitpanel را به سمت راست میبرم محتویات وسط کش نمیاد .یعنی پنل جابه جا میشه ولی اندازش مثل قبل هست.
میتونی از موارد را هم کمک کنی؟
اینم کدی که نوشتم.
اگه کدی که نوشتم مشکل داره بنویس.این اولین کدی هست که از اول خودم نوشتم.
package ghaleb;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
public class Main {
public static int program_w = 700;
public static int program_h = 700;
public static int right_f_w = 150;
public static int center_f_w =( program_w -right_f_w ) ;
public static int center_top_f_h =70 ;
public static int center_main_f_h =( program_h -center_top_f_h ) ;
public static void addComponentsToPane(Container pane) {
JPanel menu_rast = new JPanel();
menu_rast.setPreferredSize(new Dimension(right_f_w,program_h));
menu_rast.setBackground(Color.blue);
JPanel menu_bala = new JPanel();
menu_bala.setPreferredSize(new Dimension(center_f_w, center_top_f_h ) );
menu_bala.setBackground(Color.green);
JPanel menu_vasat = new JPanel();
menu_vasat.setPreferredSize(new Dimension(center_f_w, center_main_f_h-50));
menu_vasat.setBackground(Color.white);
JScrollPane scroller = new JScrollPane();
scroller.getViewport().add(menu_vasat);
JSplitPane splitPane_vasat = new JSplitPane(JSplitPane.VERTICAL_SPLIT, menu_bala , menu_vasat );
splitPane_vasat.setOneTouchExpandable(true);
splitPane_vasat.setDividerLocation(center_top_f_h);
JPanel vasat = new JPanel();
vasat.add(splitPane_vasat);
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, vasat , menu_rast);
splitPane.setOneTouchExpandable(true);
splitPane.setDividerLocation(center_f_w);
pane.add(splitPane);
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("Main");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addComponentsToPane(frame.getContentPane());
frame.pack();
frame.setSize(program_w, program_h);
frame.setVisible(true);
}
public static void main(String[] args) {
createAndShowGUI();
}
}
-
راه سادهای برای اینکه scroll بخوره اینه که از یه JScrollPane استفاده کنی.
یعنی پنلی رو که ساختی به تابع سازنده یه JScrollPane بدی و بعد اون JScrollPane رو به splitpanel اضافه کنی.
این دو تا لینک راجع به JScrollPane هستن:
لینک اول (http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JScrollPane.html#constructor_summary)
لینک دوم (http://java.sun.com/docs/books/tutorial/uiswing/components/scrollpane.html)
برای درست شدن splitpanel هم دقیقا نمیدونم ولی میتونی frame.pack یا توابع setPreferredSize پنلها رو برداری شاید درست شه.
راستی چرا کل برنامه رو بصورت static پیادهسازی کردی؟ اگه خود کلاس رو از JFrame مشتق بگیری و از اون استفاده کنی یه خورده راحتتره:
۱. کلاس رو از JFrame مشتق بگیر.
۲. تابع createAndShowGUI رو توی تابع سازنده کلاس فراخوانی کن.
۳. توی تابع main هم یه شیئی جدید از نوع کلاس خودت بساز. مثلا بنویس:
new Main();
۴. برای متغیرها و توابع (به غیر از main) کلمه static رو حذف کن.
-
سلام
ببین الان اینجوریش کردم خوب شده؟
package ghaleb;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
public class Main {
public static JPanel menu_rast;
public static JPanel menu_vasat;
public static JPanel menu_bala;
public static Font font_10 = new Font("tahoma" , Font.PLAIN ,10);
public static void addComponentsToPane(Container pane) {
program_config program_config = new program_config();
menu_rast = new JPanel();
menu_rast.setPreferredSize(new Dimension(program_config.right_f_w,program_config.program_h));
menu_rast.setBackground(Color.blue);
menu_bala = new JPanel();
menu_bala.setPreferredSize(new Dimension(program_config.center_f_w, program_config.center_top_f_h ) );
menu_bala.setBackground(Color.green);
menu_vasat = new JPanel();
menu_vasat.setBackground(Color.white);
JScrollPane scroller = new JScrollPane(menu_vasat);
scroller.setPreferredSize(new Dimension(program_config.center_f_w-20, program_config.center_main_f_h));
JSplitPane splitPane_vasat = new JSplitPane(JSplitPane.VERTICAL_SPLIT, menu_bala , scroller );
splitPane_vasat.setOneTouchExpandable(true);
splitPane_vasat.setDividerLocation(program_config.center_top_f_h);
splitPane_vasat.setContinuousLayout(true);
JPanel vasat = new JPanel();
vasat.add(splitPane_vasat);
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, vasat , menu_rast);
splitPane.setOneTouchExpandable(true);
splitPane.setDividerLocation(program_config.center_f_w);
splitPane.setContinuousLayout(true);
new create_menu_rast();
pane.add(splitPane);
}
public static void main(String[] args) {
JFrame frame = new JFrame("Main");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addComponentsToPane(frame.getContentPane());
program_config program_config = new program_config();
frame.setSize(program_config.program_w, program_config.program_h);
frame.setVisible(true);
}
public static ImageIcon createImageIcon(String path, String description) {
java.net.URL imgURL = Main.class.getResource(path);
if (imgURL != null) {
return new ImageIcon(imgURL, description);
} else {
System.err.println("Couldn't find file: " + path);
return null;
}
}
}
-
یه مشکلی پیدا کردم.
میخوام روی دکمه های اکشن تعریف کنم و وقتی هر دکمه را صدا زد اتوماتیک یه کلاسی را خودش صدا بزنه و اجراش کنه.
میشه اینکار رو کرد؟
مثلا ۲ تا دکمه دارم: ۱- لیست کردن ۲- فرم جدید
وقتی روی لیست کردن کلیک کرد به صورت اتوماتیک کلاس my_list اجرا بشه و اگه روی فرم جدید کلیک کرد به صورت اتوماتیک کلاس my_form اجرا بشه.
-
یه مشکلی پیدا کردم.
میخوام روی دکمه های اکشن تعریف کنم و وقتی هر دکمه را صدا زد اتوماتیک یه کلاسی را خودش صدا بزنه و اجراش کنه.
میشه اینکار رو کرد؟
مثلا ۲ تا دکمه دارم: ۱- لیست کردن ۲- فرم جدید
وقتی روی لیست کردن کلیک کرد به صورت اتوماتیک کلاس my_list اجرا بشه و اگه روی فرم جدید کلیک کرد به صورت اتوماتیک کلاس my_form اجرا بشه.
منظورتون از «اجرا شدن کلاس» چیه؟! یعنی یه نمونه از کلاس برداره؟
-
دقیقا که توضیح دادم.
مثلا ۲ تا دکمه دارم: ۱- لیست کردن ۲- فرم جدید
وقتی روی لیست کردن کلیک کرد به صورت اتوماتیک کلاس my_list اجرا بشه و اگه روی فرم جدید کلیک کرد به صورت اتوماتیک کلاس my_form اجرا بشه.
کد زیر را ببین.این مربوط میشه به jtab روی هر تب که کلیک میشه راحت میشه تعریف کرد که چه کلاسی اجرا بشه.که در اینجا کلاس TabList اجرا میشه.
jtp.addTab("محصولات",new TabList());