1. 程式人生 > >Java學習之圖形化界面(Swing基礎)

Java學習之圖形化界面(Swing基礎)

clas 取消邊框 combobox rect 平臺 red eight 獲得 mbo

Java學習之圖形化界面(Swing基礎)

一、Java圖形化界面發展史

起初在早期的計算機系統中,電腦只提供命令行界面(CLI),現在在Windows中開個DOS窗口,就可以歷史足跡,這就是命令行界面在 現在Windows界面中的體現。

後來Apple公司率先在電腦的操作系統中實現了圖形化的用戶界面(Graphical User Interface,簡稱GUI),但由於Apple公司封閉的市場策略,自己完成電腦硬件、操作系統、應用軟件一條龍的產品,與其它PC不兼容。這使得Apple公司錯過了一次一統全球PC的好機會。

   後來,著名的Microsoft公司推出了風靡全球的Windows操作系統,它憑借著優秀的圖形化用戶界面,一舉奠定了操作系統標準的地位。這也造就了世界首富---比爾.蓋茨和IT業的泰山北鬥微軟公司。

  在圖形用戶界面風行於世的今天,一個應用軟件沒有良好的GUI是無法讓用戶接受的。而Java語言也深知這一點的重要性,它提供了一套可以輕松構建GUI的工具。

二、Java語言提供的GUI構建工具

  分為“組件”(component)和“容器”(container),光有“組件”是不能組裝成程序的,我們必須使用“容器”將這些“組件”裝配起來,使其成為一個整體。以我的理解來說,組件就是一個圖形化界面中的一個個組成元件,容器JFrame就是將這些元件容納進來,形成一個整體,組件在JFrame容器中進行布局,然後生成一個完整的圖形化界面。容器JDialog 是依附於組件上的對話框,當它所依賴的窗口或組件消失,對話框也將消失。比如點擊按鈕彈出確認鍵。

  Java中提供以下10種組件:

  • 標簽
  • 文本框
  • 列表框
  • 選擇框
  • 復選框
  • 按鈕
  • 單選按鈕
  • 滾動條
  • 畫布
  • 菜單

  Java語言是通過AWT(抽象窗口化工具包)和Java基礎類(JFC或更常用的Swing)來提供這些GUI組件的。

  其中Java.awt是最原始的GUI工具包,存放在java.awt包中。Java 1.0提供的AWT在所有的系統上表現得都不太好,而且限制頗多:只能使用四種字體,不能訪問存在於本地操作系統上的任何成熟的DUI組件,且AWT編程模型非常笨拙,並且不是面向對象的。(可能是最初版本的AWT是在一個月內構思、設計和實現的原因,借此說明精心設計的重要性!)現在有許多功能被已被Swing取代並得到了很大的增加與提高,因此一般我們很少再使用Java.awt,但是AWT中還是包含了最核心的功能,通常,一個Java的GUI程序至少還要使用下面幾個類:

  • java.awt.Color:基本顏色定義
  • java.awt.Font:基本字體定義
  • java.awt.Cursor:光標操作定義

  而Swing是JAVA提供的一組豐富的與平臺無關的方式來創建圖形用戶界面的庫。

  Swing特點

  • Swing中有一個令人稱道的原則,稱為“正交使用(orthogonality of use)”,意思是一旦了解了庫中的某個通用概念,就可以把這個概念應用到其他地方。比如標準的命名約定可以僅僅通過方法的名稱就能正確猜出其功能。再比如,通常可以把一個組件“插”到另一個組件裏面,而且能正常工作。
  • Swing自動支持鍵盤導航:可以不用鼠標運行Swing程序,而且不用額外編寫代碼。
  • Swing還支持稱為“可插式外觀”(pluggable look and feel),意思是用戶界面的外觀可以動態改變,以適應不同平臺和操作系統下用戶的習慣。

  Java中提供以下2種容器

  • 窗口(Form)
  • 對話框(Dialog)

三、組件(JComponent)

  Swing的整個可視組件庫的基礎構造塊是JComponent,它是所有組件的父類,並且是一個抽象類,所以我們不能直接創建JComponent對象,但是作為類層次結構的基礎。

  •   組件基本通用構成元素及設置方法

  以組件JLable jlable為例

