2014年2月24日 星期一

Java Swing 測試 : JLabel 與文字欄位

Swing 中跟文字相關的圖形用戶界面元件有 JLabel,JTextField ,JPassword,JTextArea ,以及 JEditorPane。首先測試 JLabel,此元件是一個文字或圖像標籤(預設向左對齊),用來提供指示或說明,使用者無法編輯。JLabel 的最常用建構子如下:

JLabel label=new JLabel("標籤") ;

或者先呼叫無參數之建構子,再呼叫 setText(String text) 方法設定顯示文字:

JLabel label=new JLabel();
label.setText("標籤");

也可以傳入水平對齊方式常數作為第二參數:

JLabel label=new JLabel("標籤", SwingConstants.RIGHT);

水平對齊方式常數有三個:

SwingConstants.LEFT(預設= 2), SwingConstants.CENTER(= 0), SwingConstants.RIGHT(= 4)

如下範例 1 所示:
 
測試範例1 :  http://mybidrobot.allalla.com/javatest/JLabel1.zip  [ 看原始碼]

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class JLabel1 {
  JFrame f;
  public static void main(String argv[]) {
    new JLabel1();
    }
  public JLabel1() {
    JFrame.setDefaultLookAndFeelDecorated(true);
    JDialog.setDefaultLookAndFeelDecorated(true);
    f=new JFrame("JLabel1");
    f.setSize(300,200);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
    Container cp=f.getContentPane();
    cp.setLayout(null);
    JLabel label1=new JLabel("標籤 1");
    label1.setBounds(20,20,100,40);
    cp.add(label1);
    JLabel label2=new JLabel();
    label2.setText("標籤 2");
    label2.setBounds(20,50,100,40);
    cp.add(label2);
    JLabel label3=new JLabel("標籤 3",SwingConstants.RIGHT);
    label3.setBounds(20,80,100,40);
    cp.add(label3);
    JLabel label4=new JLabel("標籤 4",SwingConstants.CENTER);
    label4.setBounds(20,110,100,40);
    cp.add(label4);
    f.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
    f.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        int result=JOptionPane.showConfirmDialog(f,
                   "確定要結束程式嗎?",
                   "確認訊息",
                   JOptionPane.YES_NO_OPTION,
                   JOptionPane.WARNING_MESSAGE);
        if (result==JOptionPane.YES_OPTION) {System.exit(0);}
        }  
      });
    }
  }

除了文字之外,JLabel的也可以使用圖片,這要在呼叫建構子時,傳入 ImageIcon 物件:

ImageIcon icon=new ImageIcon("icon.jpg");
JLabel label=new JLabel(icon);

也可以先呼叫無參數建構子,再呼叫 SetIcon() 方法傳入 IconImage 物件:

JLabel label =new JLabel();
label.setIcon(new IconImage("icon.jpg"));

或者呼叫有水平對齊參數之建構子:

JLabel label =new JLabel(icon, SwingConstants.RIGHT);

如下面範例 2 所示:

測試範例 2 :  http://mybidrobot.allalla.com/javatest/JLabel2.zip  [ 看原始碼]

    ImageIcon的圖標=新的ImageIcon(“icon.jpg”) ;
    JLabel的標籤1 =新JLabel的(圖標) ; / /預設圖片置中對齊
    label1.setBounds(20,20,100,50);
    label1.setToolTipText(“標籤1”);
    cp.add項(Label);
    JLabel的標記2 =新的JLabel(); / /無參數建構子,預設向左對齊
    label2.setBounds(20,70,100,50);
    LABEL2。操作SetIcon(圖標); / /設定圖片
    label2.setToolTipText(“標籤2”);
    cp.add(標記2);
    JLabel的LABEL3 =新JLabel的(圖標,SwingConstants.RIGHT) ; / /指定圖片向右對齊
    label3.setBounds(20,120,100,50);
    label3.setIcon(圖標);
    LABEL3。的setToolTipText(“標籤3”) ;
    cp.add(LABEL3);


可見如果只傳的ImageIcon物件,則預設會置換中對齊(第一個);若是呼叫無參數建構子,則跟文字一樣是置左對齊(第二個);最後一個是指定向右對齊。也可以呼叫的setToolTipText()方法替的JLabel加上提示文字。

JLabel的還有一個建構子可以同時指定文字與圖片,預設圖片在左,文字在右:

JLabel的標籤=新的JLabel(“標籤”圖標,SwingConstants.RIGHT);

