日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

swing入門教程

 liuyang_inf 2014-07-11

swing入門教程

swing簡介(2009-04-20 23:52:40)
標(biāo)簽:it  分類:Awt/Swing學(xué)習(xí)

(轉(zhuǎn)自http://terrificwanjun./)

UI 組件簡介

在開始學(xué)習(xí) Swing 之前,必須回答針對真正初學(xué)者的一個問題:什么是 UI?初學(xué)者的答案是用戶界面。但是因為本教程的目標(biāo)是要保證您不再只是個初學(xué)者,所以我們需要比這個定義更高級的定義。

所以,我再次提出這個問題:什么是 UI?您可能把它定義成您按下的按鈕、打字的地址欄 、打開和關(guān)閉的窗口,等等,這些都是 UI 的元素,但是除了在屏幕上看到的這些之外,還有更多都是 UI 元素。比如鼠標(biāo)、鍵盤、音量、屏幕顏色、使用的字體,以及一個對象相對于另一個對象的位置,這些都包含在 UI 之中。實際上,在計算機(jī)和用戶的交互之中扮演角色的任何對象都是 UI 的組成部分。這看起來足夠簡單,但是您應(yīng)當(dāng)驚訝的是,有許多人和大型公司已經(jīng)為它努力了很多年。實際上,現(xiàn)在有的大學(xué)專業(yè)的惟一課程就是研究這種交互。

Swing 的角色

Swing 是 Java 平臺的 UI —— 它充當(dāng)處理用戶和計算機(jī)之間全部交互的軟件。它實際上充當(dāng)用戶和計算機(jī)內(nèi)部之間的中間人。Swing 到底是如何做這項工作的呢?它提供了處理前面一節(jié)中描述的 UI 各方面內(nèi)容的機(jī)制:

  • 鍵盤:Swing 提供了捕捉用戶輸入的方法。
  • 顏色:Swing 提供改變在屏幕上看到的顏色的方法。
  • 打字的地址欄:Swing 提供了文本組件,處理所有普通任務(wù)。
  • 音量:Swing 不太擅長。

無論如何,Swing 為您提供了創(chuàng)建自己的 UI 所需要的所有工具

 

 

 

MVC

Swing 甚至走得更遠(yuǎn)一步,在基本的 UI 原則之上又放上了一個公共的設(shè)計模式。這個設(shè)計模式叫做模型-視圖-控制器(Model-View-Controller,MVC),它試圖把角色分開。MVC 讓負(fù)責(zé)顯示的代碼、處理數(shù)據(jù)的代碼、對交互進(jìn)行響應(yīng)并驅(qū)動變化的代碼彼此分離。

有點迷惑?如果我為這個設(shè)計模式提供一個現(xiàn)實世界的非技術(shù)性示例,它就比較容易了。請想像一次時裝秀。把秀場當(dāng)成 UI,假設(shè)服裝就是數(shù)據(jù),是展示給用戶的計算機(jī)信息?,F(xiàn)在,假設(shè)這次時裝秀中只有一個人。這個人設(shè)計服裝、修改服裝、同時還在 T 臺上展示這些服裝。這看起來可不是一個構(gòu)造良好的或有效率的設(shè)計。

現(xiàn)在,假設(shè)同樣的時裝秀采用 MVC 設(shè)計模式。這次不是一個人做每件事,而是將角色分開。時裝模特(不要與 MVC 縮寫中的模型混淆)展示服裝。他們扮演的角色是視圖。他們知道展示服裝(數(shù)據(jù)的)適當(dāng)方法,但是根本不知道如何創(chuàng)建或設(shè)計服裝。另一方面,時裝設(shè)計師充當(dāng)控制器。時裝設(shè)計師對于如何在 T 臺上走秀沒有概念,但他能創(chuàng)建和操縱服裝。時裝模特和設(shè)計師都能獨立地處理服裝,但都有自己的專業(yè)領(lǐng)域。

這就是 MVC 設(shè)計模式背后的概念:讓 UI 的每個方面處理它擅長的工作。如果您仍然不明白,那么教程后面的示例有望消除您的迷惑 —— 但是在您繼續(xù)進(jìn)行的時候,請記住基本的原則:用可視組件顯示數(shù)據(jù),同時讓其他類操縱數(shù)據(jù)。

JComponent

Swing 的整個可視組件庫的基礎(chǔ)構(gòu)造塊是 JComponent。它是所有組件的父類。它是一個抽象類,所以不能創(chuàng)建 JComponent,但是作為類層次結(jié)構(gòu)的結(jié)果,從字面意義來說它包含了數(shù)百個函數(shù),Swing 中的每個組件都可以使用這些函數(shù)。顯然,有些概念要比其他概念重要,所以對于本教程,需要學(xué)習(xí)的重要的東西是:

  • JComponent 不僅是 Swing 組件的基類,還是定制組件的基類(有關(guān)的更多信息在“中級 Swing”教程中)。
  • 它為所有組件提供了繪制的基礎(chǔ)架構(gòu) —— 一些方便進(jìn)行組件定制的東西(同樣,在“中級 Swing”中,有關(guān)于這個主題的更多信息)。
  • 它知道如何處理所有的鍵盤按鍵。所以類只需要偵聽特定的鍵。
  • 它包含 add() 方法,可以添加其他 JComponent。換種方式來看,可以把任意 Swing 組件添加到其他任何 Swing 組件,從而構(gòu)造嵌套組件(例如,JPanel 包含 JButton,甚至包含一些古怪的組合,例如 JMenu 包含 JButton)。

簡單的swing小部件

JLabel

Swing 庫中最基礎(chǔ)的組件是 JLabel。它所做的正是您所期望的:呆在那兒,看起來很漂亮,描述其他組件。下圖顯示了的 JLabel 實際應(yīng)用:

JLabel


不太吸引人,但是仍然有用。實際上,在整個應(yīng)用程序中,不僅把 JLabel 用作文本描述,還將它用作圖片描述。每當(dāng)在 Swing 應(yīng)用程序中看到圖片的時候,它就有可能是 JLabel。JLabel 對于 Swing 初學(xué)者來說沒有許多意料之外的方法?;镜姆椒òㄔO(shè)置文本、圖片、對齊以及標(biāo)簽描述的其他組件:

  • get/setText(): 獲取/設(shè)置標(biāo)簽的文本。
  • get/seticon(): 獲取/設(shè)置標(biāo)簽的圖片。
  • get/setHorizontalAlignment(): 獲取/設(shè)置文本的水平位置。
  • get/setVerticalAlignment(): 獲取/設(shè)置文本的垂直位置。
  • get/setDisplayedMnemonic(): 獲取/設(shè)置標(biāo)簽的訪問鍵(下劃線文字)。
  • get/setLableFor(): 獲取/設(shè)置這個標(biāo)簽附著的組件,所以當(dāng)用戶按下 Alt+訪問鍵時,焦點轉(zhuǎn)移到指定的組件。

 

 JButton

Swing 中的基本動作組件 JButton,是與每個窗口中都能看到的 OK 和 Cancel 一樣的按鈕;這些按鈕所做的正是您希望它們做的工作 —— 在單擊它們之后,將發(fā)生一些事情。到底會發(fā)生什么呢?您必須定義發(fā)生的內(nèi)容(請參閱 事件,以獲得更多信息)。一個 JButton 實例看起來如下所示:

JButton


用來改變 JButton 屬性的方法與 JLabel 的方法類似(您可能發(fā)現(xiàn),在大多數(shù) Swing 組件中,這些屬性都類似)。它們控制文本、圖片和方向:

  • get/setText(): 獲取/設(shè)置標(biāo)簽的文本。
  • get/seticon(): 獲取/設(shè)置標(biāo)簽的圖片。
  • get/setHorizontalAlignment(): 獲取/設(shè)置文本的水平位置。
  • get/setVerticalAlignment(): 獲取/設(shè)置文本的垂直位置。
  • get/setDisplayedMnemonic(): 獲取/設(shè)置訪問鍵(下劃線字符),與 Alt 按鈕組合時,造成按鈕單擊。

除了這些方法,我還要介紹 JButton 包含的另外一組方法。這些方法利用了按鈕的所有不同狀態(tài)。狀態(tài)是對組件進(jìn)行描述的一個屬性,通常采用真/假設(shè)置。在 JButton 中,可以包含以下可能狀態(tài):活動/不活動、選中/沒選中、鼠標(biāo)經(jīng)過/鼠標(biāo)離開、按下/沒按下,等等。另外,可以組合這些狀態(tài),例如按鈕可以在鼠標(biāo)經(jīng)過的同時被選中?,F(xiàn)在您可能會問自己用這些狀態(tài)到底要做什么。作為示例,請看看您的瀏覽器上的后退按鈕。請注意在鼠標(biāo)經(jīng)過它的時候,圖片是如何變化的,在按下該按鈕時,圖片又是如何變化的。這個按鈕利用了不同的狀態(tài)。每個狀態(tài)采用不同的圖片,這是提示用戶交互正在進(jìn)行的一種普遍并且有效的方式。JButton 上的狀態(tài)方法是:

  • get/setDisabledIcon()
  • get/setDisableSelectedIcon()
  • get/setIcon()
  • get/setPressedIcon()
  • get/setRolloverIcon()
  • get/setRolloverSelectedIcon()
  • get/setSelectedIcon()

 

JTextField

Swing 中的基本文本組件是 JTextField,它允許用戶在 UI 中輸入文本。我肯定您熟悉文本字段:要掌握本教程,則必須使用一個文本字段輸入用戶名和口令。您輸入文本、刪除文本、選中文本、把文字四處移動 —— Swing 替您負(fù)責(zé)所有這些工作。作為 UI 開發(fā)人員,利用 JJTextField 時,實際上并不需要做什么。

在任何情況下,這是 JTextField 實際使用時看起來的樣子:

JTextField


在處理 JTextField 時,只需要關(guān)注一個方法 —— 這應(yīng)當(dāng)是很明顯的,這個方法就是設(shè)置文本的方法: get/setText(),用于獲取/設(shè)置 JTextField 中的文本。

 

JFrame

迄今為止,我介紹了 Swing 的三個基本構(gòu)造塊:標(biāo)簽、按鈕和文本字段;但是現(xiàn)在需要個地方放它們,希望用戶知道如何處理它們。JFrame 類就是做這個的——它是一個容器,允許您把其他組件添加到它里面,把它們組織起來,并把它們呈現(xiàn)給用戶。它有許多其他好處,但是我認(rèn)為先看看它的圖片最簡單:

JFrame


JFrame 實際上不僅僅讓您把組件放入其中并呈現(xiàn)給用戶。比起它表面上的簡單性,它實際上是 Swing 包中最復(fù)雜的組件。為了最大程度地簡化組件,在獨立于操作系統(tǒng)的 Swing 組件與實際運行這些組件的操作系統(tǒng)之間,JFrame 起著橋梁的作用。JFrame 在本機(jī)操作系統(tǒng)中是以窗口的形式注冊的,這么做之后,就可以得到許多熟悉的操作系統(tǒng)窗口的特性:最小化/最大化、改變大小、移動。但是對于本教程的目標(biāo)來說,把 JFrame 當(dāng)作放置組件的調(diào)色板就足夠了??梢栽?JFrame 上調(diào)用的一些修改屬性的方法是:

  • get/setTitle(): 獲取/設(shè)置幀的標(biāo)題。
  • get/setState(): 獲取/設(shè)置幀的最小化、最大化等狀態(tài)。
  • is/setVisible(): 獲取/設(shè)置幀的可視狀態(tài),換句話說,是否在屏幕上顯示。
  • get/setLocation(): 獲取/設(shè)置幀在屏幕上應(yīng)當(dāng)出現(xiàn)的位置。
  • get/setsize(): 獲取/設(shè)置幀的大小。
  • add(): 將組件添加到幀中。

 

 

簡單應(yīng)用程序

就像所有的“x 入門教程一樣,本教程也包含必不可少的 HelloWorld 演示。但這個示例不僅對觀察 Swing 應(yīng)用程序如何工作有用,還對確保設(shè)置正確很有用。一旦使這個簡單的應(yīng)用程序能夠成功運行,那么之后的每個示例也將能夠運行。下圖顯示了完成后的示例:

HelloWorld 示例

第一步是創(chuàng)建類。將組件放在 JFrame 上的 Swing 應(yīng)用程序需要繼承JFrame 類,如下所示:

public class HelloWorld extends JFrame 

這樣做之后,就得到上面描述的所有 JFrame 屬性,最重要的是操作系統(tǒng)對窗口的本機(jī)支持。下一步是把組件放在屏幕上。在這個示例中,使用了一個 null 布局。在教程的后面部分,您將學(xué)到更多關(guān)于布局和布局管理器的內(nèi)容。但對于這個示例,可以用數(shù)字表示 JFrame 上的像素位置:

   public HelloWorld() 
   { 
      super(); 
      this.setSize(300, 200); 
      this.getContentPane().setLayout(null); 
      this.add(getJLabel(), null); 
      this.add(getJTextField(), null); 
      this.add(getJButton(), null); 
      this.setTitle("HelloWorld"); 
   } 
  
   private javax.swing.JLabel getJLabel() { 
      if(jLabel == null) { 
         jLabel = new javax.swing.JLabel(); 
         jLabel.setBounds(34, 49, 53, 18); 
         jLabel.setText("Name:"); 
      } 
      return jLabel; 
   } 
  
   private javax.swing.JTextField getJTextField() { 
      if(jTextField == null) { 
         jTextField = new javax.swing.JTextField(); 
         jTextField.setBounds(96, 49, 160, 20); 
      } 
      return jTextField; 
   } 
  
   private javax.swing.JButton getJButton() { 
      if(jButton == null) { 
         jButton = new javax.swing.JButton(); 
         jButton.setBounds(103, 110, 71, 27); 
         jButton.setText("OK"); 
      } 
      return jButton; 
   } 

現(xiàn)在組件都放在了 JFrame 上,并且需要在屏幕上顯示 JFrame,并讓應(yīng)用程序可以運行。就像在所有的 Java 應(yīng)用程序中一樣,必須添加一個 main 方法,才能讓 Swing 應(yīng)用程序運行。在這個 main 方法中,只需要創(chuàng)建 HelloWorld 應(yīng)用程序?qū)ο螅缓笳{(diào)用其setVisible()即可:

  
   public static void main(String[] args) 
   { 
      HelloWorld w = new HelloWorld(); 
      w.setVisible(true); 
   } 

完成了!這就是創(chuàng)建應(yīng)用程序的所有過程。

 

完整代碼如下:

 

package cn.edu.jnu.www;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
public class HelloWorld extends JFrame{
 private JLabel jLabel;
 private JTextField jTextField;
 private JButton jButton;
 
public HelloWorld()
{
   super();
   this.setSize(300, 200);
   this.getContentPane().setLayout(null);
   this.add(getJLabel(), null);
   this.add(getJTextField(), null);
   this.add(getJButton(), null);
   this.setTitle("HelloWorld");
}

private javax.swing.JLabel getJLabel() {
   if(jLabel == null) {
      jLabel = new javax.swing.JLabel();
      jLabel.setBounds(34, 49, 53, 18);
      jLabel.setText("Name:");
   }
   return jLabel;
}

private javax.swing.JTextField getJTextField() {
   if(jTextField == null) {
      jTextField = new javax.swing.JTextField();
      jTextField.setBounds(96, 49, 160, 20);
   }
   return jTextField;
}

private javax.swing.JButton getJButton() {
   if(jButton == null) {
      jButton = new javax.swing.JButton();
      jButton.setBounds(103, 110, 71, 27);
      jButton.setText("OK");
   }
   return jButton;
}


public static void main(String[] args)
{
   HelloWorld w = new HelloWorld();
   w.setVisible(true);
}

}




附加的swing小部件(上)

JComboBox

在這一節(jié)中,我將介紹 Swing 庫中的其他全部組件、如何使用它們、它們看起來是什么樣的,等等,這部分內(nèi)容應(yīng)當(dāng)讓您更好地了解 Swing 為 UI 開發(fā)人員提供了什么。

我們從 JComboBox 開始介紹。組合框與下拉選擇相似,區(qū)別在于使用組合框時用戶可以不從列表中選擇項目,還可以選擇一個(而且只有一個)項目。在某些版本的組合框中,還可以輸入自己的選擇。瀏覽器的地址欄就是一個示例:它是一個允許輸入自己選項的組合框。以下是 JComboBox 在 Swing 中看起來的樣子:

JComboBox
JComboBox

JComboBox 的重要函數(shù)包括 JComboBox 包含的數(shù)據(jù)。需要有一種方法來設(shè)置 JComboBox 中的數(shù)據(jù)、修改數(shù)據(jù)、在用戶選擇時得到用戶的選擇??梢允褂靡韵?JComboBox 方法:

  • addItem()添加一個項目到 JComboBox.
  • get/setSelectedIndex()獲取/設(shè)置 JComboBox 中選中項目的索引。
  • get/setSelectedItem()獲取/設(shè)置選中的對象。
  • removeAllItems()從 JComboBox 刪除所有對象。
  • remoteItem()從 JComboBox 刪除特定對象。

JTextField

JTextField 的一個細(xì)微變化是 JPasswordField,它允許您隱藏在文本字段區(qū)域中顯示的字符。畢竟,在您輸入口令的時候,如果每個人都能看到,那可沒什么好處?可能根本就不好,而且在私人數(shù)據(jù)如此脆弱的今天,您需要所有能夠得到的幫助。以下是 JPasswordField 在 Swing 中看起來的樣子:

JPasswordField
JPasswordField

JPasswordField 上額外的“安全性”方法對 JTextField 的行為做了輕微改變,所以不能閱讀文本:

  • get/setEchoChar()獲取/設(shè)置每次字符輸入時在 JPasswordField 中顯示的字符。在獲取口令時,不會返回“回聲”,而是返回實際的字符。

  • getText() 不應(yīng)當(dāng) 使用這個函數(shù),因為它會帶來可能的安全問題(String 會保存在內(nèi)存中,可能的堆棧轉(zhuǎn)儲會暴露口令)。

  • getPassword()這是從 JPasswordField 中獲得口令的恰當(dāng)方法,因為它返回一個包含口令的 char[]。為了保證恰當(dāng)?shù)陌踩?,?shù)組應(yīng)當(dāng)被清為 0,以確保它不會保留在內(nèi)存中。

 JCheckBox/JRadioButton

