JAVA Swing 簡介 - 鄧姚文2013課表

slimwhimperΛογισμικό & κατασκευή λογ/κού

3 Νοε 2013 (πριν από 4 χρόνια και 4 μέρες)

226 εμφανίσεις

JAVA
視窗程式設計

鄧姚文

joseph.deng@gmail.com

http://www.ywdeng.idv.tw

1

What is JAVA Swing?


Swing
的前代是

AWT

Abstract Windows
Toolkit



Java Foundation Classes

JFC
)的一部分


JFC
由適合開發圖形化使用者介面(
GUI
)的一組
類別組成


Swing
提供各種視窗元件


Component
元件控制項


Label
標籤、
Button
按鈕、
TextField
文字欄位、



Container
容器物件


Frame
框架視窗、
Panel
面板、


2

The 1st Swing Program

3

javac HelloWorldSwing.java

java HelloWorldSwing

The 1st Swing Program

4

import javax.swing.*;


public class HelloWorldSwing {


public static void main(String[] args) {


JFrame frame = new JFrame("HelloWorldSwing");


String msg = "Hello World! This is JAVA Swing.";


final JLabel label = new JLabel(msg);


frame.getContentPane().add(label);



frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


frame.pack();


frame.setVisible(true);


}

}

The 1st Swing Program


import javax.swing.*;


匯入

swing
套件


JFrame frame = new JFrame("HelloWorldSwing");


建立主框架視窗(
frame
),附標題


final JLabel label = new JLabel(msg);


建立標籤


frame.getContentPane().add(label);


將標籤放進視窗裡面

5

The 1st Swing Program


frame.setDefaultCloseOperation(JFrame.EXIT_ON_
CLOSE);


設定視窗關閉時的處理方式


使用者按下視窗右上角的

關閉視窗


frame.pack();


自動調整視窗大小,適合內容物件的大小


frame.setVisible(true);


顯示視窗

6

框架視窗

JFrame