測試範例3  :  http://mybidrobot.allalla.com/javatest/JLabel3.zip  [ 看原始碼]

    ImageIcon的圖標=新的ImageIcon(“icon.jpg”);
    JLabel的標籤1 =新的JLabel(“標籤1”,圖標,SwingConstants.LEFT); / /整體向左對齊
    label1.setBounds(20,20,100,50);
    cp.add項(Label);
    JLabel的標記2 =新的JLabel(“標籤2”,圖標,SwingConstants.RIGHT); / /整體向右對齊
    label2.setBounds(20,80,100,50);
    cp.add(標記2);
    JLabel的LABEL3 =新的JLabel(“標籤3”,圖標,SwingConstants.CENTER); / /整體置中對齊
    label3.setBounds(20,140,​​100,50);
    cp.add(LABEL3);
    JLabel的Label4的=新的JLabel(“標籤4”,圖標,SwingConstants.CENTER); / /整體置中對齊
    Label4的。setHorizontalTextPosition(SwingConstants.LEFT); / /文字在圖左(預設為右)
    label4.setBounds(20,200,100,50);
    cp.add(Label4的);
    JLabel的label5 =新的JLabel(“標籤5”,圖標,SwingConstants.RIGHT); / /整體向右對齊
    。label5 setVerticalTextPosition(SwingConstants.TOP) ; / /文字垂直向上
    label5.setBounds(200,20,100,50);
    cp.add(label5);
    JLabel的label6 =新的JLabel(“標籤6”圖標,SwingConstants.RIGHT); / /整體向右對齊
    label6.setVerticalTextPosition(SwingConstants.CENTER); / /文字垂直置中
    label6.setBounds(200,80,100,50);
    cp.add(label6);
    JLabel的label7 =新的JLabel(“標籤7”,圖標,SwingConstants.RIGHT); / /整體向右對齊
    label7.setVerticalTextPosition(SwingConstants.BOTTOM); / /文字垂直向下
    label7.setBounds(200,140,​​100,50);
    cp.add(label7);


此例中可見建構子的第三參數是指文字與圖片的整體對齊方式,兩者擺放方式預設是圖先字後,如果要改變為文先圖後,必須呼叫setHorizo​​ntalTextPosition()方法,傳入SwingConstants.LEFT即可。文字的垂直位置則可以呼叫setVerticalTextPosition()來設定,如標籤5,6,7所示。

以上為JLabel的常用方式。要注意單獨圖片與文字的水平尺位置預設什麼。不同的,文字是靠左,圖片是置中,文圖一起出現時預設是圖先文後,垂直位置均為置中

接著來看文字欄位的JTextField,此元件用來輸入單行文字,其建構子為:

JTextField的文本=新的JTextField();  / /預設為欄位數為0

也可以傳入欄位數(列),指定可輸入的文字寬度,但實際顯示寬度是平均字元寬度(像素)乘以欄位數,但這只有在有版面管理員時才有效果,若自行排版則受到尺寸限制,:

JTextField的文本=新的JTextField(12);  / /指定12欄

可以指定預設文字:

JTextField的文本=新的JTextField(“請輸入帳號”);

或同時指定欄位與預設文字:

JTextField的文本=新的JTextField(“請輸入帳號”,12);

如下列範例4所示:

測試範例4  :  http://mybidrobot.allalla.com/javatest/JTextField1.zip  [ 看原始碼

導入java.awt中的*。;
進口java.awt.event中*。;
進口javax.swing中*。;
進口javax.swing.event中的*。;

公共類JTextField1 {
  JFrame的F;
  公共靜態無效的主要(字串的argv []){
    新JTextField1();  
    }
  公共JTextField1(){
    JFrame.setDefaultLookAndFeelDecorated(真);
    JDialog.setDefaultLookAndFeelDecorated(真);
    F =新的JFrame(“JTextField1”);
    f.setSize(400,300); 
    f.setLocationRelativeTo(NULL); 
    集裝箱CP = f.getContentPane();
    cp.setLayout(NULL);
    JTextField的文本1 =新的JTextField(5);
    text1.setBounds(20,20,100,25);
    cp.add(文本);
    JTextField的文本2 =新的JTextField(15);
    text2.setBounds(20,60,100,25);
    cp.add(文本2);
    JTextField的文本3 =新的JTextField(“請輸入帳號”);
    text3.setBounds(20,100,100,25);
    cp.add(文本3);
    JTextField的文本4 =新的JTextField(“請輸入密碼”,100);
    text4.setBounds(20,140,​​100,25);
    cp.add(文字4);
    f.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);     
    f.setVisible(真); 
    f.addWindowListener(新WindowAdapter(){
      公共無效windowClosing(WindowEvent E){
        int結果= JOptionPane.showConfirmDialog(F,
                   “確定要結束程式嗎?”
                   “確認訊息”,
                   JOptionPane.YES_NO_OPTION,
                   JOptionPane.WARNING_MESSAGE);
        如果(結果== JOptionPane.YES_OPTION){System.exit(0);}
        }    
      });
    }
  }