JCheckBox 和 JRadioButton 組件向用戶呈現(xiàn)選項,通常采用多選的格式。區(qū)別是什么?從實踐的角度來說,它們沒有那么不同。它們的行為方式相同。但是,在一般的 UI 實踐中,它們有細(xì)微差異:JRadioButton 通常組合在一起,向用戶呈現(xiàn)帶有必選答案的問題,而且這些答案具有強(qiáng)制性(這意味著問題只能有一個答案)。JRadioButton 的行為保證了這個用法。一旦選擇了JRadioButton,就不能取消對它的選擇,除非選擇了在同一組中的另外一個單選鈕。從效果上看,這就保證了選項的惟一和必選。JCheckBox 的不同在于,允許隨機(jī)地選擇/取消除選擇,并允許為問題選擇多個答案。

這里是個示例。問題“您是男孩還是女孩!”有兩個惟一答案選項“男孩”或“女孩”。用戶必須選擇一個,不能同時選中。另一方面,問題“您的習(xí)慣是什么?”的答案有“跑步”、“睡覺”或“閱讀”,不應(yīng)當(dāng)只允許為此問題選擇一個答案,因為人們可能有不止一個習(xí)慣。

把這些 JCheckBoxe 或 JRadioButton 捆綁成一組的類是 ButtonGroup 類。它允許把選項組織在一起(例如“男孩”和“女孩”),這樣,其中一個被選擇時,另外一個就自動取消選擇。

