PDA

View Full Version : ایجاد یک کلاس برای Statusbar



oracle_2007
یک شنبه 13 خرداد 1386, 11:14 صبح
سلام. من یه کلاس برای statusbar نوشتم که کار میکنه ولی به نظرم یه مشکلی داره . چونکه وقتی که از فرم اصلی بهش پارامتر میدم هنوز اون پارامتر ها رو خالی نشون میده . من سورس این کلاس رو میذارم اینجا تا هم کاملترش کنیم و هم مشکل من حل بشه ( من یه تازه کارم ها ، ازش کم ایراد بگیرید. )

سورس کلاس :

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Cstatusbar extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
private JLabel lbl_username= null;
private JLabel lbltimedate = null;
private JLabel lblpersiandate= null;
private String strpersiandate= null;
private String stractiveuser= null;
private String strsystemdatetime= null;
private Cstatusbar Cstatusbar;

public Cstatusbar() {
super();
super.setPreferredSize(new Dimension(100, 25));
super.setLayout(new BorderLayout());
super.setComponentOrientation(java.awt.ComponentOr ientation.RIGHT_TO_LEFT);

getStatuspanel();
}

/* public void setParameters(String persianDate,String ActiveUser,String SystemDatetime) {
strpersiandate = persianDate;
stractiveuser =ActiveUser ;
strsystemdatetime = SystemDatetime;
}*/
public void setusername(String username){
stractiveuser =username ;
}
private String getusername() {
return stractiveuser;
}
public void setPersianDate(String PersianDate){
strpersiandate =PersianDate ;
}
private String getPersianDate() {
return strpersiandate;
}

public void setSystemDateTime(String SystemDateTime){
strsystemdatetime = SystemDateTime ;
}
private String getsystemdatetime() {
return strsystemdatetime;
}
private Cstatusbar getStatuspanel() {

lblpersiandate = new JLabel();
lblpersiandate.setText(" امروز :" + this.getPersianDate());
lblpersiandate.setFont(new java.awt.Font("Tahoma", java.awt.Font.PLAIN, 13));
lblpersiandate.setMaximumSize(new java.awt.Dimension(400,16));
lblpersiandate.setPreferredSize(new java.awt.Dimension(400,16));
lblpersiandate.setBorder(javax.swing.BorderFactory .createEtchedBorder(javax.swing.border.EtchedBorde r.LOWERED));
lblpersiandate.setComponentOrientation(java.awt.Co mponentOrientation.RIGHT_TO_LEFT);
lbltimedate = new JLabel();
lbltimedate.setText("" + this.getsystemdatetime() + "");
lbltimedate.setMaximumSize(new java.awt.Dimension(200,4));
lbltimedate.setPreferredSize(new java.awt.Dimension(200,4));
lbltimedate.setHorizontalAlignment(javax.swing.Swi ngConstants.CENTER);
lbltimedate.setHorizontalTextPosition(javax.swing. SwingConstants.CENTER);
lbltimedate.setFont(new java.awt.Font("Tahoma", java.awt.Font.PLAIN, 13));
lbltimedate.setBorder(javax.swing.BorderFactory.cr eateEtchedBorder(javax.swing.border.EtchedBorder.L OWERED));
lbl_username = new JLabel();
lbl_username.setText(" کاربر فعال :" + this.getusername() );
lbl_username.setComponentOrientation(java.awt.Comp onentOrientation.RIGHT_TO_LEFT);
lbl_username.setPreferredSize(new java.awt.Dimension(300,16));
lbl_username.setMaximumSize(new java.awt.Dimension(200,16));
lbl_username.setHorizontalAlignment(javax.swing.Sw ingConstants.RIGHT);
lbl_username.setBorder(javax.swing.BorderFactory.c reateEtchedBorder(javax.swing.border.EtchedBorder. LOWERED));
lbl_username.setFont(new java.awt.Font("Tahoma", java.awt.Font.PLAIN, 13));
super.add(lblpersiandate, java.awt.BorderLayout.WEST);
super.add(lbltimedate, java.awt.BorderLayout.CENTER);
super.add(lbl_username, java.awt.BorderLayout.EAST);

return Cstatusbar;
}

}


به صورت زیر هم ازش استفاده کردم :
توی قسمت initComponents فرم اصلی نوشتم :

statusbar statusbar = new Cstatusbar();

statusbar.setusername(" بی نامم ");
statusbar.setPersianDate(pcal.getIranianDate());
statusbar.setSystemDateTime("dddd");
getContentPane().add(statusbar, java.awt.BorderLayout.SOUTH);

ممنون - بای ...

oracle_2007
سه شنبه 15 خرداد 1386, 13:36 عصر
کسی نمی خواد کمک کنه ؟