可見自行排版時,欄位設定是沒有作用的。若設定版面管理員就會不同了,如下列範例5所示:

測試範例5  :  http://mybidrobot.allalla.com/javatest/JTextField2.zip  [ 看原始碼


導入java.awt中的*。;
進口java.awt.event中*。;
進口javax.swing中*。;
進口javax.swing.event中的*。;

公共類jTextField2中{
  JFrame的F;
  公共靜態無效的主要(字串的argv []){
    新jTextField2中(); 
    }
  公共jTextField2中(){
    JFrame.setDefaultLookAndFeelDecorated(真);
    JDialog.setDefaultLookAndFeelDecorated(真);
    F =新的JFrame(“jTextField2中”);
    f.setSize(400,300);
    f.setLocationRelativeTo(NULL);
    集裝箱CP = f.getContentPane();
    cp.setLayout(新的FlowLayout());
    JTextField的文本1 =新的JTextField(5);
    cp.add(文本);
    JTextField的文本2 =新的JTextField(15);
    cp.add(文本2);
    JTextField的文本3 =新的JTextField(“請輸入帳號”);
    cp.add(文本3);
    JTextField的文本4 =新的JTextField(“請輸入密碼”,20);
    cp.add(文字4);
    f.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);    
    f.setVisible(真);
    f.addWindowListener(新WindowAdapter(){
      公共無效windowClosing(WindowEvent E){
        int結果= JOptionPane.showConfirmDialog(F,
                   “確定要結束程式嗎?”
                   “確認訊息”,
                   JOptionPane.YES_NO_OPTION,
                   JOptionPane.WARNING_MESSAGE);
        如果(結果== JOptionPane.YES_OPTION){System.exit(0);}
        }   
      });
    }
  }

可見在的FlowLayout版面管理員下,欄位設定就有作用了。但在網格佈局下也沒有作用,因為它會把元件撐大到JFrame中之邊界,如下列範例6

測試範例6  :  http://mybidrobot.allalla.com/javatest/JTextField3.zip  [ 看原始碼

    集裝箱CP = f.getContentPane();
    cp.setLayout(新GridLayout的(0,1));
    JTextField的文本1 =新的JTextField(5);
    cp.add(文本);
    JTextField的文本2 =新的JTextField(15);
    cp.add(文本2);
    JTextField的文本3 =新的JTextField(“請輸入帳號”);
    cp.add(文本3);
    JTextField的文本4 =新的JTextField(“請輸入密碼”,20);
    cp.add(文字4);


測試範例7  :  http://mybidrobot.allalla.com/javatest/JTextField4.zip  [ 看原始碼

    集裝箱CP = f.getContentPane();
    / / cp.setLayout(新的BorderLayout()); / /預設即為邊界佈局,不必特別設定
    JTextField的文本1 =新的JTextField(5);
    cp.add(文字,BorderLayout.EAST);
    JTextField的文本2 =新的JTextField(15);
    cp.add(文字2,BorderLayout.WEST);
    JTextField的文本3 =新的JTextField(“請輸入帳號”);
    cp.add(文本3,BorderLayout.SOUTH);
    JTextField的文本4 =新的JTextField(“請輸入密碼”,20);

    cp.add(文本4,BorderLayout.NORTH);



可見邊界佈局下,視窗開啟後,南北方向會撐到視窗寬度,東西方向會則依欄位大小分配。不過視窗縮放後高度會縮到JTextField中的預設高度:



JTextField中有兩個常用的方法的getText()與的setText(字符串文本),可用來存取使用者所輸入之內容,如下列範例8所示: 

測試範例8  :  http://mybidrobot.allalla.com/javatest/JTextField5.zip  [ 看原始碼

導入java.awt中的*。;
進口java.awt.event中*。;
進口javax.swing中*。;
進口javax.swing.event中的*。;