以下是 JCheckBox 和 JRadioButton 在 Swing 中看起來的樣子:

JCheckBox 和 JRadioButton
JCheckBox/JRadioButton

需要記住的重要的 ButtonGroup 方法是:

  • add()添加 JCheckBox 或 JRadioButton 到 ButtonGroup。
  • getElements()獲得 ButtonGroup 中的全部組件,允許對它們進(jìn)行迭代,找到其中選中的那個。

 JMenu/JMenuItem/JMenuBar

JMenu、JMenuItem 和 JMenuBar 組件是在 JFrame 中開發(fā)菜單系統(tǒng)的主要構(gòu)造塊。任何菜單系統(tǒng)的基礎(chǔ)都是 JMenuBar。它平淡而乏味,但卻是必需的,因為每個 JMenu 和 JMenuItem 都要用它構(gòu)建。要用 setJMenuBar() 方法把 JMenuBar 附著到 JFrame。一旦將它附加到 JFrame 中,就可以添加所有想要的菜單、子菜單和菜單項。

JMenu/JMenuItem 的區(qū)別看起來可能很明顯,但實際上,在幕后看起來并不像表面那樣??纯搭惖念悓哟谓Y(jié)構(gòu),就知道JMenuJMenuItem 的子類。但是,在表面上,它們是有區(qū)別的:用 JMenu 包含其他 JMenuItem 和 JMenu;JMenuItem 在選中時觸發(fā)操作。