(一)邊框

  組件默認的邊框是一個黑邊的矩形

  設置組件的邊框:

1 public void setBorder(Border border)

  該方法的參數是一個接口,必須向該參數傳遞一個實現接口Border類的實例。如果傳遞一個null,組件將取消邊框。

(二)顏色

1 public void setBackground(Color c)    //設置組件的背景色。
2 public void setForeground(Color c)    //設置組件的前景色。
3 public Color getBackground(Color c)  //獲取組件的背景色。
4 public Color getForeground(Color c)   // 獲取組件的前景色。
5 public Color(int red,int green,ing blue)    //創建一個顏色對象,其中red、green、blue的取值在0到255之間。

eg:

jlable.setForeground(Color.BLUE)    //設置組件的前景色為藍色。

(三)字體樣式、大小和顏色

public void setFont(Font f)   // 組件調用該方法設置組件上的字體。
public Font getFont(Font f)   // 組件調用該方法獲取組件上的字體。

  上述方法中用到了java.awt包中的Font類,Font類的構造方法是:

public Font(String name,int style,int size)     // 創建字體對象。name是字體樣式的名字,style決定字體的樣式(1是粗體,0是平常的),size是字體大小,取值是一個整數。

eg:

jlable.setFont(new Font("宋體",1,15)) //設置JLable字體為宋體,加粗,大小為15

(四)大小和位置

1 public void setSize(int width,int height)  //設置組件的大小。
2 public void setLocation(int x,int y)  //設置組件在容器中的位置,組件距容器的左、上邊界 x、y 個像素。
3 public Dimension getSize()  //返回一個Dimension對象的引用,該對象實體中當前組件的寬度和高度。
4 public Point getLocation(int x,int y)  //返回一個Point對象的引用,該對象實體中含有組件的左上角在容器的坐標系中的x坐標和y坐標。
5 public void setBounds(int x,int y,int width,int height)  //設置組件在容器中的位置和組件的大小。
6 public Rectangle getBounds()  //返回一個Rectangle對象的引用,該對象實體中含有當前組件左上角在容器坐標系中的x坐標和y坐標,寬度和高度。

(五)透明性

  組件默認是不透明的,我們可以通過方法:

1 public void setOpaque(boolean isOpaque)  

  設置組件是否不透明。isOpaque取false時,組件被設置為透明;isOpaque取true時組件被設置為不透明。

(六)激活與可見性

1 public void setEnabled(boolean b)
/*設置組件是否可被激活。
當參數b取值true時,組件可以被激活。 當參數b取值false 時,組件不可激活。 默認情況下,組件是可以被激活的。*/ 2 public void setVisible(boolean b)
/*設置組件在該容器中的可見性。
當b取值true時,組件在容器中可見。 當b取值false時,組件在容器中不可見。 除了Window型組件外,其它類型組件默認是可見的。*/
  • 組件的不同類型

(1)標簽(JLable)

  標簽組件,一般用來顯示信息,但沒有編輯功能。

  常用構造方法:

  • public JLabel():創建空標簽對象。
  • public JLabel(String text):創建帶文本的標簽對象。
  • public JLabel(String text, int aligment):創建帶文本的標簽對象,並設置文本對齊方式

  常用方法:

  • String getText():獲取標簽的名字。
  • void setText(String s):設置標簽的名字。

(2)文本框