公共類JTextField5 實現的ActionListener {
  JFrame的F;
  JTextField的文本1;
  JButton的B1,B2;
  公共靜態無效的主要(字串的argv []){
    新JTextField5(); 
    }
  公共JTextField5(){
    JFrame.setDefaultLookAndFeelDecorated(真);
    JDialog.setDefaultLookAndFeelDecorated(真);
    F =新的JFrame(“JTextField5”);
    f.setSize(400,300);
    f.setLocationRelativeTo(NULL);
    集裝箱CP = f.getContentPane();
    cp.setLayout(NULL);
    文本1 =新的JTextField(“請輸入帳號”);
    text1.setBounds(20,20,100,25);
    cp.add(文本);
    B1 =新的JButton(“清除”);
    b1.setBounds(140,20,80,25);
    b1.addActionListener(本);
    cp.add(B1);
    B2 =新的JButton(“確定”);
    b2.setBounds(230,20,80,25);
    b2.addActionListener(本);
    cp.add(B2);
    f.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);    
    f.setVisible(真);
    f.addWindowListener(新WindowAdapter(){
      公共無效windowClosing(WindowEvent E){
        int結果= JOptionPane.showConfirmDialog(F,
                   “確定要結束程式嗎?”
                   “確認訊息”,
                   JOptionPane.YES_NO_OPTION,
                   JOptionPane.WARNING_MESSAGE);
        如果(結果== JOptionPane.YES_OPTION){System.exit(0);}
        }   
      });
    }
  公共無效的actionPerformed(ActionEvent的E) {
    如果(e.getSource()== b1)的{
        。文本1 的setText(“”) ;
        }
    否則,如果(e.getSource()== b2)的{
        JOptionPane.showMessageDialog(F,
          “您的帳號是”+ 文本1。的getText(),
          “訊息”,JOptionPane.INFORMATION_MESSAGE);     
        }
    }
  }



此例中我們放置了兩個按鈕B1與B2,並實作的ActionListener介面。因為要在的actionPerformed()方法中存取文字欄位的text1,因此這三個元件必須宣告為類別成員。按下“清除”鍵會呼叫的setText(“”)方法清除欄位中的值,而按下“確定”則呼叫的getText()方法取得其值。

下面範例9要測試的JTextField從JComponent的類別繼承而來的另外三個常用方法:切(),複製,粘貼與():

測試範例9 :  http://mybidrobot.allalla.com/javatest/JTextField6.zip  [ 看原始碼

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class JTextField6 implements ActionListener {
  JFrame f;
  JTextField text1,text2;
  JButton cut, copy, paste;
  public static void main(String argv[]) {
    new JTextField6();  
    }
  public JTextField6() {
    JFrame.setDefaultLookAndFeelDecorated(true);
    JDialog.setDefaultLookAndFeelDecorated(true);
    f=new JFrame("JTextField6");
    f.setSize(400,300); 
    f.setLocationRelativeTo(null); 
    Container cp=f.getContentPane();
    cp.setLayout(null);
    text1=new JTextField();
    text1.setBounds(20,20,200,25);
    cp.add(text1);
    cut=new JButton("剪下");
    cut.setBounds(20,70,60,25);
    cut.addActionListener(this);
    cp.add(cut);
    copy=new JButton("複製");
    copy.setBounds(90,70,60,25);
    copy.addActionListener(this);
    cp.add(copy);
    paste=new JButton("貼上");
    paste.setBounds(160,70,60,25);
    paste.addActionListener(this);
    cp.add(paste);
    text2=new JTextField();
    text2.setBounds(20,120,200,25);
    cp.add(text2);
    f.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);     
    f.setVisible(true); 
    f.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        int result=JOptionPane.showConfirmDialog(f,
                   "確定要結束程式嗎?",
                   "確認訊息",
                   JOptionPane.YES_NO_OPTION,
                   JOptionPane.WARNING_MESSAGE);
        if (result==JOptionPane.YES_OPTION) {System.exit(0);}
        }    
      });
    }
  public void actionPerformed(ActionEvent e) {
    if (e.getSource()==cut) {text1.cut();}
    else if (e.getSource()==copy) {text1.copy();}
    else if (e.getSource()==paste) {text2.paste();}
    }

  }

此例中我們放置了兩個JTextField的:文本1與文本2,前者用來輸入資料以便剪下或複製,後者用來貼上剪下或複製之資料。當以滑鼠選擇部份文字,按剪下鈕時,該子字串會被移到剪貼簿,按下貼上鈕就會出現在下方的文本2文字欄位上,但按下複製鈕時,上方子字串仍在那裡,只是被複製一份到剪貼簿,按貼上就出現在下方欄位上。

以上便是JTextField的常用方法。JPassword跟JTextField的是類似的元件,都是單行文字欄位,差別是JPassword輸入時欄位上是顯示指定的字元(預設是黑色圓點),以保護密碼不被周遭的人偷看(其實?看鍵盤不就一樣會洩漏),如下列範例10所示:

測試範例10 :  http://mybidrobot.allalla.com/javatest/JPasswordField1.zip  [ 看原始碼]


沒有留言 :