JMenuItem 也支持快捷鍵的概念。與您用過的大多數(shù)應(yīng)用程序一樣,Swing 應(yīng)用程序允許您按下 Ctrl+(某個鍵)來觸發(fā)一個操作,就像選中菜單鍵本身一樣。想想用來剪切和粘貼的快捷鍵 Ctrl+X 和 Ctrl+V。

除此之外,JMenu 和 JMenuItem 都支持訪問鍵。用 Alt 鍵與某個字母關(guān)聯(lián),模擬菜單本身的選擇(例如,在 Windows 中按下 Alt+F,然后按下 Alt+x 就可以關(guān)閉應(yīng)用程序)。

以下是包含 JMenu 和 JMenuItem 的 JMenuBar 在 Swing 中的樣子:

JMenuBar、JMenu 和 JMenuItem
JMenuBar/JMenu/JMenuItem

這些類需要的重要方法是:

  • JMenuItem and JMenu:
    • get/setAccelerator()獲取/設(shè)置用作快捷鍵的 Ctrl+鍵。
    • get/setText()獲取/設(shè)置菜單的文本。
    • get/setIcon()獲取/設(shè)置菜單使用的圖片。


  • JMenu 專用:
    • add()添加另外一個 JMenu 或 JMenuItem 到 JMenu(創(chuàng)建嵌套菜單)。

 JSlider

在應(yīng)用程序中 JSlider 支持?jǐn)?shù)值變化。它是一種迅速而簡單的方式,不僅能讓用戶以可視形式獲得他們當(dāng)前選擇的反饋,還能得到可以接受的值的范圍。想像一下這種情況:可以提供一個文本字段,允許用戶輸入值,但是這樣做就帶來了額外的麻煩,要確保輸入的值是數(shù)字,還要確保數(shù)字符合要求的數(shù)值范圍。例如,如果有一個金融 Web 站點,它向您提問要在股票上投資的百分比,那么您不得不檢查在文本字段中輸入的值,以確保它們是數(shù)字,而且在 0 到 100 之間。如果換用 JSlider,那么就可以確保選擇的是指定范圍內(nèi)的數(shù)字。

在 Swing 中,JSlider 看起來如下所示:

JSlider
JSlider

JSlider 中的重要方法是:

  • get/setMinimum()獲取/設(shè)置可以選擇的最小值。
  • get/setMaximum()獲取/設(shè)置可以選擇的最大值。
  • get/setOrientation()獲取/設(shè)置 JSlider 是上/下還是左/右滾動條。
  • get/setValue()獲取/設(shè)置 JSlider 的初始值。

 JSlider

與 JSlider 非常像,可以用 JSpinner 允許用戶選擇一個整數(shù)值。JSlider 的一個主要優(yōu)勢就是比 JSlider 的空間緊湊。但是,它的不足就是無法方便地設(shè)置其邊界。

但是,兩個組件之間的比較僅此而已。JSpinner 更加靈活,可以用來在任意組的值之間進(jìn)行選擇。除了在數(shù)字間選擇,它還可以用來在日期、名稱、顏色和任何事之間進(jìn)行選擇。這使 JSpinner 極為強(qiáng)大,允許您提供其中只包含預(yù)定義的選擇的組件。使用這種方式,它與 JComboBox 類似,但是它們的應(yīng)用不能互換。只應(yīng)把 JSpinner 用在邏輯上連續(xù)的選擇 —— 數(shù)字和日期是最合邏輯的選擇。而另一方面,在呈現(xiàn)看起來隨機(jī)的選擇并且選擇之間沒有連接的時候,JComboBox 是更好的選擇。

JSpinner 看起來如下所示:

JSpinner
JSpinner

重要方法是:

  • get/setValue()獲取/設(shè)置 JSpinner 的初始值,在基本實例中,需要是整數(shù)。
  • getNextValue()獲取按下上箭頭按鈕之后應(yīng)當(dāng)選中的下一個值。
  • getPreviousValue()獲取按下下箭頭按鈕之后應(yīng)當(dāng)選中的前一個值。

 JToolBar

JToolBar 充當(dāng)其他組件(JButton、JComboBoxe 等)的調(diào)色板,共同構(gòu)成您在大多數(shù)應(yīng)用程序中熟悉的工具欄。工具欄允許程序把常用的命令放在可以迅速發(fā)現(xiàn)的位置,并把它們以常用命令組的形式組合在一起。一般(但不總是這樣)情況下,工具欄按鈕在菜單欄中會有對應(yīng)的命令。雖然這不是必需的,但已經(jīng)變成了一種公共實踐,您也應(yīng)當(dāng)試著這么做。

JToolBar 也提供了您在其他工具欄中看到過的其他功能:“浮動”的能力(也就是成為主幀頂部獨立的幀)。

下圖顯示了一個非浮動 JToolBar:

非浮動 JToolBar
非浮動 JToolBar

對于 JToolBar,要記住的重要方法是:is/setFloatable(),它獲取/設(shè)置 JToolBar 是否可以浮動。

 JToolTip

您可能到處都看到過 JToolTip,但是從來不知道它們叫什么。它們就像您鞋帶上的塑料部件 —— 到處都有,但是您就是不知道它們正確的名字(如果您想知道,那么可以叫它們 金屬箍)。JToolTip 就是您將鼠標(biāo)停留在某個東西上面的時候彈出來的小“泡泡”。它們在應(yīng)用程序中可能非常有用,可以為難用的項目提供幫助、擴(kuò)展信息,甚至在擁擠的 UI 中顯示某個項目的完整文本。在 Swing 中,可以通過把鼠標(biāo)放在某個組件上的特定時間來觸發(fā)它們;它們通常在鼠標(biāo)處于不活動狀態(tài)大約 1 秒鐘之后顯示。只要鼠標(biāo)還停留在那個組件上,它們就保持可見。

