مترجم:حبیب الله علیخانی
منبع:راسخون



 

2- Swing Controls

این بخش شامل کامپوننت های زیر است:

Label

عنصر Label از کلاس JLabel است. کلاس JLabel به صورت شکل زیر از کلاسهای دیگر ارث بری کرده است:
در داخل صفحه ی frame یک متن ثابت یعنی یک Label قرار می دهد (مانند نوشته های کنار textfield ها در برنامه های مختلف ).
پروژه ای ایجاد می کنیم و کلاس JLabel را می سازیم و کد های زیر را در آن وارد می کنیم:
در زیر ما یک Label ساختیم که متن Label ما java SE – Rasekhoon است:
JLabel label = new JLabel("java SE – Rasekhoon ");
در زیر یک frame از کلاس JFrame new کردیم و یک Frame ایجاد کردیم:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Label را به frame وصل می کنیم ( یعنی Label رو در داخل frame رار می دهیم ):
frame.getContentPane( ).add(label);
frame خود را هم اندازه ی کامپوننت های داخل frame می کند , یعنی در اینجا frame را به اندازه ی Label می کند:
frame.pack( );
اما یک نکته ی مهم دیگه که باید آنرا در نظر گرفت این است که frame ایجاد شده , به صورت defualt مخفی است, و باید آنرا با دستور زیر آن را visible کنیم:
frame.setVisible(true);
خروجی آن به صورت زیر می شود:

Button

عنصر Button از کلاس JButton است. کلاس JButton به صورت شکل زیر از کلاسهای دیگر ارث بری کرده است:
یک دکمه ایجاد می کند که توسط آن User می تواند با کلیک بر روی آن یک action را انجام دهد.
کلاس JButton را می سازیم و کد های زیر را در آن وارد می کنیم:
در زیر JButton را ایجاد کردیم و نوشته ی درون آن (Rasekhoon) مقداریست که روی دکمه نمایش داده می شود.
constructor های ممکن برای JButton عبارتند از :
با کد زیر JButton ساخته شده را به add , JFrame کردیم:
jframe.getContentPane().add(jButton);
همان طوری که قبلا هم گفته شد JFrame را هم اندازه ی Button مورد نظر می کنیم. ( اصطلاحا آن را pack می کنیم)
خروجی آن به صورت زیر می شود:

اضافه کردن Action به دکمه:

در مثال قبل ما یک دکمه ایجاد کردیم ولی این دکمه، با کلیک بر روی آن هیچ کاری انجام نمی داد، اکنون می خواهیم یک Action را handel کنیم. زمانی که کاربر با یک کامپوننت در ارتباط باشد یک اتفاقی ممکن است رخ دهد، برنامه ی ما می تواند آمادگی رخ دادن اتفاقی را داشته باشد در صورتی که روی آن اتفاق listen کند، در واقع یعنی آماده باشه که هر وقت آن اتفاق آن را صدا کرد، کاری را انجام دهد.
کلاس ActionListenerExample را می سازیم و کد های زیر را در آن وارد می کنیم:
با کد زیر ما ActionListener را create کردیم:
همچنین با کد زیر گفتیم , اگر action رخ داد باید چکاری انجام دهد(در اینجا متن "Java SE" را در output می نویسد):
باید به دکمه ی مورد نظر action را add کنیم:
خروجی به صورت زیر می باشد:
با فشردن دکمه ی راسخون، خروجی در output به صورت زیر می باشد:
در اینجا باید به یک نکته اشاره کرد method ActionListener.actionPerformed () که در زیر به کار رفته حتما باید باشد چون در آنجا action که رخ می دهد را handel می کنیم.

Toggle Button

عنصر Toggle Button از کلاس JToggleButton است. کلاس JToggleButton به صورت شکل زیر از کلاسهای دیگر ارث بری کرده است:
کلاسهای JRadioButton و JCheckBox از JToggleButton ارث بری می کنند.
این دکمه ها دو وضعیتی هستند. مثلا برای on و off استفاده می شود.

