Swing 的組件與AWT 組件相似,但又為每一個組件增添了新的方法,並提供了更多的高級組件.
Swing 的基本元件:
1.按鈕(JButton):
Swing 中的按鈕可以顯示圖像,並且可以將按鈕設定為視窗的預設圖標,而且還可以將多個圖像指定給一個按鈕。
(1).JButton 常用的構造方法。
JButton(String text):按鈕上顯示字元。
JButton(Icon icon) :按鈕上顯示圖示。
JButton(String text, Icon icon):按鈕上既顯示圖示又顯示字元。
(2).常用方法:
b1.setEnabled(false); //使按鈕目前無法使用
b1.setToolTipText("..."): //設定按鈕提示文字
b1.setMnemonic(KeyEvent.VK_D);// 將b1邦定alt+D鍵
(3).案例代碼:
複製代碼代碼如下:
public class JButtonExample3 extends JPanel implements ActionListener {
protected JButton b1, b2, b3;
public JButtonExample3() {
ImageIcon leftButtonIcon = createImageIcon("right.gif");
ImageIcon middleButtonIcon = createImageIcon("middle.gif");
ImageIcon rightButtonIcon = createImageIcon("left.gif");
b1 = new JButton("失效中間按鈕(D)", leftButtonIcon);
b1.setVerticalTextPosition(AbstractButton.CENTER);// 水平中間對齊
b1.setHorizontalTextPosition(AbstractButton.LEADING);// 相當於LEFT
b1.setMnemonic(KeyEvent.VK_D);// 將b1邦定alt+D鍵
b1.setActionCommand("disable");
b2 = new JButton("M中間按鈕", middleButtonIcon);
b2.setVerticalTextPosition(AbstractButton.BOTTOM);
b2.setHorizontalTextPosition(AbstractButton.CENTER);
b2.setMnemonic(KeyEvent.VK_M);// 將b2邦定alt+M鍵
b3 = new JButton("E啟動中間按鈕", rightButtonIcon);
b3.setMnemonic(KeyEvent.VK_E);// 將b3邦定alt+E鍵
b3.setActionCommand("enable");
b3.setEnabled(false);
// 新增事件監聽
b1.addActionListener(this);
b3.addActionListener(this);
// 設定按鈕提示文字
b1.setToolTipText("點選這個按鈕,將使中間的按鈕失效!");
b2.setToolTipText("點選這個按鈕,沒有任何的事件發生!");
b3.setToolTipText("點選這個按鈕,將使中間的按鈕有效");
// 將按鈕加入JPanel中
add(b1);
add(b2);
add(b3);
}
public void actionPerformed(ActionEvent e) {
if ("disable".equals(e.getActionCommand())) {
b2.setEnabled(false);
b1.setEnabled(false);
b3.setEnabled(true);
} else {
b2.setEnabled(true);
b1.setEnabled(true);
b3.setEnabled(false);
}
}
protected static ImageIcon createImageIcon(String path) {
java.net.URL imgURL = JButtonExample3.class.getResource(path);
if (imgURL != null) {
return new ImageIcon(imgURL);
} else {
System.err.println("Couldn′t find file: " + path);
return null;
}
}
public static void main(String[] args) {
// 設定使用新的swing介面
//提供一個關於新建立的JFrame 是否應該具有當前外觀為其提供的Window 裝飾(如邊框、關閉視窗的小部件、標題等等)的提示。
JFrame.setDefaultLookAndFeelDecorated(true);
// 建立一個窗體
JFrame frame = new JFrame("小龍按鈕");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 建立一個面板
JButtonExample3 newContentPane = new JButtonExample3();
newContentPane.setOpaque(true);
frame.setContentPane(newContentPane);
// 顯示窗體
frame.pack();
frame.setLocation(300, 200);
frame.setVisible(true);
}
}
運行截圖:
2.組合方塊(JComboBox):
組合方塊(下拉式清單JComboBox)使用方法及範例詳解:
構造方法:
* JComboBox() 建立一個JComboBox元件.
* JComboBox(ComboBoxModel model) 根據model建立一個JComboBox元件.
* JComboBox(Objext[] items) 利用陣列物件建立一個JComboBox元件.
* JComboBox(Vector items) 利用Vector物件建立一個JComboBox元件.
常用方法:
....
綜合範例:
複製代碼代碼如下:
import java.awt.*; /* 包含用於建立使用者介面和繪製圖形影像的所有類別。 */
import javax.swing.*; /* 提供一組"輕量級"元件,盡量讓這些元件在所有平台上的工作方式都相同*/
public class JComboBoxDemo extends JFrame {
public JComboBoxDemo() {
/*
* Container是所有容器的父類別,又是Java語言的元件類別Component的子類別. 容器是一種具有容納其他元件和容器的功能的元件
* 一個Java的圖形使用者介面的最基本元素是元件,元件是可以以圖形化的方式顯示在螢幕上並能與使用者互動的物件,如一個按鈕,一個文字方塊等.
* 在Java中,通常將元件放在一定的容器內使用this.getContentPane()方法傳回此窗體的contentPane 對象
*/
Container contentPane = this.getContentPane();
/* 建立一個面板物件,指定佈局管理器為GridLayout,1行2列.Jpanel的預設版面管理為FlowLayout */
JPanel jPanel1 = new JPanel(new GridLayout(1, 2));
// 利用String數組建立JComboBox
String[] fruit = { "蘋果", "香蕉", "桔子", "梨子", "芒果" };
JComboBox jComboBox1 = new JComboBox(fruit);
jComboBox1.addItem("其他"); // 在列錶框選項的最後再加上一個"其他"選項
// 設定jList1物件的標題邊框
jComboBox1.setBorder(BorderFactory.createTitledBorder("您最喜歡的水果:"));
// 新增列錶框jComboBox1至面板
jPanel1.add(jComboBox1);
// 利用ComboBoxModel建立JComboBox
ComboBoxModel myModel = new MyModel();
JComboBox jComboBox2 = new JComboBox(myModel);
// 設定jList1物件的標題邊框
jComboBox2.setBorder(BorderFactory.createTitledBorder("您最喜歡的水果:"));
// 新增列錶框jComboBox2至面板
jPanel1.add(jComboBox2);
// 新增面板至父容器
contentPane.add(jPanel1);
// 設定本窗體的標題
this.setTitle("JComboBoxDemo");
// 設定本窗體顯示的初始大小
this.setSize(350, 90);
this.setLocation(300, 200);
// 設定本窗體初始可見
this.setVisible(true);
}
class MyModel extends DefaultComboBoxModel {
String[] fruit = { "蘋果", "香蕉", "桔子", "梨子", "芒果" };
MyModel() {
for (int i = 0; i < fruit.length; i++) {
/* addElement()方法用於向列錶框新增選項元素*/
this.addElement(fruit[i]);
}
}
}
public static void main(String args[]) {
JComboBoxDemo test = new JComboBoxDemo();
}
}
截圖:
3.列錶框(JList):
列錶框的功能與下拉列錶框相似,也是讓用戶在幾個條目中做出選擇,但又有一些區別,它提供給用戶的選擇模式更為多樣,分別是單一選擇、連續選擇、多項選擇,對應於ListSelectionModel 中的3個常數:
(1) static int SINGLE_SELECTION 只能選擇一條。
(2) static int SINGLE_INTERVAL_SELECTION 按住[Shift]鍵可選擇聯絡的區間。
(3) static int MULTIPLE_INTERVAL_SELECTION 按住[Ctrl]鍵可選擇多條。
構造函數如下:
(1) JList() 建立一個JList 元件。
(2) JList(ListModel model) 根據model 建立一個JList 元件。
(3) JList(Object[] items) 利用陣列物件建立一個JList 元件。
(4) JList(Vector items) 利用Vector 物件建立一個JList 元件。
將列錶框JList加入JScrollPane中可以實現列錶框的滾動.
列表(JList)元件使用範例1如下:
複製代碼代碼如下:
public class JListDemo1 extends JFrame{
Container contentPane;
JPanel jp;
JList jList1,jList2,jList3;
public JListDemo1(){
contentPane = this.getContentPane();
jp = new JPanel(new GridLayout(1,3));
//利用String陣列建立JList對象
String[] fruit={"蘋果","香蕉","桔子","梨","芒果"};
jList1=new JList(fruit);
//設定jList1物件的標題邊框
jList1.setBorder(BorderFactory.createTitledBorder("您最喜歡的水果: "));
//設定jList1物件的選擇模式為單一選擇
jList1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jp.add(jList1);
//利用ListModel建立JList物件,可實現列表內容的動態
ListModel myModel=new MyModel(); //建立一個列表模型對象
jList2=new JList(myModel); //根據列表模型物件建立列表
jList2.setBorder(BorderFactory.createTitledBorder("您最喜歡的水果: "));
//設定jList2物件的選擇模式為按住[Ctrl]可多項選擇
jList2.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
jp.add(jList2);
jList3=new JList(fruit);
jList3.setBorder(BorderFactory.createTitledBorder("您最喜歡的水果: "));
jList3.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
jList3.setVisibleRowCount(3);
jList3.setFixedCellWidth(120);
jList3.setFixedCellHeight(30);
JScrollPane jScrollPane = new JScrollPane(jList3);
jp.add(jScrollPane);
contentPane.add(jp);
this.setTitle("JListDemo");
this.setSize(340,200);
//pack();
this.setLocation(400, 300);
this.setVisible(true);
}
//透過繼承DefaultListModel類別可實現動態內容的清單選擇
class MyModel extends DefaultListModel{
String[] fruit={"蘋果","香蕉","桔子","梨","芒果"};
MyModel(){
for(int i=0;i<fruit.length;i++){
/* void addElement(Object obj)
* 將指定元件新增至此類表的末端。 */
this.addElement(fruit[i]);
}
}
}
public static void main(String[] args){
JListDemo1 test=new JListDemo1();
}
}
運行結果如下圖所示:
列錶框範例2程式碼:
複製代碼代碼如下:
public class JListDemo2 extends JFrame {
Container contentPane;
JPanel jp;
JList jListFont, jListSize;
// 建構函式
public JListDemo2() {
contentPane = this.getContentPane();
jp = new JPanel(new GridLayout());
setJListFont();
setJListFontSize();
contentPane.add(jp);
this.setTitle("JListDemo");
this.setSize(240, 200);
this.setLocation(400, 300);
this.setVisible(true);
} // End of JListDemo2
public void setJListFont() {
GraphicsEnvironment ge = GraphicsEnvironment
.getLocalGraphicsEnvironment();
final String fontName[] = ge.getAvailableFontFamilyNames(); // 取得系統的本機字體
jListFont = new JList(fontName);
// 設定jList1物件的標題邊框
jListFont.setBorder(BorderFactory.createTitledBorder("系統字體: "));
// 設定jList1物件的選擇模式為單一選擇
jListFont.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
jListFont.setVisibleRowCount(3);
jListFont.setFixedCellWidth(120);
jListFont.setFixedCellHeight(20);
JScrollPane jScrollPane1 = new JScrollPane(jListFont);
jp.add(jScrollPane1);
}
public void setJListFontSize() {
final String fontSize[] = { "8", "9", "10", "12", "14", "15", "16",
"18", "20", "21", "22", "24", "26", "28", "30", "36", "48",
"54", "72", "89" };
// 建立字號的列錶框listSize
jListSize = 新 JList(fontSize);
jListSize.setBorder(BorderFactory.createTitledBorder("字體大小: "));
// 設定jList2物件的選擇模式為按住[Ctrl]可多項選擇
jListSize
.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
jListSize.setVisibleRowCount(3);
jListSize.setFixedCellWidth(120);
jListSize.setFixedCellHeight(20);
JScrollPane jScrollPane2 = new JScrollPane(jListSize);
jp.add(jScrollPane2);
}
public static void main(String[] args) {
JListDemo2 test = new JListDemo2();
}
}
程式運行示意圖:
4.javax.swing
類別JColorChooser:
JColorChooser (顏色選擇對話框)提供一個用於允許使用者操作和選擇顏色的控制器窗格。
JColorChooser建構子:
JColorChooser():建立一個JColorChooer物件,預設顏色為白色.
JColorChooser(Color initialColor):建立一個JColorChooer物件,並設定初始顏色.
JColorChooser(ColorSelectionModel modal):以ColorSelectionModel建構JColorChooser物件.
最常使用JColorChooser的方式是使用JColorChooser的靜態方法showDialog().也就是說在大部份的情況下,我們不會new一個JColorChooser物件,而是直接使用JColorChooser的靜態方法(showDialog())來輸出顏色選擇對話框.利用這個方法我們亦可以得到使用者所選的顏色,若使用者沒有選擇則回傳null值.
顏色選擇對話框的簡單案例1代碼:
複製代碼代碼如下:
public class JColorChooserDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("JColorChooserDemo");
MyPanel panel = new MyPanel();
frame.getContentPane().add(panel);
frame.pack();
frame.setLocation(300, 200);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
class MyPanel extends JPanel implements ActionListener {
private static final long serialVersionUID = 1L;
private JButton button,rgb,red,green,blue;
private Color color = new Color(255, 51, 150);
public MyPanel() {
button = new JButton("Get Color");
rgb = new JButton("RGB: ");
red = new JButton("Red: ");
green = new JButton("Green: ");
blue = new JButton("Blue: ");
button.addActionListener(this);
setPreferredSize(new Dimension(550, 250));
setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
setBackground(color);
add(button);
add(rgb);
add(red);
add(green);
add(blue);
}
public void actionPerformed(ActionEvent e) {
color = JColorChooser.showDialog(this, "Choose Color", color);
if (color != null) {
setBackground(color);
button.setText("Get again");
rgb.setText("RGB: " + color.getRGB());
red.setText("Red: " + color.getRed());
green.setText("Green: " + color.getGreen());
blue.setText("Blue: " + color.getBlue());
}
}
}
運行結果示意圖如下:
另外還有一個使用JColorChooser常用的方式,那就是使用createDialog()靜態方法.使用這個靜態方法後會得到一個JDialog對象,我們可以利用這個JDialog對象對顏色選擇對話框做更多的設置.不過利用這個方法必須配合JColorChooser物件才行,也就是必須new出一個JColorChooser物件來.下面範例介紹最簡單的也是最實用JColorChooser,選擇顏色完畢後就能更改JLabel上的背景顏色.
顏色選擇對話框的簡單案例2代碼:
複製代碼代碼如下:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ColorChooserDemo1 extends MouseAdapter {
JFrame f = null;
JLabel label = null;
JLabel label1 = null;
JLabel label2 = null;
Rectangle rec1 = null;
Rectangle rec2 = null;
public ColorChooserDemo1() {
f = new JFrame("ColorChooser Example");
Container contentPane = f.getContentPane();
contentPane.addMouseListener(this);
label = new JLabel(" ", JLabel.CENTER);
label.setPreferredSize(new Dimension(300, 20));
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(1, 2));
label1 = new JLabel("左Label", JLabel.CENTER);
label1.setBackground(Color.red);
label1.setForeground(Color.black);
label1.setOpaque(true);
label1.setBounds(0, 0, 150, 150);
panel.add(label1);
label2 = new JLabel("右Label", JLabel.CENTER);
label2.setBackground(Color.green);
label2.setForeground(Color.black);
label2.setOpaque(true);
label2.setBounds(150, 0, 150, 150);
panel.add(label2);
rec1 = label1.getBounds();
rec2 = label2.getBounds();
contentPane.add(panel, BorderLayout.CENTER);
contentPane.add(label, BorderLayout.SOUTH);
f.setSize(new Dimension(300, 150));
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
// 實作MouseAdapter中的mousePressed()與mouseClicked()方法.當按下滑鼠時,就能知道滑鼠遊標目前的位置.當連續鍵擊滑鼠
// 兩次時,若遊標所在位置在label中,就會出現顏色選擇對話框,用戶可選擇任一顏色更改label的顏色.
public void mousePressed(MouseEvent e) {
label.setText("目前滑鼠座標(X,Y)為:(" + e.getX() + "," + e.getY() + ")");
}
public void mouseClicked(MouseEvent e) {
Point point = e.getPoint();
if (e.getClickCount() == 2) {
if (rec1.contains(point)) {
/*
* 利用JColorChooser的showDialog()靜態方法輸出顏色選擇對話框
* ,showDialog()中的3個參數依序是: 對話框的父元件,顏色選擇對話框標題
* ,與對話方塊預設顏色.當使用者選擇顏色之後,按下"OK"按鈕則返回
* Color物件,若按下"Cancel"按鈕則傳回null值.
*/
Color color = JColorChooser.showDialog(f,
"Change label1 Color", Color.white);
if (color != null) // 若為null值表示使用者按下Cancel按鈕
label1.setBackground(color);
}
if (rec2.contains(point)) {
Color color = JColorChooser.showDialog(f,
"Change label2 Color", Color.yellow);
if (color != null) // 若為null值表示使用者按下Cancel按鈕
label2.setBackground(color);
}
}
}
public static void main(String[] arg) {
new ColorChooserDemo1();
}
}