JToolTip 的重要部分是它的易用性。setToolTip() 方法是 JComponent 類中的一個方法,這意味著每個 Swing 組件都能有一個與之關(guān)聯(lián)的工具提示。雖然 JToolTip 本身也是一個 Swing 類,但目前,對于您的需要,它確實沒有提供更多功能,而且本身也不該被創(chuàng)建??梢酝ㄟ^調(diào)用 JComponent 的 setToolTip() 函數(shù)訪問和使用它。

以下是 JToolTip 看起來的樣子:

A JToolTip
JToolTip



附加的swing小部件(下)

JOptionPane

JOptionPane 是在 Swing 中類似“快捷方式”的東西。通常,作為 UI 開發(fā)人員,您需要向用戶呈現(xiàn)快速信息,讓用戶了解錯誤和信息。甚至可能想得到一些快速數(shù)據(jù),例如名稱或數(shù)字。在 Swing 中,JOptionPane 類為這些東西提供了快捷方式,但這并不是它必須完成的任務(wù)。不需要讓每個開發(fā)人員重頭開始重復(fù)相同的工作,Swing 已經(jīng)提供了這個基本的但很有用的類,為 UI 開發(fā)人員提供了獲取和接收簡單消息的簡易方法。

以下是一個 JOptionPane:

JOptionPane
JOptionPane

使用 JOptionPane 時有點麻煩的是可以使用的全部選項。雖然簡單,但是它仍然提供了大量選項,這些選項有可能造成混淆。學(xué)習(xí) JOptionPane 的最好方法就是使用它;編寫代碼,觀察彈出的是什么。這個組件幾乎可以讓您修改它的每一方面:幀標(biāo)題、消息本身、顯示的圖標(biāo)、按鈕選項,以及是否需要文本響應(yīng)。因為有太多的可能性,無法在本教程中一一列舉它們,所以您最好是訪問 JOptionPane 的 API 頁面,查看它的眾多可能性。

 JTextArea

JTextArea 比 JTextField 更進(jìn)了一步。JTextField 被局限在一行文本中,而 JTextArea 擴(kuò)展了這個能力,支持多行文本??梢园阉胂癯梢粋€空白頁,您可以在其中的任意地方進(jìn)行輸入。正如您可能猜到的,JTextArea 包含許多與 JTextField 相同的功能,畢竟,它們實際上是相同的組件。但是 JTextArea 提供了一些額外的重要功能,可以把它區(qū)別開。這些功能包括單詞自動換行的能力(即把長文本自動換行到下一行,而不是將單詞從中斷開)、對文本自動換行的能力(即把長的文本行移動到下一行,而不是創(chuàng)建一個需要水平滾動條的非常長的行)。

Swing 中的 JTextArea 看起來就像您期望的那樣:

A JTextArea
JTextArea

支持行和單詞的自動換行的重要方法是:

  • is/setLineWrap()設(shè)置在行過長的時候是否要自動換行。
  • is/setWrapStyleWord()設(shè)置在單詞過長的時候是否要把長單詞移到下一行。

 JScrollPane

上面的示例構(gòu)造完成之后,假設(shè) JTextArea 包含太多文本,而給定的空間中容納不下,那這該怎么辦?如果您以為會自動出現(xiàn)滾動條,那么很不幸,您錯了。JScrollPane 添補(bǔ)了這個空白,為 Swing 組件提供了處理所有與滾動條相關(guān)的動作。所以雖然為每個需要的組件提供滾動塊可能有些痛苦,但是一旦添加了它,它就會自動處理每件事,包括在需要的時候隱藏/顯示滾動條。

除了用需要自動換行的組件創(chuàng)建 JScrollPane 之外,不必直接處理它。根據(jù)上面的示例,用 JTextArea 調(diào)用 JScrollPane 的構(gòu)造函數(shù),這為 JTextArea 創(chuàng)建了在文本過長時滾動的能力:

 JScrollPane scroll = new JScrollPane(getTextArea()); add(scroll); 

更新后的示例看起來如下所示:

JScrollPane 示例
JScrollPane

JScrollPane 也公開了它將創(chuàng)建的兩個 JScrollBar。這些 JScrollBar 組件也包含一些方法,可以用這些方法來修改組件的行為(雖然它們不在本教程的范圍之內(nèi))。

使用 JScrollPane 需要的方法是:

  • getHorizontalScrollBar()返回水平的 JScrollBar 組件。
  • getVerticalScrollBar():返回垂直的 JScrollBar 組件.
  • get/setHorizontalScrollBarPolicy()這個“策略”可以是以下三個之一:Always、Never 或 As Needed。
  • get/setVerticalScrollBarPolicy()與水平函數(shù)相同。

JList

 

JList 是一個有用的組件,用于向用戶呈現(xiàn)許多選擇??梢园阉?dāng)作 JComboBox 的擴(kuò)展。JList 提供了更多選擇,并添加了多選的能力。在 JList 與 JComboBox 之間進(jìn)行選擇通常取決于以下兩個特性:如果需要多選,或者選擇的選項超過 15 個(雖然這個數(shù)字并不是通用規(guī)則),那么就應(yīng)當(dāng)選擇 JList。

應(yīng)用將 JList 與 JScrollPane 結(jié)合使用,就像上面演示的那樣,因為它能夠呈現(xiàn)比它的空間所能容納的更多的選項。

JList 包含選擇模型的概念(在 JTable 中也會看到),在這里,可以設(shè)置 JList 接受不同類型的選擇。這些類型是:單一選擇(只能選擇一項)、單一間隔選擇(只能選擇相鄰選項),以及任意多項或者多項間隔選擇(可以選擇任意數(shù)量、任意組合的選擇)。

JList 是第一個我稱為 “復(fù)雜組件” 的組件,該復(fù)雜組件還包含 JTable 和 JTree,它們支持大量的定制變化,其中包括改變 UI 的表現(xiàn)方式、處理數(shù)據(jù)的方式。因為本教程只是想介紹基礎(chǔ)知識,所以我不想深入這些更高級的功能,但是在使用這些組件時有件事需要記住 —— 它們帶來的挑戰(zhàn)要比目前為止介紹過的所有組件都大。

JList 在 Swing 中看起來如下所示:

JList
JList

