کنترل JTextField و JPasswordField

کنترل TextField ابتدایی ترین وسیله برای ورود اطلاعات در یک فرم ویندوزی می باشد. این کار را با تایپ آنها (اطلاعات) در TextField انجام می دهید. سازنده این کلاس به روش های زیر مقداردهی می شود :

JTextField()
JTextField(String)
JTextField(Column)
JTextField(ِString,Column)
JTextField(ِDocument,String,Column)

می خواهیم با یک مثال نحوه استفاده از TextField را به شما نشان دهیم. برنامه از شما می خواهد که دو عدد را وارد کنید و با زدن دکمه جمع آنها در TextField سومی نشان دهید. حال به طراحی برنامه می پردازیم. به کد زیر توجه کنید :

   1: import java.awt.*;
   2: import java.awt.event.*;
   3: import javax.swing.*;
   4: 
   5: public class FrameDemo 
   6: {
   7:     public static void main(String[] args) 
   8:     {
   9:         //Create Frame
  10:         JFrame frame1 = new JFrame("TextFiled Demo");
  11:         frame1.setLayout(null);  
  12:         
  13:         //Create Panel
  14:         JPanel panel1 = new JPanel();
  15:         panel1.setLayout(new GridLayout(4,2));
  16:         panel1.setBounds(40, 60, 270, 80);
  17: 
  18:         //Create Textfield and Button
  19:         final JTextField firstNumber = new JTextField(15);
  20:         final JTextField SecondNumber = new JTextField(15);
  21:         final JTextField Result = new JTextField(15);
  22:         JButton Calculate = new JButton("Calculate");
  23:         
  24:         //Add Textfield and Button to Panel
  25:         panel1.add(new Label("First Number"));  
  26:         panel1.add(firstNumber);
  27:         panel1.add(new Label("Second Number")); 
  28:         panel1.add(SecondNumber);
  29:         panel1.add(new Label("SUM"));               
  30:         panel1.add(Result);
  31:         panel1.add(Calculate);  
  32: 		
  33: 	      //Add Panel to Frame
  34:         frame1.add(panel1);
  35:            
  36:         class MyActionListener implements ActionListener
  37:         {
  38:             @Override
  39:             public void actionPerformed(ActionEvent e)
  40:             {
  41:                 double firstnumber  = Double.parseDouble(firstNumber.getText());
  42:                 double secondnumber = Double.parseDouble(SecondNumber.getText()); 
  43:                 Result.setText(String.valueOf(firstnumber + secondnumber));
  44:             }
  45:         }
  46:       
  47:         Calculate.addActionListener(new MyActionListener());
  48:         
  49:         //Show Frame    
  50:         frame1.setSize(356 , 263);
  51:         frame1.setVisible(true);          
  52:     }   
  53: }

در کد بالا و در خط 10 یک Frame ایجاد کرده ایم. در خط 14 یک Panel ایجاد و در خط 15 آن را به چهار سطر و دو ستون تقسیم نموده ایم. در خط 16 پنل را تقریبا به وسط فریم انتقال داده ایم. در خطوط 31-19 هم TextField ها و دکمه محاسبه را ایجاد و به Panel اضافه کرده ایم. بخس مهم کد بالا خطوط 47-36 می باشد. ابتدا در خطوط 45-36 یک کلاس به نام MyActionListener تعریف کرده ایم که رابط ActionListener را پیاده سازی می کند. این رابط دارای متدی به نام ()actionPerformed که زمانی فراخوانی می شود که بر روی کنترلی کلیک شود. حال وظیفه کلاس MyActionListener فراهم کردن کدهایی برای بدنه این متد می باشد. این کدها که در خطوط 43-41 مشاهده می کنید همان عملیان جمع TextField ها می باشند. در خطوط 41 و 42 با استفاده از متد ()getText مقادیر ورودی کاربر را دریافت کرده و برای اینکه بتوان بر روی آنها عملیات جمع را انجام داد با استفاده از متد ()parseDouble از کلاس Double آنها را به نوع اعشار تبدیل می کنیم. چون قرار است که نتیجه در TextField نمایش داده شود در خط 43 و با استفاده از متد و کلاس ()String.valueOf حاصل جمع را به نوع رشته تبدیل و در TextField سوم نمایش می دهیم. در خط 47 هم شیئ از کلاس MyActionListener را به
متد ()addActionListener ارسال می کنیم تا دکمه درست کار کند. حال برنامه را اجرا و با وارد کردن دو عدد نتیجه را مشاهده کنید :
textfiled-in-swing-01