unhandled_event
سه شنبه 15 خرداد 1386, 20:54 عصر
سلام
من سوادم تو جاوا خیلی کمه اما خب شاید بدونم مشکلت چیه
شما تو constructor کلاس Cstatusbar با صدا زدن متد getStatuspanel مقدارها رو ست کردین یه تناقضی اینجا هست وقتی از یک کلاس یک instance جدید new میکنین ( منظورم کدی که برای استفاده نوشتین ) هرچی تو constructor هست صدا زده میشه یعنی و label هایی که گذاشتین هم مقدار میگیرن یعنی مقدارشون رو null گرفتن و بعد از اون دیگه صدا زدن مثلا setusername فایده ای نداره و به جایی اثر نمیگذاره بنابراین یا باید setusername رو خوشگل تر کنین که مثلا تو متد setusername مقدار label مربوطه هم ست بشه. یا اینکه یک متد خارجی دیگه هم بنویسید که بعد از new شدن Cstatusbar و add شدنش صدا کنید مثلا با اجازت من متدی بنام applyStatusLabels تو کلاس Cstatusbar به شکل public اضافه کردم و بعد از add شدن Cstatusbar در فریم اصلی صداش زدم و درست شد .البته فکر کنم روش اول یعنی تغییر setusername اصولی تر باشه.
یعنی به این شکل :


public void setusername(String username){
stractiveuser =username ;
lbl_username.setText(stractiveuser);
}



این هم روش دوم :



public void applyStatusLabels () {
lbl_username.setText(" Current user :" + this.getusername() );
lbltimedate.setText("" + this.getsystemdatetime() + "");
lblpersiandate.setText(" Date :" + this.getPersianDate());
}





...
statusbar.applyStatusLabels()

oracle_2007
چهارشنبه 16 خرداد 1386, 14:50 عصر
جناب unhandled_event از کمک و توجهتون ممنون . من کد رو به این صورت اصلاح کردم و به نظرم درست شد. سورس اصلاح شده رو هم اینجا میذارم .اگه پایه باشین یه حال دیگه به سورس بدیم . حالا کمک کنین تو قسمت تاریخ میلادی و زمان ،یعنی قسمت وسطی، به کمک یه timer زمان رو هر ثانیه refresh کنیم ......

oracle_2007
پنج شنبه 17 خرداد 1386, 14:05 عصر
بازم سلام ...
این سورس نهاییه که درست شد ، همونطور که گفتم حالا میخواهیم زمان هر ثانیه refresh بشه ، پس هر کی میتونه این کارو تو این کلاس بکنه کمک کنه تا درست شه ... ممنون.


import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.Date;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Cstatusbar extends JPanel {

private static final long serialVersionUID = 1L;
private JLabel lbl_username= null;
private JLabel lbltimedate = null;
private JLabel lblpersiandate= null;
private String strpersiandate= null;
private String stractiveuser= null;
private String strsystemdatetime= null;
private Cstatusbar Cstatusbar;
private static String MiladiDate ;


public Cstatusbar(String Username,String IranianDate) {

super();
super.setPreferredSize(new Dimension(100, 25));
super.setLayout(new BorderLayout());
super.setComponentOrientation(java.awt.ComponentOr ientation.RIGHT_TO_LEFT);
stractiveuser = Username;
strpersiandate =IranianDate ;
strsystemdatetime = MiladiDate;
getStatuspanel();
}

private Cstatusbar getStatuspanel() {

lblpersiandate = new JLabel();
lblpersiandate.setText(" امروز :" + strpersiandate);
lblpersiandate.setFont(new java.awt.Font("Tahoma", java.awt.Font.BOLD , 11));
lblpersiandate.setMaximumSize(new java.awt.Dimension(300,16));
lblpersiandate.setPreferredSize(new java.awt.Dimension(300,16));
lblpersiandate.setBorder(javax.swing.BorderFactory .createEtchedBorder(javax.swing.border.EtchedBorde r.LOWERED));
lblpersiandate.setComponentOrientation(java.awt.Co mponentOrientation.RIGHT_TO_LEFT);
//================================================== ====================
lbltimedate = new JLabel();
Date now = new Date();
lbltimedate.setText("" + now.toString());
lbltimedate.setMaximumSize(new java.awt.Dimension(200,4));
lbltimedate.setPreferredSize(new java.awt.Dimension(200,4));
lbltimedate.setHorizontalAlignment(javax.swing.Swi ngConstants.CENTER);
lbltimedate.setHorizontalTextPosition(javax.swing. SwingConstants.CENTER);
lbltimedate.setFont(new java.awt.Font("Tahoma", java.awt.Font.BOLD, 11));
lbltimedate.setBorder(javax.swing.BorderFactory.cr eateEtchedBorder(javax.swing.border.EtchedBorder.L OWERED));
//================================================== ====================
lbl_username = new JLabel();
lbl_username.setText(" کاربر فعال : " + stractiveuser);
lbl_username.setComponentOrientation(java.awt.Comp onentOrientation.RIGHT_TO_LEFT);
lbl_username.setPreferredSize(new java.awt.Dimension(350,16));
lbl_username.setMaximumSize(new java.awt.Dimension(350,16));
lbl_username.setHorizontalAlignment(javax.swing.Sw ingConstants.RIGHT);
lbl_username.setBorder(javax.swing.BorderFactory.c reateEtchedBorder(javax.swing.border.EtchedBorder. LOWERED));
lbl_username.setFont(new java.awt.Font("Tahoma", java.awt.Font.BOLD, 11));

super.add(lblpersiandate, java.awt.BorderLayout.WEST);
super.add(lbltimedate, java.awt.BorderLayout.CENTER);
super.add(lbl_username, java.awt.BorderLayout.EAST);

return Cstatusbar;
}


}