JList 中有許多處理數(shù)據(jù)的函數(shù),而且根據(jù)我的說法,這些也只不過是使用 JList 的細(xì)節(jié)的皮毛而已。以下是一些基本方法:

  • get/setSelectedIndex()獲取/設(shè)置列表中選中的行;在多選擇列表的情況下,返回一個 int[]。
  • get/setSelectionMode()與上面解釋的一樣,獲取/設(shè)置選擇模式,模式有:單一、單一間隔和多選間隔。
  • setListData()設(shè)置在 JList 中使用的數(shù)據(jù)。
  • get/setSelectedValue()獲得選中的對象(與選中行號對應(yīng))。

 JTable

在考慮 JTable 時,請想像一下一個 Excel 工作表,這樣就可以對 JTable 在 Swing 中的作用有一個清晰的印象。它與工作表共享許多相同的特征:單元格、行、列、移動列、隱藏列等。JTable 把 JList 的想法更進(jìn)了一步。它不是在一列中顯示數(shù)據(jù),而是在多列中顯示數(shù)據(jù)。讓我們以人為例。JList 只能顯示人的一個屬性 —— 例如他或她的名字。而 JTable 就能夠顯示多個屬性 —— 名字、年齡、地址,等等。JTable 是支持提供數(shù)據(jù)的大多數(shù)信息的 Swing 組件。

不幸的是,作為代價,JTable 也是最難對付的 Swing 組件。許多 UI 開發(fā)人員都為了學(xué)習(xí) JTable 的每個細(xì)節(jié)而頭痛。在這里,我希望我把能把您解救出來,只用您的 JTable 知識處理問題。

許多 JList 中的概念也擴(kuò)展到了 JTable,其中包括不同的選擇間隔的概念。但是 JList 中一列的概念變成了 JTable 的單元格的概念。這意味著在 JTable 中進(jìn)行選擇時會有不同的方式,例如列、行或者一個單元格。

在 Swing 中,JTable 看起來如下所示:

JTable
JTable

最后,JTable 的大多數(shù)函數(shù)都超出本教程的范圍;“中級 Swing”會深入這個復(fù)雜組件的更多細(xì)節(jié)。

 JTree

JTree 是另外一個復(fù)雜組件,它不像 JTable 那樣難用,但是也不像 JList 那么容易。使用 JTree 時麻煩的部分是它要求的數(shù)據(jù)模型。

JTree 的功能來自樹的概念,樹有分支和葉子。您在 Windows 中使用 IE 瀏覽器時,可能非常熟悉這個概念 —— 可以展開和折疊分支,顯示可以選擇和取消選擇的不同葉子。

您很有可能發(fā)現(xiàn)樹在應(yīng)用程序中不像表格或列表那樣有用,所以在 Internet 上沒有許多有幫助的這方面的示例。實際上,像 JTable 一樣,JTree 沒有什么入門級的功能。如果決定使用 JTree,那么立即就可以達(dá)到中級水平,當(dāng)然還必須學(xué)習(xí)隨之而來的概念。因此,示例應(yīng)用程序沒有介紹 JTree,所以也很不幸,不管是入門教程還是中級教程,都沒有涉及這個不太流行的組件。

但是,樹有一些時候是符合需求的合理的 UI 組件。文件/目錄系統(tǒng)就是一個示例(就像在 IE 瀏覽器中那樣),而且當(dāng)數(shù)據(jù)采取層次結(jié)構(gòu)的時候,也就是說數(shù)據(jù)采用樹的形式的時候,JTree 就是最佳組件。

在 Swing 中,JTree 看起來如下所示:

JTree
JTree



Swing概念

布局、模型和事件

既然您已經(jīng)知道了大多數(shù)(肯定不是全部)可以用來制作 UI 的組件,那么就必須實際用它們做些什么。您不能只是隨意地把它們放在屏幕上,然后就指望它們立即就能工作。您必須把它們放在特定的點上,對它們的交互作出反應(yīng),然后根據(jù)交互更新它們,用數(shù)據(jù)填充它們。要填滿 UI 知識的這片空白,還需要更多地學(xué)習(xí) UI 的其他重要部分。

所以,讓我們來研究以下內(nèi)容:

 

  • 布局:Swing 包括許多布局,布局也是類,負(fù)責(zé)處理組件在應(yīng)用程序中的擺放位置,以及在應(yīng)用程序改變尺寸或者刪除、添加組件時對組件進(jìn)行相應(yīng)處理。

  • 事件:您需要對按下按鈕、單擊鼠標(biāo)和用戶在 UI 上能做的每件事進(jìn)行響應(yīng)。想像一下,如果不能響應(yīng)會發(fā)生什么 —— 用戶單擊之后,什么變化也沒有。

  • 模型: 對于更高級的組件(列表、表格和樹),以及一些像 JComboBox 這樣的更容易的組件來說,模型是處理數(shù)據(jù)最有效的途徑。它們把大部分處理數(shù)據(jù)的工作從實際的組件本身撤出來(請回想一下前面討論的 MVC),并提供了一個公共數(shù)據(jù)對象類(例如 VectorArrayList)的包裝器。

簡單布局

就像在前面提到過的,布局替您處理組件在應(yīng)用程序中的擺放。您的第一個問題可能是“為什么不能用像素告訴它應(yīng)當(dāng)在什么地方呢?”是的,您可以這樣做,但是在窗口改變大小的時候,或者更糟一些情況,即用戶改變其屏幕的分辨率的時候,亦或在有人想在其他操作系統(tǒng)上試用應(yīng)用程序的時候,您立刻就會遇到麻煩。布局管理器把這些擔(dān)心一掃而空。不是每個人都用相同的設(shè)置,所以布局管理器會創(chuàng)建“相對”布局,允許您指定組件相對于其他組件的擺放方式,決定事物改變尺寸的方式。這是好的部分:比聽起來更容易。只要調(diào)用 setLayout(yourLayout) 設(shè)置布局管理器即可。后面對 add() 的調(diào)用可以將組件添加到容器中,并讓布局管理器負(fù)責(zé)將它放在應(yīng)當(dāng)?shù)奈恢蒙稀?/p>

目前在 Swing 中包含了大量布局;看起來好象每次發(fā)布都會有一個新布局負(fù)責(zé)不同的目的。但是,有些經(jīng)過實踐檢驗的布局一直存在,而且會永遠(yuǎn)存在,我指的是永遠(yuǎn) —— 因為從 1995 年 Java 語言的第一個發(fā)行版開始,就有這些布局。這些布局是:FlowLayout、GridLayout 和 BorderLayout。

FlowLayout 從左到右安排組件。當(dāng)空間不足時,就移到下一行。它是使用起來最簡單的布局,因此,也就是能力最弱的布局:

 setLayout(new FlowLayout()); add(new JButton("Button1")); add(new JButton("Button2")); add(new JButton("Button3")); 

FlowLayout 實例
FlowLayout