Check Box

عنصر Check Box از کلاس JCheckBox است. کلاس JCheckBox به صورت شکل زیر از کلاسهای دیگر ارث بری کرده است:
JcheckedBox توانایی انتخاب شدن به دو صورت را دارند
: 1 مانند JRadioButton ها فقط توانایی انتخاب شدن یک گزینه را داشته باشیم.
: 2 یا توانایی انتخاب چندین گزینه را داشته باشیم.
به JCheckedBox ها boxtick هم می گویند.
تفاوت Check Box با Radio Button در این است که در آن واحد، Check Boxمی توانند هر چند تا انتخاب شوند اما Radio Button باید یکی انتخاب شود.
کلاس JCheckBoxExample را می سازیم و کد های زیر را در آن وارد می کنیم:
در خط 17و18 JCheckedBox ها و String ایجاد شدند. در خط 20 تا 31 از یک loop برای مقدار دهی کردن هر یک از JCheckeDBox ها و همچنین add کردن action استفاده کردیم.
در مثال قبل ما با ActionListener آشنا شدیم که یک Action به دکمه اضافه می کرد اما Action های JCheckedBox از نوع ItemListener هستند. همچنین نام تابعی که action را handel می کند itemStateChanged هست :
و حتما باید وجود داشته باشد.
در پایان خروجی به صورت زیر می باشد :
و با انتخاب کردن و یا برداشتن تیک هر کدام، در output متن های زیر چاپ می شود:
که نشان می دهد که ابتدا Esfahan ، select شده سپس به ترتیب dehagh و sari انتخاب شده و در پایان Esfahan از حالت انتخاب خارج شده(deselect شده).

Radio Button

عنصر Radio Button از کلاس JRadioButton است. کلاس JRadioButton به صورت شکل زیر از کلاسهای دیگر ارث بری کرده است:
در آن واحد، Radio Button باید یکی انتخاب شود. برای این کار باید هر چند تا از Radio Button را با استفاده از Button Group دریک گروه قرار داد.

Button Group

عنصر Button Group از کلاس ButtonGroup است. کلاس ButtonGroup به صورت شکل زیر از کلاسهای دیگر ارث بری کرده است:
زمانیکه از طریق پنجره ی Palette یک Button Group بر روی فرم قرار می دهیم، دیده نمی شود. این شی، یک شی nonvisual است یعنی نمایشی نیست و در پنجره ی Navigator (در بعضی ورژن ها Inspector) در شاخه ی Other Components قرار می گیرد.
فرض کنید پروژه ای داریم که در آن یک کلاس JFrame ایجاد کردیم:
یک Button Group به نام Button Group1 ، در فرم ایجاد می کنیم. سپس چند Radio Button مورد نظر را انتخاب کرده و در پنجره ی Properties ، خاصیت Button Group آن را به Button Group1 می دهیم.
در شکل زیر Design و خروجی را می بینید(در خروجی در هر گروه فقط یک Radio Button را می توان انتخاب کرد) :

Combo Box

عنصر Combo Box از کلاس JComboBox است. کلاس JComboBox به صورت شکل زیر از کلاسهای دیگر ارث بری کرده است:
ابتدا یک combobox را از پنجره ی palette، روی jframe درگ می کنیم:
سپس هنگامی که این کامپوننت در حال انتخاب است، به پنجره ی properties رفته و خاصیت مدل آن را انتخاب کرده(البته می توان خاصیت های دیگر آن را هم تغییر داد که از گفتن آن صرفه نظر می کنیم):
و در صفحه ی باز شده (مانند تصویر زیر) همه ی مواردی را که می خواهیم در این combox مورد نظر نمایش دهد را وارد می کنیم و سپس ok می کنیم:
بعد از اجرا (در شکل زیر) خروجی را به صورت زیر می بینید:

List