技術分享圖片

  單行文本框

  用來建立文本框的組件,用戶可以在文本框中輸入單行的文本。

  常用構造方法:

  • JTextField(int x):創建文本框對象,可以在文本框中輸入若幹個字符,文本框的可見字符個數由參數x指定。
  • JTextField(String s):創建文本框對象,則文本框的初始字符串為s,可以在文本框中輸入若幹個字符。 常用方法: public void setText(String text):設置文本框中的文本為參數text指定的文本。 public String getText():獲取文本框中的文本。 public void setEditable(boolean b):指定文本框的可編輯性(默認為true-可編輯的)。 public void setHorizontalAlignment(int alignment):設文本在文本框中的對齊方式,其中alignment的有效值確定對齊方式,如:LEFT、CENTER、RIGHT。

  JPasswordField 密碼框

  用於接收密碼信息,輸入的文本不會以明文形式顯示出來。

  常用方法:

  • setEchoChar(char echoChar):設置回顯字符(默認的回顯字符是‘*’)。
  • char[] getPassword():獲取密碼框中的密碼。

  JTextArea 多行文本框

  用戶可以在文本區輸入多行的文本。

  常用構造方法:

  • JTextArea(int rows, int columns):構造一個可見行和可見列分別是rows、columns的文本區。

  常用方法:

  • setLineWrap(boolean b):決定輸入的文本能否在文本區的右邊界自動換行。
  • setWrapStyleWord(boolean b):決定是以單詞為界(b取true時)或以字符為界(b取false時)進行換行。
  • getText():獲取文本區的文本。
  • setText(String text):設置文本內容。
  • append(String text):尾部加文本。
  • insert(String text,int index):在文本區的指定位置處插入文本。
  • public void copy():拷貝選定的區域。
  • public void cut():剪切選定的區域。
  • public void paste():在指定的區域粘貼。

(3)列表框

  表格對象。(JTable)

  常用構造方法:

  • public JTable(Object[][] data , Object[] columnName)
    • 表格的視圖將以行和列的形式顯示數組data每個單元中對象的字符串表示。
    • 參數columnName用來指定表格的列名。
    • 用戶在表格單元中輸入的數據都被認為是一個Object對象。
    • 用戶通過表格視圖對表格單元中的數據進行編輯,以達到修改二維數組data中對應的數據。

  分組框(JComboBox)

  即下拉列表。用戶可以在下拉列表看到第一個選項和它旁邊的箭頭按鈕,當用戶單擊箭頭按鈕時,列表選項打開。

  常用構造方法:

  • public JComboBox():創建一個沒有選項下拉列表。

  常用方法:

  • public void addItem(Object anObject):增加選項。
  • public int getSelectedIndex():返回當前下拉列表中被選中的選項的索引,索引的起始值是0。
  • public Object getSelectedItem():返回當前下拉列表中被選中的選項。
  • public void removeItemAt(int anIndex):從下拉列表的選項中刪除索引值是anIndex 選項。
  • public void removeAllItems():刪除全部選項。 public void
  • addItemListener(ItemListener):向下拉列表增加ItemEvent事件的監視器。

(4)復選框(JCheckBox)

  復選框,提供兩種狀態,一種是選中,另一種是未選中,用戶通過單擊該組件切換狀態。如果不對復選框進行初始化設置,默認的初始化設置均為未選中。

  常用構造方法:

  • public JCheckBox():創建一個沒有名字的復選框。
  • public JCheckBox(String text):創建一個名字是text的復選框。

  常用方法:

  • public void setSelected(boolean b):設置按鈕狀態--是否選中
  • public boolean isSelected():如果復選框處於選中狀態該方法返回true,否則返回false。

(5)按鈕(JButton)

  按鈕組件

  常用構造方法:

  • public JButton(String text):創建名字是text的按鈕。
  • public JButton(Icon icon):創建帶有圖標icon的按鈕。
  • public JButton(String text, Icon icon):創建名字是text且帶有圖標icon的按鈕。

  常用方法:

  • public String getText():獲取當前按鈕上的名字。
  • public void setText(String text):重新設置當前按鈕的名字,名字由參數text指定。
  • public Icon getIcon():獲取當前按鈕上的圖標。
  • public void setIcon(Icon icon):重新設置當前按鈕上的圖標。
  • public void setHorizontalTextPosition(int textPosition):設置按鈕名字相對按鈕上圖標的水平位置。

  textPosition取值:

  SwingConstants.RIGHT

  SwingConstants.LEFT

  SwingConstants.CENTER

  SwingConstants.LEADING

  SwingConstants.TRAILING

  • public void setVerticalTextPosition(int textPosition):設置按鈕上名字相對按鈕上圖標的垂直位置。
  • public void addActionListener(ActionListener):按鈕對象調用該方法可以向按鈕增加動作監視器。
  • public void removeActionListener(ActionListener):按鈕對象調用該方法可以移去按鈕上的動作監視器。