GridLayout 就像您想像的那樣工作:它允許指定行和列的數(shù)量,然后在添加組件時把組件放在這些單元格中:

 setLayout(new GridLayout(1,2)); add(new JButton("Button1")); add(new JButton("Button2")); add(new JButton("Button3")); 

GridLayout 實例
GridLayout

即使 Swing 中添加了許多新的布局管理器,BorderLayout 仍然是其中非常有用的一個。即使有經(jīng)驗的 UI 開發(fā)人員也經(jīng)常使用 BorderLayout。它使用東、南、西、北、中的概念在屏幕上放置組件:

 setLayout(new BorderLayout()); add(new JButton("Button1"), "North"); add(new JButton("Button2"), "Center"); add(new JButton("Button3"), "West"); 

BorderLayout 實例
BorderLayout

 GridBagLayout

雖然上面的示例對于簡單的布局來說很好,但是更高級的 UI 需要更高級的布局管理器。這是 GridBagLayout 發(fā)揮作用的地方。不幸的是,使用它的時候極易混淆、極為困難,每個曾經(jīng)用過它的人都會同意這點。我也不能反對;但是除了它的困難之外,它可能是用 Swing 內(nèi)置的布局管理器創(chuàng)建漂亮 UI 的最好方式。

以下是我的第一個小建議:在最新版的 Eclipse 中,有內(nèi)置的可視化構(gòu)建器,這個個小建議可以自動根據(jù)每個屏幕的需要來構(gòu)建必需的 GridBagLayout 代碼。請使用這個功能!它會節(jié)約無數(shù)為了讓數(shù)字正確而浪費的時間。所以在我用這一節(jié)解釋 GridBagLayout 如何工作、如何調(diào)整它才能讓它做得最好時,建議您去找一個可視化構(gòu)建器并生成代碼。它會節(jié)約您的工作時間

事件

最后,我們來到 Swing 最重要的一部分:處理事件,對 UI 的交互作出反應(yīng)。Swing 用事件/偵聽器模型處理事件。這個模型的工作方式是:允許某個類登記到某個組件的某個事件上。登記到事件的這個類叫做偵聽器,因為它等候組件的事件發(fā)生,而且在事件發(fā)生時采取行動。組件本身知道如何“激活”事件(即,知道它能生成的交互類型,以及如何讓偵聽器知道這個交互什么時候發(fā)生)。組件與包含有關(guān)交互信息的事件和類針對交互進(jìn)行通信。

把技術(shù)方面的空談放在一邊,我們來看幾個 Swing 中事件的實例。首先從最簡單的示例開始,即一個 JButton,按下它的時候,會在控制臺上輸出“Hello”。

JButton 知道它什么時候被按下;這是在內(nèi)部處理的,不需要代碼處理它。但是,偵聽器需要進(jìn)行登記,以接收來自 JButton 的事件,這樣您才能輸出“Hello”。listener 類通過實現(xiàn) listener 接口然后調(diào)用 JButton 上的 addActionListener() 做到這一點:

 // Create the JButton JButton b = new JButton("Button"); // Register as a listener b.addActionListener(new HelloListener()); class HelloListener implements ActionListener { // The interface method to receive button clicks public void actionPerformed(ActionEvent e) { System.out.println("Hello"); } } 

JList 也用類似的方式工作。當(dāng)有人在 JList 中選中什么時,您可能想把選中的對象輸出到控制臺上:

 // myList is a JList populate with data myList.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { Object o = myList.getSelectedItem(); System.out.println(o.toString()); } } ); 

從這兩個示例,您應(yīng)當(dāng)能夠理解事件/偵聽器模型在 Swing 中如何工作了。實際上,Swing 中的每個交互都是以這種方式處理的,所以通過理解這個模型,您就立即能夠理解在 Swing 中如何處理每個事件,以及如何對用戶可能拋給您的任何交互做反應(yīng)了。

模型

現(xiàn)在,您應(yīng)當(dāng)了解了 Java 的集合(Collection),這是一組處理數(shù)據(jù)的 Java 類。這些類包括 ArrayList、HashMapSet。大多數(shù)應(yīng)用程序在反復(fù)處理數(shù)據(jù)時,經(jīng)常用這些類。但是,當(dāng)需要在 UI 中使用這些數(shù)據(jù)類時,出現(xiàn)了一個限制。UI 不知道如何顯示它們。請先想一分鐘。如果有一個 JList 和一個某種數(shù)據(jù)對象(例如 Person 對象)的 ArrayList,JList 怎樣才能知道要顯示什么?它是要顯示某個人的名字,還是連名帶姓一起顯示?

這就是模型的概念發(fā)揮作用的地方了。雖然模型這個術(shù)語表達(dá)的范圍更大,但是在本教程的示例中,我用 UI 模型這個術(shù)語描述組件用來顯示數(shù)據(jù)的類。

在 Swing 中每個處理集合數(shù)據(jù)的的組件都采用模型的概念,而且這也是使用和操縱數(shù)據(jù)的首選方法。它清晰地把 UI 的工作與底層數(shù)據(jù)分開(請回想 MVC 示例)。模型工作的機(jī)制是向組件描述如何顯示集合數(shù)據(jù)。我說的“描述”指的是什么呢?每個組件需要的描述略有不同:

 

  • JComboBox 要求其模型告訴它把什么文本作為選項顯示,以及有多少選項。

  • JSpinner 要求其模型告訴它顯示什么文本,前一個和下一個選擇是什么。

  • JList 也要求其模型告訴它把什么文本作為選項顯示,存在多少選項。

  • JTable 要求的更多:它要求模型告訴它存在多少列和多少行,列名稱、每列的類以及在每個單元格中顯示什么文本。

  • JTree 要求它的模型告訴它整個樹的根節(jié)點、父節(jié)點和子節(jié)點。

 

您可能會問:為什么要做這么些工作?為什么要把這些功能分開?請想像以下場景:您有一個復(fù)雜的 JTable,有許多列數(shù)據(jù),您在許多不同的屏幕上使用這個表格。如果您突然決定刪除某個列,那么怎么做會更容易呢?修改您使用的每個 JTable 實例中的代碼?還是創(chuàng)建一個可以在每個 JTable 實例中使用的模型類,然后只修改這一個模型類呢?顯然,所做的修改越少越好。

模型示例

我們來看看模型如何工作,在一個簡單的 JComboBox 示例中使用模型。在 JComboBox 前面的演示中,我介紹了如何調(diào)用 setItem() 向數(shù)據(jù)中添加項目。雖然對于簡單的演示,這樣做可以接受,但是在實際的應(yīng)用程序中很少這么用。畢竟,在有 25 個選項,而且選項不斷變化的時候,您還真的想每次都調(diào)用 addItem() 25 次對這些選項進(jìn)行迭代嗎?當(dāng)然不是。