عنصر List از کلاس JList است. کلاس JList به صورت شکل زیر از کلاسهای دیگر ارث بری کرده است:
کلاس JListExample را می سازیم و کد های زیر را در آن وارد می کنیم:
در این مثال ما یک لیست ایجاد میکنیم با محتویات String، البته می توانیم از Object های دیگری نیز استفاده کنیم.
در خط 9 تا 11 ، JList در constructor خود آرایه ای از string ها را به عنوان پارامتر هایش در یافت می کند. به نحوه ی تعریف شدن ListSelectionListener در برنامه دقت کنید.
خروجی به صورت زیر می باشد:
کاربر می توانید یک object یا تعداد بیشتری را توسط ctrl یا shift انتخاب کند.

Text Field

عنصر Text Field از کلاس JTextField است. کلاس JTextField به صورت شکل زیر از کلاسهای دیگر ارث بری کرده است:
به عنوان یک فضا برای ورود اطلاعات به داخل برنامه کار برد می باشد.
کد:
JTextField firstField = new JTextField(20);
روش فوق نحوه ی ایجاد یک textfield است با مقدار اولیه 20 که تعداد کارکتر های داخل آن را مشخص می کند.

معرفی متد های textField :

JTextField(width) : این همان constructor تابع است که از آن new می کنیم.
setText(text): مقدار text را در داخل textfield قرار می دهد.
String getText(): مقدار داخل textField را می خواند.
:addActionListener(listener) یک اکشن به textfield اضافه می کنیم.
setEditable(true/false): این متد به ما می گوید که آیا می خواهیم textfield ما قابل edit باشد یا نه.
setFont(font): با این متد می توانیم فونت استفاده شده در داخل textfield را تعریف کنیم.
مثال این بخش درست مثل مثال بخش Label است. کافیست جای تعریف JLabel , JTextField که در این بخش معرفی شد را جایگزین کنیم.

Text Area

عنصر TextArea از کلاس JTextArea است. کلاس JTextArea به صورت شکل زیر از کلاسهای دیگر ارث بری کرده است:
کلاس JTextArea کامپوننتی را فراهم می کند که چندین خط از متن را نشان می دهد و به کاربر این اجازه را می دهد تا به طور انتخابی متن را ویرایش کند. این تفاوت شی TextArea با شی Textfield است. اگر نیاز دارید تا یک خط ازمتن را از کاربر دریافت کنید، باید از textfield استفاده کنید. اگر می خواهید از Text area برای نمایش متنی استفاده کنید که از چند فونت یا استایل استفاده کند، باید از editor pane یا text pane استفاده کنید.
کلاس JTextAreaExample را می سازیم و کد های زیر را در آن وارد می کنیم:
خط 18 نحوه ی ایجاد یک textarea را نشان می دهد ( در بخشهای دیگر در مورد کلمه ی کلیدی Final توضیح خواهیم داد).
خط 21-28 دکمه ای که در صفحه قرار دارد و بعد از کلیک بر روی آن متنی را که در صفحه وارد کردیم را به وسیله ی متد getText() می گیرد و در خروجی output آن را نمایش می دهد.
خروجی به صورت زیر می باشد( هم فرم هم output):

Scroll Bar

عنصر Scroll Bar از کلاس JScrollBar است. کلاس JScrollBar به صورت شکل زیر از کلاسهای دیگر ارث بری کرده است:
زمانی کاربرد دارند که ما یک سری object یا متن در یک فضای محدود داریم و می خواهیم بعضی از آنها، نه همه ی موارد را نشان دهیم. درپنجره ی properties می توان orientation آن را تغییر دهیم و جهت نمایش آن را تعیین کنیم که افقی باشد یا عمودی. مشابه ScrollPane است و در بخش Swing Containers در مورد این کامپوننت توضیح داده شد.

Slider