oracle_2007
پنج شنبه 17 خرداد 1386, 14:07 عصر
این هم تصویر اونه statusbar هست . (قسمت وسط باید اصلاح بشه ).

pooyanm
پنج شنبه 17 خرداد 1386, 19:11 عصر
از javax.swing.Timer استفاده کن.

unhandled_event
پنج شنبه 17 خرداد 1386, 22:59 عصر
سلام

یک روش ر هم استفاده از یه کلاسیه بنام TimerTask که فکر کنم در واقع یک thread باشه.
من یه inner class کوچیک درست کردم و براش یه متد run درست کردم و متدیه که سر زمانبندی خودش اتوماتیک اجرا میشه.
اینطور که معلومه این کلاس TimerTask کاربردای زیادی داره از جمله زمانبندی یک کاری که قراره در فاصله های معین انجام بشه حتی طولانی در حد چند روز.
بعد از کلاس DateFormat استفاده کردم برای فرمت کردن تاریخ که از تابع System.currentTimeMillis زمان رو تا حد میلی ثانیه برمیگردونه. این سریع ترین تابع تاریخ و زمانش باشه فکر کنم گرچه وقتی فاصله یک ثانیه است زیاد مهم نیست ضمنا یک ثانیه هم با عدد 1000 مشخص شده.
این هم سورس کلاس (خود فرم اصلی هیچ تغییری نمیکنه) فقط مهمش اونجاست که label یی که قراره هر یک ثانیه refresh بشه
باید به innerclass پاس بشه.
Locale هم فکر میکنم میگه برای فارسی و ایران میخوام و DateFormat.ERA_FIELD هم جزو فرمتهای از پیش تعریف شده برای نمایش زمانه.




import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.util.*;
import java.text.DateFormat;



public class Cstatusbar extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
private JLabel lbl_username= null;
private JLabel lbltimedate = null;
private JLabel lblpersiandate= null;
private String strpersiandate= null;
private String stractiveuser= null;
private String strsystemdatetime= null;
private Cstatusbar Cstatusbar;
private Timer tmrShowDateTime;


public Cstatusbar() {
super();
super.setPreferredSize(new Dimension(100, 25));
super.setLayout(new BorderLayout());
super.setComponentOrientation(java.awt.ComponentOr ientation.RIGHT_TO_LEFT);
getStatuspanel();
tmrShowDateTime = new Timer ( ) ;
tmrShowDateTime.scheduleAtFixedRate( new UpdateDateTime (lbltimedate) ,0,1000) ;

}

/* public void setParameters(String persianDate,String ActiveUser,String SystemDatetime) {
strpersiandate = persianDate;
stractiveuser =ActiveUser ;
strsystemdatetime = SystemDatetime;
}*/
public void setusername(String username){
stractiveuser =username ;
lbl_username.setText(stractiveuser);
}
private String getusername() {
return stractiveuser;
}
public void setPersianDate(String PersianDate){
strpersiandate =PersianDate ;
}
private String getPersianDate() {
return strpersiandate;
}

