1. 程式人生 > >java-swing-基本元件

java-swing-基本元件

不亂於心,不困於情,不念過去,不懼將來

SWING

  • swing庫是AWT(Abstract Windowing Toolkit)的一個擴充套件,AWT是java 1.0為支援圖形程式設計而提供的一個包。在功能方面,Swing在其前身的基礎上做了很多改進:新元件,擴充套件的元件特性,更好的時間處理功能和可選擇的外觀.
  • Swing元件不同於AWT,它是完全由java實現的,這使得它比AWT具有更好的跨平臺相容性。
  • Swing的所有成員都是javax.swing包的一部分,使用swing,需要先用import匯入上述包。
  • Swing能夠讓我們使用作業系統的風格或者新的風格來建立java程式的介面。

swing元件分類

  • 頂層容器:JFrame、JApplet、JDialog、JWindow共4個
  • 中間容器:JPanel、JScrollPane、JSplitPane、JToolBar
  • 基本控制元件: ImageIcon(圖示),JLabel(標籤),ITextField(文字框),JTextArea(文字區域),JScrollPane(可滾動窗格),JScrollBar(滾動條),ICheckBox(複選框),JRadioButton(單選按鈕),JComboBox(下拉式列表和組合框)。

1、JFrame,JDialog,JWindow與JApplet這四個元件我們統稱為最上層(Top-Level)元件,因為其餘的Swing元件都必須依附在此四元件之一上才能顯示出來。
2、最上層的四個元件都實現了RootPaneContainer介面,RootPaneContainer定義了各種容器取得與設定的方法,這裡的容器包括JRootPane,GlassPane,LayeredPane,和ContentPane.

JRootPane的組成結構,並非繼承結構:
          JRootPane
             --Glass Pane
             --Layered Pane
                --Content Pane
                --Menu Bar

3、JRootPane包含有GlassPane 與 Layered Pane,而Layered Pane又包含有ContentPane與Menu Bar,其中程式設計者可選擇是否使用MenuBar,若沒有使用Menu Bar,則ContentPane就會佔據整個版面。
4、GlassPane:它是一個透明的面版,主要功能是它或以捕獲JFrame上的任何事件。GlassPane的預設值是不可看見的,不過可以將它設為看見的(visible),例如若要在GlassPane上做繪圖的工作,就可以在GlassPane上顯示出來!
5、四個上層元件類中都有一個預設容器為rootPane,rootPane是JRootPane型別的,但JRootPane型別並不算是真實的容器,我們不能在JRootPane上加入任何的元件!要加必須加在LayeredPane或者是LayeredPane 裡的ContentPane上。
6、LayeredPane:它是一個可以重疊元件的面版,本身就是一個容器,可以將它看成是相當多層的置物架,每一層都可以放置物品,而且上面的物品會遮隹下面的物品。
7、ContentPane:是最重要的,且是最常到的容器。它是LayeredPane中的一層,一般視為最底層。通常我們會將元件放在ContentPane上,而不會加在LayeredPane中,因為若將元件加入LayeredPane中必須自選管理元件間層次的關係,這會加重程式維護的困難度。若將元件放入ContentPane,對於像工具欄(ToolBar),PopupMenu等元件,Java會自動高速其層次關係。

建立介面

  1. 要建立Swing應用程式,首先要建立一個表示圖形介面的類。這個類的物件將被用作容器,用於放置要顯示的其他元件。
  2. 在大多數情況下,主介面是一個簡單的視窗(JWindow)或者是一個叫做框架的介面(JFrame類)。
  3. 視窗(JWindow)是一個容器,可被顯示到使用者介面上。簡單視窗沒有標題欄,最大化,最小化,和關閉按鈕,也沒有圖形使用者介面作業系統的視窗中最常用的其他元素。包括這些創口管理特性的視窗被稱為框架(JFrame)。

建立圖形swing應用程式的方式

  1. 把介面宣告為JFrame或JWindow的子類
			class MyJframe extends JFrame{
			}
  1. 在該類的構造方式中呼叫父類的構造方法來處理其設定。JFame有兩個建構函式JFrame(),JFrame(String),後者字串為標題欄。
  2. 設定框架視窗的大小,單位為畫素,呼叫其setSize方法設定框架視窗的大小,單位為畫素,呼叫其setSize方法。
  3. 決定視窗關閉視窗時如何辦決定視窗關閉視窗時如何辦。每個框架的標題欄都有最大化,最小化,和關閉按鈕,在java中,當框架被關閉時,正常情況下是讓程式繼續執行這樣必須呼叫框架的方法setDefaultCloseOperation(),這個方法有四種引數:EXIT_ON_CLOSE:框架被關閉時退出程式;DISPOSE_ON_CLOSE:框架被關閉時,釋放框架物件並繼續執行應用程式;DO_NOTHING_ON_CLOSE:開啟框架視窗並繼續執行程式;HIDE_ON_CLOSE:關閉框架視窗,並繼續執行程式。
  4. 顯示框架顯示框架 如果希望框架被建立後便顯示出來,可在構造方法中呼叫setVisible(true)或show()。