عنصر Slider از کلاس JSlider است. کلاس JSlider به صورت شکل زیر از کلاسهای دیگر ارث بری کرده است:
JSlider به کاربران اجازه می دهد که یک مقدار یا یک object را از بین یک دنباله انتخاب کند, هر حرکت JSlider حالات مختلفی را ایجاد می کند.
کلاس JSliderExample را می سازیم و کد های زیر را در آن وارد می کنیم:
خط 11و12 دوتا از چند constructor تابع JSlider است , بقیه ی آنها عبارتند از:
JSlider() : یک slider عمودی با رنج 0 تا 100 و مقدار اولیه ی 50 ایجاد می کند.
JSlider(BoundedRangeModel model) : یک slider عمودی با استفاده از BoundedRangeModel ایجاد می کند.
JSlider(int orientation) : یک slider در orientation خاص، با رنج 0 تا 100 و مقدار اولیه ی 50 ایجاد می کند.
JSlider(int min, int max) : یک slider عمودی با استفاده از min و max (حداقل و حداکثر) معین ومقدار اولیه بین min و max ایجاد می کند.
JSlider(int min, int max, int value) : یک slider عمودی با استفاده از min و max (حداقل و حداکثر) معین ومقدار اولیه ایجاد می کند.
JSlider(int orientation, int min, int max, int value) : یک slider عمودی در orientation خاص، با استفاده از min و max (حداقل و حداکثر) معین ومقدار اولیه ایجاد می کند.
خروجی به صورت زیر می باشد:
برای فیلم، تغییر سایز عکس و یا انتخاب سطر یا سطر هایی از بانک اطلاعاتی بکار می رود. در پنجره ی properties خاصیت های مهم آن، minimum و maximum است که عدد بالا ترنشان دهنده ی دقت بالاتر است.

Progress Bar

عنصر Progess Bar از کلاس JProgressBar است. کلاس JProgressBar به صورت شکل زیر از کلاسهای دیگر ارث بری کرده است:
درصد را نشان میدهد مثلا برای درصد پیشرفت پروژه یا درصد مقدار خواندن از فایل ویا در پروژه های بانک اطلاعاتی مقدار مصرف شدن چیزی را نشان می دهد. در پنجره ی properties ، خاصیت value نشان دهنده ی درصد است و هر عددی را برای آن قرار دهیم، همان مقدار پر می شود، پس می توان این مقدار را از بانک اطلاعاتی بخوانیم.

Formatted Field

عنصر Formatted Field از کلاس JFormattedTextField است. کلاس JFormattedTextField به صورت شکل زیر از کلاسهای دیگر ارث بری کرده است:
این شی کمک می کند که فقط آن نوع داده ای که مد نظر ماست را به آن نسبت دهیم. مثلا می خواهیم کاری کنیم که کاربر فقط بتواند عدد وارد کند. برای این کار در JFrame یک قرار می دهیم و در سازنده ی کلاس از کلاس Integer یک نمونه می سازیم. این Integer آبجکت Integer است و با معنای Integer همیشگی(datatype ) نیست.
کد زیر راوارد می کنیم:
در کد بالا، یک آبجکت Integer با نام i تعریف کردیم که آن را به Value شی JFormattedTextField پاس می دهیم.
یا برای اینکه فقط تاریخ را بپذیرد از کلاس Date استفاده می کنیم. درکد زیر می بینید که در سازنده ی کلاس آبجکت Date با نام i تعریف کردیم که آن را به Value شی JFormattedTextField پاس می دهیم. درگذشته آموختید که کلاس سازنده هم نام کلاس اصلی است و برای مقدار دهی بکار می رود.
خروجی کد بالا را در تصویرزیر مشاهده می کنید:

Password field