JComboBox 包含一個方法調(diào)用 setModel(),它接受 ComboBoxModel 類的實例。應(yīng)當(dāng)用這個方法代替 addItem() 方法來創(chuàng)建 JComboBox 中的數(shù)據(jù)。

假設(shè)有一個 ArrayList,其中使用字母表作為其數(shù)據(jù)(“A”、“B”、“C” ,等等):

 MyComboModel model = new MyComboModel(alphaList); myComboBox.setModel(model); public class MyComboModel implements ComboBoxModel { private List data = new ArrayList(); private int selected = 0; public MyComboModel(List list) { data = list; } public void setSelectedItem(Object o) { selected = data.indexOf(o); } public Object getSelectedItem() { return data.get(selected); } public int getSize() { return data.size(); } public Object getElementAt(int i) { return data.get(i); } } 

采用模型時更好的地方是:您可以反復(fù)重用它。例如,假設(shè) JComboBox 的數(shù)據(jù)需要從字母表變成 1 到27 的數(shù)字。那么只用一行就可以實現(xiàn)這個變化:用新的數(shù)據(jù) List 添加 JComboBox,不需要使用額外的代碼:

 myComboBox.setModel(new MyComboModel(numberList)); 

模型在 Swing 中是非常有好處的特性,因為它們提供了代碼重用功能,而且使數(shù)據(jù)處理更加容易。更常見的應(yīng)用是在大型應(yīng)用程序中,服務(wù)器端開發(fā)人員創(chuàng)建和檢索數(shù)據(jù),并把數(shù)據(jù)傳遞給 UI 開發(fā)人員。如何處理這些數(shù)據(jù)和正確地顯示它們,取決于 UI 開發(fā)人員,而模型就是實現(xiàn)這項任務(wù)的工具。



Swing入門(一)(2009-04-21 00:02:20)
標(biāo)簽:it  分類:Awt/Swing學(xué)習(xí)

(轉(zhuǎn)自http://terrificwanjun.)

package cn.edu.jnu.www;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
public class test {
 public static void main(String[] args) {
  JFrame a=new JFrame("中繼數(shù)據(jù)庫系統(tǒng)");
  Container c=new  Container();
  //Swing更強(qiáng)調(diào)容器的概念,一般不允許之間將組件放置到頂層容器中
  //而是放在容器框架中,而awt則是直接放的
  a.setSize(200,200);
  a.setLocation(100, 200);
  a.setLayout(new BorderLayout());
  JButton b=new JButton("GO");
  c=a.getContentPane();
  c.add(b,BorderLayout.SOUTH);
  a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  a.setVisible(true);
 }

}



Swing學(xué)習(xí)(二)(2009-04-21 00:03:22)
標(biāo)簽:it  分類:Awt/Swing學(xué)習(xí)

(轉(zhuǎn)自http://terrificwanjun.)

 接觸java幾天,自己試著做了第一個java程序,其實只是一個簡單的對話框窗口,不過做起還是費了半天功夫,主要是對一些語法還不太熟悉,幸虧有CSDN上的朋友相助,問題得以解決.

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

public void class AboutDialog extends JDialog {              //這里誤用void,返回空值     
 
  public AboutDialog() {

   this.setTitle("About");                                                    //窗體標(biāo)題顯示
           this.setSize(320, 200);                                                //窗體的大小
   
       JLabel about = new JLabel("關(guān)于:JAVA的一個窗口 :) ");             //對話框內(nèi)容
        about.setHorizontalAlignment(SwingConstants.CENTER);     //內(nèi)容顯示在窗口的中央
       this.getContentPane().add(about, BorderLayout.CENTER);
  }

  public static void main(String[] args) throws HeadlessException {
          AboutDialog kk = new  AboutDialog() ;
         kk.setVisible(true);                                                                             //原來的show()顯示已過時
         kk.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);       

 }

}

 
 

上面誤用void生成的結(jié)果,有興趣的朋友可以試試.另外查了一下J2SE API,才知道show( )方法已經(jīng)被setvisible( )取代.



使用Frame創(chuàng)建窗體




在Awt中,Window類沒有邊界和菜單欄,所以不能直接使用Window類來創(chuàng)建窗體,必須使用Window類的子類Frame來創(chuàng)建,創(chuàng)建代碼為:

 

package cn.edu.jnu.www;

import java.awt.*;
import java.awt.event.*;
public class FrameTest {
 public static void main(String[] args) {
  // TODO 自動生成方法存根 
  Frame myFrame=new Frame("Hello");
  //Frame 是帶有標(biāo)題和邊界的頂層窗口
  
  myFrame.setLocation(250, 150);
  
  //myFrame.setLayout(new BorderLayout(10,20));
  //設(shè)置窗體布局,BorderLayout里面的兩個參數(shù)用指定的組件之間的水平間距構(gòu)造一個邊界布局。
  //BorderLayout為JAVA中的默認(rèn)窗體布局
  
  //myFrame.setLayout(new FlowLayout(FlowLayout.LEFT));
  //設(shè)置窗體布局為FlowLayout,對齊方式居左對齊
  
  //myFrame.setLayout(new GridLayout(3,2));
  //設(shè)置窗體布局為GridLayout,將窗體分為6塊,3行2列
  myFrame.setSize(300,400);
  
  Button myButton1=new Button("east");
  Button myButton2=new Button("south");
  Button myButton3=new Button("west");
  Button myButton4=new Button("north");
  Button myButton5=new Button("center");
  
  //myFrame.add(myButton1,BorderLayout.EAST);
  myFrame.add(myButton1,"East");
  //兩種方法都可以,但是要注意大小寫
  myFrame.add(myButton2,BorderLayout.SOUTH);
  myFrame.add(myButton3,BorderLayout.WEST);
  myFrame.add(myButton4,BorderLayout.NORTH);
  myFrame.add(myButton5,BorderLayout.CENTER);
  
  //myFrame.addWindowListener(new myWindowListener());
  
  
  //使用適配器的方法實現(xiàn)監(jiān)聽器作用
  //myFrame.addWindowListener(new yourWindowListener());
  
  //使用匿名內(nèi)部類的方法實現(xiàn)監(jiān)聽器的功能,只有含有適配器的事件才可以使用此方法
  myFrame.addWindowListener(new WindowAdapter(){
   public void windowClosing(WindowEvent e){
    System.exit(0);
   }
  });
  myFrame.setVisible(true);
  //myFrame.show();//eclipse 不建議使用show()方法
 }

}


//使用WindowAdapter適配器類來實現(xiàn)監(jiān)聽器







zhua : http://blog.sina.com.cn/s/blog_43c4b6530100cywl.html

posted on 2009-06-19 10:03 找個美女做老婆 閱讀(27429) 評論(1)  編輯  收藏

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多