package SwingDemo;

import javax.swing.JFrame;

class MyJframe extends JFrame{
	/**通過該類可建立一個JFrame的框架
	 * 過載了建構函式,可選擇是否帶標題
	 */
	public MyJframe(String s,int len,int weight){
		   super(s);//標題
		   setSize(len,weight);//框架大小
		   setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);//關閉方式
		   setVisible(true);//建立時顯示
	}
	public MyJframe(int len,int weight){
		   super();
		   setSize(len,weight);
		   setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
		   setVisible(true);
	}
}
public class swingDemo {
	public static void main(String[] args) {
		  MyJframe myJframe = new MyJframe("主介面",100, 100);
	}
}

執行結果
框架圖

  1. 當建立一個JFrame元件時,系統會為此JFrame建立JRootPane元件,我們就可以任意地取得JRootPane上的GlassPane , Layered Pane或ContentPane,然後進行其它的操作。

swing元件

  1. 使用swing元件實際上是使用該元件的物件,我們可以通過呼叫構造方法來建立元件,然後呼叫相應的方法來正確的設定元件。
  2. 所有的swing元件都是抽象類JComponent的子類,後者包含用於設定組價大小,修改背景顏色,定義文字字型以及設定工具提示的方法。

建立元件其實就是建立該元件的物件,呼叫該元件的構造方法即可。

JButton btn1 = new JButton("這是一個按鈕");

使用元件

所有的swing元件都是抽象類JComponent的子類。所有的元件均從JComponent繼承了很多方法,常用方法有:

public void setSize(int width, int height)     //設定元件的大小
public Dimension getSize(Dimension rv)  //將此元件的寬度/高度儲存到“返回值”rv 。
public void setVisible(boolean b)               //設定元件是否可見
public void setEnabled(boolean enabled   //引數為true,啟用元件,否則禁用元件
public void setForeground(Color fg)          //設定此元件的前景色
public void setFont(Font font)                  //設定此元件的字型。 

在舊版中,swing元件不能直接新增到頂層容器上,必須新增到一個與Swing頂層容器相關的內容面板(content pane)上才能被顯示到使用者介面。

            JFrame frame = new JFrame();
              Container contentPane =frame.getContentPane();//獲得frame的內容面板
             JButton button = new JButton();
             contentPane.add(button);將按鈕新增到內容面板上
             或者
               JFrame frame = new JFrame();
              JButton button = new JButton();
               JPanel panel = new JPanel();//新建一個面板
		      panel.add(button);//把按鈕新增到該面板上
	         frame.setContentPane(panel);//將上述面板設為frame的內容面板

而新版本的JDK,直接在JFrame中可以呼叫add(元件)來新增元件,元件將被新增到contentPane。

          JFrame frame = new JFrame();
          JButton button = new JButton();
          frame.add(button);

按鈕

button的常用方法

public JButton()                    //建立不帶有設定文字或圖示的按鈕。 
public JButton(Icon icon)     //建立一個帶圖示的按鈕。 
public JButton(String text)  //建立一個帶文字的按鈕。 
public JButton(String text, Icon icon)//建立一個帶初始文字和圖示的按鈕。 
public void updateUI()     //根據當前外觀的值重置 UI 屬性。                     
package SwingDemo;

import javax.swing.JButton;
import javax.swing.JFrame;

class MyJframe extends JFrame{
	public MyJframe(String s,int len,int weight){
		   super(s);//標題
		   setSize(len,weight);//框架大小
		   setDefaultCloseOperation(DISPOSE_ON_CLOSE);//關閉方式
		
	}
}
public class swingDemo {
	public static void main(String[] args) {
		  MyJframe myJframe = new MyJframe("主介面",200, 200);
		  JButton btn1 = new JButton("按鈕1");
		  myJframe.getContentPane().add(btn1);
		 myJframe.setVisible(true);	  
	}
}

執行結果
執行圖

標籤(Jlabel)

  • 標籤是一個包含說明性文字,圖示,或兩者都有的使用者元件。可以使用Jlabel來建立標籤,它通常用來說明介面上其他元件的用途。使用者不能直接編輯

常用方法

構造方法概述
public JLabel()//建立無影象且標題為空的 JLabel。
public JLabel(Icon image)//建立具有指定影象的 JLabel 例項。
public JLabel(String text)//帶指定文字的標籤
public JLabel(String ,int)//帶指定文字的標籤和對齊方式的標籤
public JLabel(String ,Icon,int)//帶指定文字,圖示和指定對齊方式的標籤
方法概述
public void setText(String text)//設定標籤文字
public String getText() //獲得標籤文字
public void setIcon(Icon icon) //設定該元件上顯示的圖示
public Icon getIcon()              //獲得該元件上顯示的圖示

對齊方式有SwingConstants介面的三個靜態類變數來指定:LEFT,CENTER,RIGHT
例如:

 JLabel  lb1 = new JLabel("第一個標籤");
 JLabel lb2 = new JLabel("第二個標籤",SwingConstants.LEFT);//建立一個左對齊的標籤

文字框(JTextField)

  • 文字框是介面上的一塊區域,使用者可以通過鍵盤輸入,修改其中的內容,文字框能夠處理一行的內容。
    方法
構造方法概述
public JTextField()      //一個空的文字框
public JTextField(String text)   //一個指定文字的文字框
public JTextField(int columns) //一個指定寬度的文字框
public JTextField(String text,int columns)一個指定寬度,包含指定文字的文字框
方法概述
public void setHorizontalAlignment(int alignment)
//設定文字的水平對齊方式。有效值包括:JTextField.LEFT ,JTextField.CENTERJTextField.RIGHT,
JTextField.LEADING JTextField.TRAILING 
public int getHorizontalAlignment()   //返回文字的水平對齊方式。
public void setColumns(int columns)   //設定此 TextField 中的列數
public int getColumns()               //返回此 TextField 中的列數。 
public void setFont(Font f)          //設定當前字型。
public void setText(String t)        //設定文字值
public String getText()             //返回文字值

密碼框(JPasswordField)繼承了JTextFiled
public void setEchoChar(char c)  //使用指定字元隱藏輸入。
public char[] getPassword()   //返回此 TextComponent 中所包含的文字。
package SwingDemo;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JPasswordField;

public class swingDemo {
	public static void main(String[] args) {
	JFrame mainFrame = new JFrame("測試介面");
	     mainFrame.setSize(300, 300);
		 JPanel panel = new JPanel();
	   JPasswordField passwordField = new JPasswordField(10);
	   passwordField.setHorizontalAlignment(JPasswordField.CENTER);
	   passwordField.setEchoChar('*');
	   panel.add(passwordField);
		 mainFrame.setContentPane(panel);
		 mainFrame.setVisible(true);
	}
}

執行結果
測試結果

文字區域(JTextArea)

文字區域是能夠處理多行輸入的可編輯文字框
方法

構造方法
public JTextArea()    //一個空的文字框
public JTextArea(String text)   //構造顯示指定文字的新的 TextArea。
public JTextArea(int rows, int columns) //構造具有指定行數和列數的新的空 TextArea。
public JTextArea(String text,int rows, int columns)//構造具有指定文字、行數和列數的文字框
方法概述
public void setLineWrap(boolean wrap)//設定文字到達邊界,是否自動換行
public boolean getLineWrap()               //獲取文字區是否換行。
public void setWrapStyleWord(boolean word)設定換行方式,
//如果設定為 true,將當前單詞換到下一行,false將當前字元換到下一行
public int getLineCount()               //確定文字區中所包含的行數。 
public void append(String str)      //將給定文字追加到文件結尾。
public void insert(String str,  int pos)//將指定文字插入指定位置。
package SwingDemo;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class swingDemo {
	public static void main(String[] args) {
	JFrame mainFrame = new JFrame("測試介面");
	     mainFrame.setSize(300, 300);
		 JPanel panel = new JPanel();
	     JTextArea textArea = new JTextArea("this is a  JTextArea",5,10);
	    textArea.setEditable(true);
	    textArea.setLineWrap(true);
	    textArea.setWrapStyleWord(true);
	    panel.add(textArea);
		 mainFrame.setContentPane(panel);
		 mainFrame.setVisible(true);
	}
}

測試介面

滾動條(JScrollBar)

  • 滾動條讓使用者能夠選擇大型區域的一部分,已檢視其他的內容;通常用於行數很多,無法再圖形使用者介面中同時全部顯示出來的文字區域;
  • 使用者可以通過拖動兩個箭頭之間的滾動快來移動特定的位置。使用者單擊箭頭時,可移動較小的距離,在箭頭和滾動快之間單擊時,可移動較大的區域。
  • 有些Swing元件內建了滾動條功能,這包括可滑動窗格和列表框,也可單獨建立滾動條。

方法

構造方法概述
public JScrollBar()
		//建立一個垂直滾動條,預設值minimum = 0  maximum = 100 value = 0 extent = 10
		//  “跨度”(extent)是指可見區域的大小。它又被稱為“可見量”。 
public JScrollBar(int orientation)
		//方向有類常量決定,HORIZONTAL,VERTICAL
		//建立具有指定方向滾動條.預設值:minimum = 0  maximum = 100 value = 0 extent = 10
public JScrollBar(int orientation,int value, int extent, int min, int max)
		//建立具有指定方向、值、跨度、最小值和最大值的一個滾動條。
方法概述
public void setModel(BoundedRangeModel newModel)
		//設定處理滾動條的以下四個基本屬性的模型:minimum、maximum、value 和 extent。
public BoundedRangeModel getModel()
		//返回處理滾動條的四個基本屬性的資料模型:minimum、maximum、value 和 extent。 
public void setOrientation(int orientation)
		//將滾動條的方向設定為 VERTICAL 或 HORIZONTAL。
public int getOrientation()    //返回元件的方向(橫向或縱向)。 

可滾動窗格

  • Swing中的文字區域是不包含水平滾動條和垂直滾動條,單獨使用這種元件時,無法加入水平滾動條和垂直滾動條
  • Swing增加了一種新的容器:JScrollPane,可用來放置任何可滾動的元件,在可滾動窗格的構造方法中,可以將其與元件關聯起來
  • 滾動條可以使用ScrollPaneConstants的靜態類變數來設定。

使用方法

構造方法
public JScrollPane()
        //建立一個空的(無視口的檢視)JScrollPane,需要時水平和垂直滾動條都可顯示。 
public JScrollPane(int vsbPolicy, int hsbPolicy)
		//建立一個具有指定滾動條策略的空(無視口的檢視)
		//vsbPolicy - 指定垂直滾動條策略的一個整數 
		//hsbPolicy - 指定水平滾動條策略的一個整數
		//ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED     需要時顯示
		//ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER              從不顯示
		//ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS            一直顯示
public JScrollPane(Component view)
		//建立一個顯示指定元件內容的 JScrollPane,只要元件的內容超過檢視大小
		//就會顯示水平和垂直滾動條。 
public JScrollPane(Component view,int vsbPolicy,int hsbPolicy)
		//建立一個 JScrollPane,它將檢視元件顯示在一個視口中,
		//檢視位置可使用一對滾動條控制。滾動條策略指定滾動條在何時顯示,
方法概述
public void setHorizontalScrollBarPolicy(int policy)//設定水平滾動條策略
public int getHorizontalScrollBarPolicy()    //返回水平滾動條策略值。 
public void setVerticalScrollBarPolicy(int policy)//確定垂直滾動條何時顯示在滾動窗格上。
public int getVerticalScrollBarPolicy()  //返回垂直滾動條策略值。 
package SwingDemo;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class swingDemo {
	public static void main(String[] args) {
	JFrame mainFrame = new JFrame("測試介面");
	     mainFrame.setSize(300, 300);
		 JPanel panel = new JPanel();
		 JTextArea textArea = new JTextArea("this is a JTextArea with JScrollBar",3,5);
		JScrollPane scrollPane = new JScrollPane(textArea);
	    panel.add(scrollPane);
		 mainFrame.setContentPane(panel);
		 mainFrame.setVisible(true);
	}
}

執行結果

複選框(JCheckBox)和單選按鈕(JRadioButton)

(JCheckBox和JRadioButton的方法完全一致)

構造方法
JCheckBox() 
          建立一個沒有文字、沒有圖示並且最初未被選定的複選框。 
JCheckBox(Action a) 
          建立一個複選框,其屬性從所提供的 Action 獲取。 
JCheckBox(Icon icon) 
          建立有一個圖示、最初未被選定的複選框。 
JCheckBox(Icon icon, boolean selected) 
          建立一個帶圖示的複選框,並指定其最初是否處於選定狀態。 
JCheckBox(String text) 
          建立一個帶文字的、最初未被選定的複選框。 
JCheckBox(String text, boolean selected) 
          建立一個帶文字的複選框,並指定其最初是否處於選定狀態。 
JCheckBox(String text, Icon icon) 
          建立帶有指定文字和圖示的、最初未選定的複選框。 
JCheckBox(String text, Icon icon, boolean selected) 
          建立一個帶文字和圖示的複選框,並指定其最初是否處於選定狀態。 
方法概述
protected String paramString() //返回此 JCheckBox 的字串表示形式。
package SwingDemo;

import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

public class swingDemo {
	public static void main(String[] args) {
	JFrame mainFrame = new JFrame("測試介面");
	     mainFrame.setSize(300, 300);
		 JPanel panel = new JPanel();
	    JCheckBox checkBox = new JCheckBox("選擇1");
	    JRadioButton radioButton = new JRadioButton("選擇2");
	    panel.add(checkBox);
	    panel.add(radioButton);
		 mainFrame.setContentPane(panel);
		 mainFrame.setVisible(true);
	}
}

執行結果

  • 複選框和單選按鈕通常是非互斥的,即如果一個容器中有五個複選框,五個可以同時選中或不選中;為了使單選框互斥,必須將相關的元件分組。
  • 要將多個單選按鈕組織成一組,只允許每次選中其中一個,可以建立一個ButtonGroup物件。
package SwingDemo;

import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class swingDemo {
	public static void main(String[] args) {
	JFrame mainFrame = new JFrame("測試介面");
	     mainFrame.setSize(300, 300);
		 JPanel panel = new JPanel();
		 ButtonGroup buttonGroup =new ButtonGroup();
	    JCheckBox checkBox1 = new JCheckBox("選擇1");
	    buttonGroup.add(checkBox1);
	    panel.add(checkBox1);
	    JCheckBox checkBox2 = new JCheckBox("選擇2");
	    buttonGroup.add(checkBox2);
	    panel.add(checkBox2);
	    JCheckBox checkBox3= new JCheckBox("選擇3");
	    buttonGroup.add(checkBox3);
	    panel.add(checkBox3);
	     
		 mainFrame.setContentPane(panel);
		 mainFrame.setVisible(true);
	}
}

執行結果

下拉式列表和組合框(JComboBox)

  • JComboBox可建立兩種使用者介面元件:下拉式列表和組合框
  • 下拉式列表(也叫選擇列表)讓使用者能夠選擇列表中的一項。列表可被配置成僅當用戶單擊元件時才顯示,這樣在圖形使用者介面佔用的空間將更小。
  • 組合框是有附加特性的下拉式列表:有一個文字框,可用來提示響應資訊。
構造方法
JComboBox() 
          建立具有預設資料模型的 JComboBox。 
JComboBox(ComboBoxModel aModel) 
          建立一個 JComboBox,其項取自現有的 ComboBoxModel。 
JComboBox(Object[] items) 
          建立包含指定陣列中的元素的 JComboBox。 
JComboBox(Vector<?> items) 
          建立包含指定 Vector 中的元素的 JComboBox。 
方法概述
public void addItem(Object anObject)
         //為項列表新增項。僅當 JComboBox 使用可變資料模型時此方法才有效。
public void removeItem(Object anObject)
		//從項列表中移除項。僅當 JComboBox 使用可變資料模型時此方法才有效。
public void removeItemAt(int anIndex)
		//移除 anIndex 處的項。僅當 JComboBox 使用可變資料模型時此方法才有效。
public void removeAllItems()
		//從項列表中移除所有項。
public int getSelectedIndex()
		//返回列表中與給定項匹配的第一個選項。不存在返回-1 
public void setSelectedIndex(int anIndex)
		//選擇索引 anIndex 處的項。0代表第一項,-1代表沒選
public Object getSelectedItem()
		//返回當前所選項。
package SwingDemo;

import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class swingDemo {
	public static void main(String[] args) {
	JFrame mainFrame = new JFrame("測試介面");
	     mainFrame.setSize(300, 300);
		 JPanel panel = new JPanel();
		 String s[] =new String[]{"math","english","chinese","physics","chemistry"};
		JComboBox comboBox =new JComboBox(s);
		comboBox.addItem("biology");
		comboBox.removeItemAt(1);
	     panel.add(comboBox);
	     
		 mainFrame.setContentPane(panel);
		 mainFrame.setVisible(true);
	}
}

執行結果
執行結果