عنصر Password Field از کلاس JPasswordField است. کلاس JPasswordField به صورت شکل زیر از کلاسهای دیگر ارث بری کرده است:
کامپوننت پر کاربرد JPasswordField همانطوری که از اسمش پیداست، برای کار با پسورد است، مثلا شما برنامه ای نوشتید و برای ورود می خواهید یک پسورد را چک کند، در اینجا با نحوه ی ساختن این فیلد و نحوه ی خواندن پسورد درون این فیلد آشنا می شوید:
کلاس JPasswordFieldExample را می سازیم و کد های زیر را در آن وارد می کنیم:
خط 11 در اینجا Jpassword را با آرگومان 10 که نشان دهنده ی حداکثر طول پسورد مورد مورد نظر است را نشان می دهد. در خط 12 به فیلد مورد نظر اکشن دادیم. در خط 14 به وسیله ی متد getPassword() می توانیم پسوورد را از داخل فیلد بخوانیم.
سپس خروجی به صورت زیر می باشد: (دقت کنید زمانیکه پسورد را وارد می کنید، در پنجره ی output مقدار آن نشان داده می شود مثلا در اینجا 123 را وارد کردیم)

Spinner

عنصر Spinner از کلاس JSpinner است. کلاس JSpinner به صورت شکل زیر از کلاسهای دیگر ارث بری کرده است:
قطعا در برنامه های مختلف تا حالا با Spinner ها بر خورد کردید مثلا برای انتخاب شهر ، روز یا تاریخ و ..
JSpinner ها به کاربر اجازه می دهد که در بین چندین مقادیر فقط یکی را انتخاب کند. در هر بار فقط یک مقدار انتخاب می شود و کاربر با بالا پایین کردن می تواند آنرا تغییر دهد.
کلاس JSpinnerExample را می سازیم و کد های زیر را در آن وارد می کنیم:
در خط 11 آرایه ای از نوع String به نام size ایجاد کردیم که مقادیر عناصر آن را هم نسبت داده ایم.
در خط 13 constructor تابع SpinnerListModel به وسیله ی آرایه از string ها (آرایه ی size) فراخوانی شده است ( از این طریق یک لیست از مقدار اولیه برایSpinner درست می کنیم )
در خط 15 constructor ،JSpinner را با لیستی که قبلا توسط SpinnerListModel آماده کرده بودیم (لیستی به نام model) مقدار دهی می کنیم.
سپس خروجی به صورت زیر می باشد(با انتخاب هر کدام در پنجره ی output مقدار آن نشان داده می شود):

Separator

عنصر Separator از کلاس JSeperator است. کلاس JSeperator به صورت شکل زیر از کلاسهای دیگر ارث بری کرده است:
این شی یک جداکننده است. این شی را درگ کنید و تست کنید.

Text Pane

عنصر Text Pane از کلاس JTextPane است. کلاس JTextPane به صورت شکل زیر از کلاسهای دیگر ارث بری کرده است:
یک شی پر قدرت است که در آن می توان متن ها با فونت های مختلف ایجاد کرد.

Editor Pane

عنصر Editor Pane از کلاس JEditorPane است. کلاس JEditorPane به صورت شکل زیر از کلاسهای دیگر ارث بری کرده است:
این شی کامل تراز text pane است وحتی می توان در آن صفحات html و عکس را لود کرد.

Tree

عنصر Tree از کلاس JTree است. کلاس JTree به صورت شکل زیر از کلاسهای دیگر ارث بری کرده است:
این شی یک ساختار درختی ایجاد می کند.
در پنجره ی Properties در خاصیت Model آن می توان مقادیر این ساختار درختی را تعیین کرد:
خروجی را به صورت زیر مشاهده می کنید:

Table

عنصر Table از کلاس JTable است. کلاس JTable به صورت شکل زیر از کلاسهای دیگر ارث بری کرده است:
این شی یک آرایه یک بعدی برای هدر و یک آرایه ی دو بعدی برای دیتا مانند شکل زیر، ایجاد می کند که در مورد این شی بعدا درمبحث Database، مفصل توضیح خواهیم داد.
سعی کنید خودتان برای هر کامپوننت، بقیه خاصیت هایش را در پنجره ی properties امتحان کنید تا بهتر درک کنید. .