public void setSystemDateTime(String SystemDateTime){
strsystemdatetime = SystemDateTime ;
}
private String getsystemdatetime() {
return strsystemdatetime;
}
private void getStatuspanel() {

lblpersiandate = new JLabel();
lblpersiandate.setFont(new java.awt.Font("Tahoma", java.awt.Font.PLAIN, 13));
lblpersiandate.setMaximumSize(new java.awt.Dimension(400,16));
lblpersiandate.setPreferredSize(new java.awt.Dimension(400,16));
lblpersiandate.setBorder(javax.swing.BorderFactory .createEtchedBorder(javax.swing.border.EtchedBorde r.LOWERED));
lblpersiandate.setComponentOrientation(java.awt.Co mponentOrientation.RIGHT_TO_LEFT);
lbltimedate = new JLabel();
lbltimedate.setMaximumSize(new java.awt.Dimension(200,4));
lbltimedate.setPreferredSize(new java.awt.Dimension(200,4));
lbltimedate.setHorizontalAlignment(javax.swing.Swi ngConstants.CENTER);
lbltimedate.setHorizontalTextPosition(javax.swing. SwingConstants.CENTER);
lbltimedate.setFont(new java.awt.Font("Tahoma", java.awt.Font.PLAIN, 13));
lbltimedate.setBorder(javax.swing.BorderFactory.cr eateEtchedBorder(javax.swing.border.EtchedBorder.L OWERED));
lbl_username = new JLabel();
lbl_username.setComponentOrientation(java.awt.Comp onentOrientation.RIGHT_TO_LEFT);
lbl_username.setPreferredSize(new java.awt.Dimension(300,16));
lbl_username.setMaximumSize(new java.awt.Dimension(200,16));
lbl_username.setHorizontalAlignment(javax.swing.Sw ingConstants.RIGHT);
lbl_username.setBorder(javax.swing.BorderFactory.c reateEtchedBorder(javax.swing.border.EtchedBorder. LOWERED));
lbl_username.setFont(new java.awt.Font("Tahoma", java.awt.Font.PLAIN, 13));
super.add(lblpersiandate, java.awt.BorderLayout.WEST);
super.add(lbltimedate, java.awt.BorderLayout.CENTER);
super.add(lbl_username, java.awt.BorderLayout.EAST);

}

class UpdateDateTime extends TimerTask {
JLabel DateTimeLabel;
Locale locale;
DateFormat dateFormatter;

public UpdateDateTime (JLabel aLabel) {
locale = new Locale("fa" , "IR");
dateFormatter = DateFormat.getTimeInstance(DateFormat.ERA_FIELD,lo cale);
DateTimeLabel = aLabel;

}
public void run ( ) {
if (DateTimeLabel != null) {
DateTimeLabel.setText(dateFormatter.format(System. currentTimeMillis()));

}
}
}


public void finalize () {
tmrShowDateTime.cancel();
}

}

oracle_2007
جمعه 18 خرداد 1386, 14:59 عصر
سلام به همه ومخصوصا به جناب که به قول خودش سواد جاواش کمه(البته فقط به قول خودش!). با کمک شایان این دوست عزیز و فعال ، این statusbar هم به سرانجام رسید .فقط یه سوال دیگه اینکه چراتوی خط
DateTimeLabel.setText(dateFormatter.format(System. currentTimeMillis()));
به من خطا میده ؟!!!

unhandled_event
جمعه 18 خرداد 1386, 17:13 عصر
خب دوتا پیام بالا رو بدلیل خراب بودن فایل zip ضمیمه مجبور شدم حذف کنم.

ممنون لطف دارید فقط بعض پنجشنبه جمعه ها میشه از این تحقیقات کرد اون هم برای مشاغل دوم و سوم. من یکی دو ماه بیشتر نیست دارم با جاوا سروکله میزنم چندساله VB6 و VB.NET کار میکنم اما جاوا بهتر بوده. خدا این گوگل رو هم از ما نگیره

خب چه خطایی ؟ چندتا احتمال :
اول اگر خطای کامپایل میده ممکنه اون space های اضافی که ادیتور اینجا همش میندازه توش هنوز هست یعنی بین نقطه سیستم و current
دوم fa رو در locale های ویندوز نداری که البته بعیده که این مساله وابسته به ویندوز باشه
سوم اینکه خود فانکشن System. currentTimeMillis() رو بتنهایی اجرا کن یه عدد خیلی
بزرگ میده اگر این کار رو بکنه پس با فرمت هم کار میکنه اگر کار نکرد یه مشکلی شاید با regional setting ویندوز هست نمیدونم (البته اینها همه زمانیه که شما با ویندوز کار میکنی نه لینوکس) من با ویندوز XP کار میکنم.
و از مراجع خود سان برای آموزش کار کردن با فرمت هم زمان هم تاریخ و هم هردو چون هم getTimeInstance داره و هم getDateInstance
منم از اونجا یاد گرفتم :
http://java.sun.com/docs/books/tutorial/i18n/format/dateintro.html
روش ctrl-space در netbeans و سرچ چیزایی که میاره در گوگل میتونه کمک کنه.
چهارم اینکه
من تمام سورسها و کلاسها که کار میکنه رو ضمیمه میکنم

oracle_2007
سه شنبه 22 خرداد 1386, 16:08 عصر
سلام . این خطا رو به من میده .

unhandled_event
سه شنبه 22 خرداد 1386, 23:31 عصر
سلام
خب این نشون میده که احتمالا در ورژن کامپایلر جاوایی که IDE شما داره استفاده میکنه
متد formatدر java.text.Format با این signature وجود نداره یعنی به این شکل :

public final String format (Object obj)


من از جاوای 1.6 و Netbeans 5.5.1 استفاده میکنم.