در ادامه آموزش کنترل JTextField می خواهیم رویداد TextChanged زبان سی شارپ را به وسیله جاوا پیاده سازی کنیم. برنامه به این صورت است که وقتی متنی در داخل JTextField نوشته می شود، همزمان در داخل یک کنترل JLabel هم نوشته شود. به کد زیر توجه کنید :

   1: import java.awt.*;
   2: import javax.swing.*;
   3: import javax.swing.event.*;
   4: 
   5: public class FrameDemo 
   6: {
   7:     public static void main(String[] args) 
   8:     {
   9:         JFrame frame1 = new JFrame("TextFiled Demo");
  10:         frame1.setLayout(null);      
  11:         JPanel panel1 = new JPanel();
  12:         panel1.setLayout(new GridLayout(2,1));
  13:         panel1.setBounds(40, 80, 270, 50);
  14:         final JTextField TextField1 = new JTextField();
  15:         final JLabel Label1 = new JLabel();
  16:         panel1.add(TextField1);
  17:         panel1.add(Label1); 	
  18:         frame1.add(panel1);
  19:                    
  20:         class MydocumentListener implements DocumentListener
  21:         {
  22:             public void changedUpdate(DocumentEvent documentEvent) 
  23:             {
  24:                  
  25:             }
  26:             public void insertUpdate(DocumentEvent documentEvent) 
  27:             {
  28:                 Label1.setText(TextField1.getText());
  29:             }
  30:             public void removeUpdate(DocumentEvent documentEvent) 
  31:             {
  32:                 Label1.setText(TextField1.getText());
  33:             }                          
  34:         }
  35: 
  36:         TextField1.getDocument().addDocumentListener(new MydocumentListener());
  37:             
  38:         frame1.setSize(356 , 263);
  39:         frame1.setVisible(true);          
  40:     }   
  41: }

در خطوط 18-9 یک فریم ایجاد و یک کنترل Panel که حاوی یک TextField و یک Label است را به آن اضافه کرده ایم. برای کار با متن یا به عبارتی تغییرات متن باید رابط DocumentListener توسط یک کلاس پیاده سازی شود که ما این کار را در خط 20 انجام داده ایم. این رابط دارای سه متد زیر می باشد :

  • ()changedUpdate
  • ()insertUpdate
  • ()removeUpdate

که ما برای پیاده سازی رویداد مذکور به دو به دو متد آخر نیاز داریم. در داخل بدنه دو متد آخر کد زیر را می نویسیم :

Label1.setText(TextField1.getText());

کاری که در خطوط 32 و 28 انجام داده ایم. سپس یک نمونه از کلاس MydocumentListener را در خط 36 به متد ()addDocumentListener ارسال می کنیم. حال برنامه را اجرا و متنی را در داخل TextField نوشته و نتیجه را مشاهده نمایید :
textfiled-in-swing-02

اگر TextField شما می خواهد یک پسورد را بپذیرد، شما باید از کنترل JPasswordField به جای JTextField استفاده کنید. سازنده این کلاس به روش های زیر مقداردهی می شود :

public JPasswordField()
public JPasswordField(String text)
public JPasswordField(int columnWidth)
public JPasswordField(String text, int columnWidth)
public JPasswordField(Document model, String text, int columnWidth)

هر کاراکتری را که در داخل این کنترل بنویسید آن را به صورت ستاره ( * ) نمایش می دهد :
textfiled-in-swing-03