頂層容器(
Top
-
Level Container



主視窗


常用屬性:


Text
:標題文字


ContentPane
:主要的容器面板,所有的內容都
加在這個容器上


7

標籤

JLabel


通常用於顯示簡短的文字,也可以應用於
圖像之顯示


重要屬性


Text
:內容文字


HorizontalAlignment
:水平對齊方式


LabelFor
:與此標籤相關聯的元件


DisplayedMnemonic
:助記符號


Icon
:內容圖像


8

The 2nd Swing Example


Event
事件


Action
動作


觸發事件的動作


Listener
聆聽者


接收事件的物件


Layout
佈置方式


Container
容器的佈置方式

9

常見事件及其聆聽者

觸發事件的動作

聆聽者類型

按按鈕、輸入文字後按下
Enter
鍵、從選單選擇某
一個項目

ActionListener

關閉框架視窗

WindowListener

使用者在某個元件上點擊滑鼠

MouseListener

使用者將滑鼠移過某格元件的上空

MouseMotionListener

某個元件從隱藏的狀態變成可視的狀態

ComponentListener

元件獲得輸入焦點

FocusListener

表格或清單的選項變更

ListSelectionListener

10

The 2nd Swing Example

11

javac SwingApplication.java

java SwingApplication

12

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;


public class SwingApplication {


private static String labelPrefix = "
按鍵次數
: ";


private int numClicks = 0;



public Component createComponents() {





}



public static void main(String[] args) {





}

}

13

public Component createComponents() {


final JLabel label = new JLabel(labelPrefix + "0 ");


JButton button = new JButton("I'm a Swing button!");


button.setMnemonic(KeyEvent.VK_I);


button.addActionListener(new ActionListener() {


public void actionPerformed(ActionEvent e) {


numClicks++;


label.setText(labelPrefix + numClicks);


}


});


label.setLabelFor(button);


JPanel pane = new JPanel();


pane.setBorder(BorderFactory.createEmptyBorder(


30 /*top*/, 30 /*left*/, 10 /*bottom*/, 30 /*right*/));


pane.setLayout(new GridLayout(0 /*row*/, 1 /*col*/));


pane.add(button);


pane.add(label);

}

14

public static void main(String[] args) {


try {


UIManager.setLookAndFeel(


UIManager.getCrossPlatformLookAndFeelClassName());


} catch (Exception e) {}


//Create the top
-
level container and add contents to it.


JFrame frame = new JFrame("SwingApplication");


SwingApplication app = new SwingApplication();


Component contents = app.createComponents();


frame.getContentPane().add(contents,


BorderLayout.CENTER);


frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


frame.pack();


frame.setVisible(true);

}

按鈕

JButton


用於觸動事件


常用屬性


Text
:內容文字


Icon
:內容圖像


Enabled
:按鈕是否有作用


15

Borders
邊框

16

Layout Manager
佈置方式管理


以相對位置的方式管理內容元件,以規則
的方式佈置內容元件


常用的佈置方式


Flow Layout
由左至右依序擺放


Border Layout

東、西、南、北、中央

五區


Card Layout
分層配置


Grid Layout
格子狀


Grid Bag Layout
適合不規則的佈置方式

17

Layout Manager
佈置方式管理


Frame
預設的

Layout Manager


Border
Layout


Panel, Applet
預設的

Layout Manager


Flow Layout




Container


setLayout()
設定

Layout
Manager

getLayout()
取得

Layout manager


18

Flow Layout

19

BorderLayout

20

Card Layout

21

GridLayout

22

import java.awt.*;

import java.applet.Applet;

public class ButtonGrid extends Applet {


public void init() {


setLayout(new GridLayout(3,2));


add(new Button("1"));


add(new Button("2"));


add(new Button("3"));


add(new Button("4"));


add(new Button("5"));


add(new Button("6"));


}

}

BorderLayout

23

import java.awt.*;

import java.applet.Applet;

public class buttonDir extends Applet {


public void init() {


setLayout(new BorderLayout());


add(new Button("North"), BorderLayout.NORTH);


add(new Button("South"), BorderLayout.SOUTH);


add(new Button("East"), BorderLayout.EAST);


add(new Button("West"), BorderLayout.WEST);


add(new Button("Center"), BorderLayout.CENTER);


}

}

練習:簡易計算機

狀態圖

24

Example 3


Look and feel


Metal


Motif


Windows


Cross Platform Look and Feel (Metal)


Radio buttons

25

Example 3

26

27

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class SimpleExample extends JPanel {


static JFrame frame;


static String metal= "Metal";


static String metalClassName =


"javax.swing.plaf.metal.MetalLookAndFeel";


static String motif = "Motif";


static String motifClassName =


"com.sun.java.swing.plaf.motif.MotifLookAndFeel";


static String windows = "Windows";


static String windowsClassName =


"com.sun.java.swing.plaf.windows.WindowsLookAndFeel";


JRadioButton metalButton, motifButton, windowsButton;


public SimpleExample() {


}


class RadioListener implements ActionListener {


}


public void updateState() {


}


public static void main(String s[]) {


}

}

28

public SimpleExample() {


JButton button = new JButton("Hello, world");


button.setMnemonic('h'); //for looks only


metalButton = new JRadioButton(metal);


metalButton.setMnemonic('o');


metalButton.setActionCommand(metalClassName);


motifButton = new JRadioButton(motif);


motifButton.setMnemonic('m');


motifButton.setActionCommand(motifClassName);


windowsButton = new JRadioButton(windows);


windowsButton.setMnemonic('w');


windowsButton.setActionCommand(windowsClassName);


ButtonGroup group = new ButtonGroup();


group.add(metalButton);


group.add(motifButton);


group.add(windowsButton);


RadioListener myListener = new RadioListener();


metalButton.addActionListener(myListener);


motifButton.addActionListener(myListener);


windowsButton.addActionListener(myListener);


add(button); add(metalButton); add(motifButton); add(windowsButton);

}

29

/** An ActionListener that listens to the radio buttons. */

class RadioListener implements ActionListener {


public void actionPerformed(ActionEvent e) {


String lnfName = e.getActionCommand();


try {


UIManager.setLookAndFeel(lnfName);


SwingUtilities.updateComponentTreeUI(frame);


frame.pack();


} catch (Exception exc) {


JRadioButton button = (JRadioButton)e.getSource();


button.setEnabled(false);


updateState();


System.err.println("Could not load LookAndFeel: " +


lnfName);


}


}

}

30

public void updateState() {


String lnfName = UIManager.getLookAndFeel().getClass().getName();


if (lnfName.indexOf(metal) >= 0) {


metalButton.setSelected(true);


} else if (lnfName.indexOf(windows) >= 0) {


windowsButton.setSelected(true);


} else if (lnfName.indexOf(motif) >= 0) {


motifButton.setSelected(true);


} else {


System.err.println("SimpleExample is using an unknown L&F: " +


lnfName);

}

31

public static void main(String s[]) {


SimpleExample panel = new SimpleExample();



frame = new JFrame("SimpleExample");


frame.addWindowListener(new WindowAdapter() {


public void windowClosing(WindowEvent e)


{System.exit(0);}


});


frame.getContentPane().add("Center", panel);


frame.pack();


frame.setVisible(true);



panel.updateState();

}