(6)單選按鈕(JRadioButton)

  單選按鈕

  一組單選按鈕同一時刻只能有一個被選中。

  當創建了若幹個單選按鈕後,應使用ButtonGroup再創建一個對象,然後利用這個對象把這若幹個單選按鈕歸組。歸到同一組的單選按鈕每一時刻只能選一。

(7)菜單  

技術分享圖片

  Swing菜單由菜單條(JMenuBar)、菜單(JMenu)和菜單項(JMenuItem)構成。

  菜單條是所有菜單和菜單項的根(容器)。

   JMenuBar

   JMenuBar是JComponent類的子類,負責創建菜單條。

1 JMenuBar menuBar=new JMenuBar(); 

  將菜單條放置到JFrame窗口中:

1 public void setJMenuBar(JMenuBar menubar);

  需要註意的是,只能向窗口添加一個菜單條。

  JMenu

  JMenu是JComponent類的間接子類,負責創建菜單。

  構造方法:

  • pulbic JMenu():建立一個沒有標題的菜單。
  • pulbic JMenu(String title):建立一個指定標題菜單,標題由參數title確定

  常用方法:

  • add(MenuItem item):向菜單增加由參數item指定的菜單選項對象。
  • add(String s):向菜單增加指定的選項。
  • getItem(int n):得到指定索引處的菜單選項。
  • getItemCount():得到菜單選項數目。

eg:

  創建一個名為“Edit”的菜單,並添加到菜單條中:

1 JMenu editMenu=new JMenu(“Edit”);  
2 menuBar.add(editMenu); 

 JMenuItem

  JMenuItem是JComponent類的間接子類,負責創建菜單項。

  常用構造方法:

  • public JMenuItem(String s):構造有標題的菜單項。
  • public JMenuItem(String text, Icon icon):構造有標題和圖標的菜單項。 創建圖標對象 Icon icon=new ImageIcon(“圖標文件名”);

  常用方法:

  • public void setEnabled(boolean b):設置當前菜單項是否可被選擇。
  • public String getLabel():得到菜單選項的名字。
  • public void setAccelerator(KeyStroke keystroke):為菜單項設置快捷鍵。

  KeyStroke類靜態方法:

1 public static KeyStroke getKeyStroke(int keyCode, int modifiers)

  keyCode一般取值範圍:KeyEvent.VK_A~KeyEvent.VK_Z

   modifiers一般取值:InputEvent.ALT_MASK,InputEvent.CTRL_MASK,InputEvent.SHIFT_MASK

eg:

  創建一個菜單項,並將其放在“Edit”菜單裏:

1 JMenuItem pasteItem=new JMenuItem(“Paste”);   
2 editMenu.add(pasteItem);

  嵌入JMenu子菜單

  菜單項本身也可以是一個菜單,我們稱這樣的菜單項為子菜單。如:

1 JMenu editMenu = new JMenu(“Edit”);   
2 JMenu optionsMenu = new JMenu(“Options”);   
3 editMenu.add(optionsMenu);

  彈出式菜單(JPopupMenu)

  由JPopupMenu類負責創建,通常用於右鍵菜單。

  常用構造方法:

  • public JPopupMenu():構造無標題彈出式菜單。-
  • public JPopupMenu(String label):構造由參數label指定標題的彈出式菜單。

  常用方法:

  • public void show(Component invoker, int x, int y):設置彈出式菜單在組件invoker上的彈出的位置。

四、容器(container)

  以容器JFrame jframe為例

(一)JFrame

  JFrame類是一個頂層窗口,也是一個容器,允許將其他組件添加到它裏面,把它們組織起來,並把它們呈現給用戶。它有許多其他好處,我們先看最簡單的圖片:

  JFrame實際上不僅僅讓您把組件放入其中並呈現給用戶。比起它表面上的簡單性,它實際上是 Swing 包中最復雜的組件。為了最大程度地簡化組件,在獨立於操作系統的Swing組件與實際運行這些組件的操作系統之間,JFrame起著橋梁的作用。JFrame在本機操作系統中是以窗口的形式註冊的,這麽做之後,就可以得到許多熟悉的操作系統窗口的特性:最小化/最大化、改變大小、移動。

  常用構造方法:

  • JFrame():可以創建一個無標題的窗口
  • JFrame(String title):創建一個標題為title的窗口

  常用方法:

  • getTitle()/setTitle():獲取/設置窗口的標題。
  • getState/setState():獲取/設置窗口的最小化、最大化等狀態。
  • isVisible()/setVisible():獲取/設置窗口的可視狀態(即是否在屏幕上顯示)。
  • getLocation/setLocation():獲取/設置窗口在屏幕上應當出現的位置。
  • getSize()/setSize():獲取/設置窗口的大小。
  • setBounds():獲取/設置窗口出現在屏幕上時的初始位置與大小。
  • setResizable():設置窗口是否可調整大小,窗口默認是可調整大小的。
  • add():將組件添加到窗口中。
  • setDefaultCloseOperation() :設置單擊窗體右上角的關閉圖標後,程序會做出怎樣的處理。

(二)JDialog(對話框類)

技術分享圖片

  JDialog類是Window的子類。對話框必須要依賴於某個窗口或組件,當它所依賴的窗口或組件消失,對話框也將消失;當它所依賴的窗口或組件可見時,對話框又會自動恢復。   我們通過建立JDialog的子類來建立一個對話框類。不可以把組件直接添加到對話框中,不能為對話框設置布局,可以使用getContentPane()方法得到內容面板。

  對話框可分為無模式和有模式兩種:

  • 如果一個對話框是有模式的對話框,那麽當這個對話框處於激活狀態時,只讓程序響應對話框內部的事件,程序不能再激活它所依賴的窗口或組件,而且它將堵塞當前線程的執行,直到該對話框消失不可見。
  • 無模式對話框處於激活狀態時,程序仍能激活它所依賴的窗口或組件,它也不堵塞線程的執行。

  消息對話框:

  消息對話框是有模式對話框。

  進行一個重要的操作動作之前,最好能彈出一個消息對話框以確定操作。 可以用javax.swing包中的JOptionPane類的靜態方法:

1 public static void showMessageDialog (Component parentComponent,String message,String title, int messageType) 

   創建一個消息對話框。參數分別是對話框所依賴的組件、對話框上顯示的消息,對話框的標題,對話框的外觀。

  確認對話框:

  確認對話框是有模式對話框。

  可以用javax.swing包中的JOptionPane類的靜態方法創建一個確認對話框:

1 public static int showConfirmDialog (Component parentComponent,Object message,String title,int optionType)

  顏色對話框:

  可以用javax.swing包中的JColorChooser類的靜態方法:

1 public static Color showDialog (Component component,String title,Color initialColor)  

  創建一個顏色對話框。參數component指定對話框所依賴的組件,title指定對話框的標題;initialColor指定對話框返回的初始顏色。

  文件對話框:

  文件對話框提供從文件系統中進行文件選擇的界面。

  JFileChooser對象調用下列方法:

1  showDialog(Component parent,String s) 
2  showOpenDialog(Component parent)
3  showSaveDialog(Component parent)

  以上方法都可以使得一個有模式對話框顯示在桌面上,該對話框稱作文件對話框。

  文件對話框將在參數指定的組件parent的正前方顯示,如果parent為null,則在系統桌面的正前方顯示。

五、容器JFrame與組件的組合

1 add( )  //將組件添加到該容器中。
2 removeAll()   //移掉容器中的全部組件。
3 remove(Component c)   //移掉容器中參數指定的組件。
4 validate()  //每當容器添加新的組件或移掉組件時,調用該方法以保證容器中的組件能正確顯示出來。

eg:

jframe.add(jlable)  //將組件jlable添加到容器frame中

六、布局管理器

技術分享圖片

  作用:

  • 指定各個視圖組件在窗口中的分布位置,實現動態布局。
  • 有助於創建復合式的復雜界面,一個復合式界面由一些簡單的基本界面組成。

   布局管理器的類型:

  • 流布局管理器:FlowLayout
  • 邊界布局管理器:BoderLayout
  • 卡片式布局管理器:CardLayout
  • 網格布局管理器:GridLayout
  • 盒式布局管理器:BoxLayout

   我們使用方法 setLayout(LayoutManager) 來設計自己的布局。

   BorderLayout 邊界布局管理器

  這是Window型容器的默認布局,比如Jframe類、JDialog類。

  每個被BorderLayout管理的容器均被劃分為五個區域:東(EAST),南(SOUTH),西(WEST),北(NORTH),中(CENTER)。

  容器的每個區域,只能加入一個組件,如果試圖加入多個組件,其中只有一個組件是可見的。   對於東南西北這四個邊界區域,如果,其中的某個區域沒有用,它的大小將變為0,CENTER區域將擴展並占用該區域。

   在BorderLayout布局管理器的管理下,組建必須通過add()方法加入到容器的五個命名區域之一,否則它們是不可見的。方法:add(組件, 區域)

  FlowLayout 流式布局管理器

  將組件按照加入的順序逐個地放在容器中的一行上,一行放滿後再另起一個新行。

   每一行中的組件按布局指定的方式對齊方,默認情況下是居中對齊。

   FlowLayout布局管理器不強行設定組件的大小,而是允許組件擁有自己希望的大小。

  每個組件都有一個getPreferredSize()方法,容器布局管理器會調用此方法取得每個組件希望的大小。

  FlowLayout布局管理器是JPanle容器的默認布局管理器。

   GridLayout 網格式的布局管理器

  它將容器空間劃分成若幹行乘若幹列的網格,每個格放一個組件。

  各組件按照從上到下,從左至右的順序排列。

  使用GridLayout布局設計的一般步驟:

    1. 使用GridLayout的構造方法創建布局對象,指定劃分網格的行數和列數。
    2. 使用GridLayout布局容器調用方發add將組件加入容器。

  GridLayout布局中每個網格都是相同大小並且強制組件與網格相同大小。

  CardLayout 卡式布局管理器,

  可以容納多個組件,但是同一時刻容器只能從這些組件中選出一個來顯示,被顯示的組件占據容器的整個空間。

  選項卡窗格(JTabbedPane)的默認布局是CardLayout。

  BoxLayout 盒式布局管理器

  Box類創建的容器稱作一個盒式容器,盒式容器的的默認布局是盒式布局,而且不允許更改盒式容器的布局。

  行型盒式布局,特點:

  • 容器中組件的上沿在同一水平線上。
  • Box類的類方法createHorizontalBox()可以獲得一個具有行型盒式布局的盒式容器。
  • 行型盒式容器中組件間的間距:Box類調用靜態方法createHorizontalStrut(int width)可以得到一個不可見的水平Struct類型對象,稱做水平支撐。

  列型盒式布局,特點:

  • 容器中組件的左沿在同一垂直線上。
  • Box類的類方法createVerticalBox()可以獲得一個具有列型盒式布局的盒式容器。
  • 列型盒式容器中組件間的間距:Box類調用靜態方法createVertialStrut(int height)可以得到一個不可見的垂直Struct類型對象,稱做垂直支撐。

七、中間容器

技術分享圖片

  用來添加組件的輕容器,稱為中間容器。包括:

  • JPanel
  • JScrollPane
  • JSplitPane
  • JLayeredPane

  JPanel

  JPanel類用來創建一個面板對象,可以向這個面板添加組件(直接使用add方法)。

   使用時需要把這個面板添加到底層容器或其他中間容器中。

  JPanel面板的默認布局是FlowLayout布局。

   JScrollPane滾動窗格

  把一個組件放到一個滾動窗格中,然後通過滾動條來觀察這個組件。

  例如,JTextArea不自帶滾動條,如果希望使用帶滾動條的多行文本框,可把JTextArea放到一個滾動窗格中。

  JSplitPane 拆分窗格

  將容器拆分成兩部分,拆分窗格有兩種類型:

  • 水平拆分:用一條拆分線把容器分成左右兩部分,拆分線可以水平移動。
  • 垂直拆分:用一條拆分線分成上下兩部分,拆分線可以垂直移動。

  JLayeredPane 分層窗格

  如果添加到容器中的組件經常需要處理重疊問題,就可以將組件添加到JLayeredPane容器中。

  JLayeredPane將容器分成5個層,容器使用add(Jcomponent component, int layer)方法添加組件component,並指定component所在的層layer。

  layer取值:

  • DEFAULT_LAYER:最底層
  • PALETTE_LAYER
  • MODAL_LAYER
  • POPUP_LAYER
  • DRAG_LAYER:最上面的層

Java學習之圖形化界面(Swing基礎)