## Java圖形開發--GUI
### 1、圖形用戶界面(gui)介紹
圖形用戶界面(Graphics?User?Interface,GUI)是用戶與程序交互的窗口,比命令行的界面更加直觀并且更好操作。
awt,swing,swt,Jface是什么?
Sun已經提供了一個跨平臺GUI開發工具包AWT抽象窗口工具箱(Abstract?Window?Toolkit).
↓
Sun又創建了一個新的GUI框架swing.解決了AWT存在的Icd問題.
↓
IBM認為swing比較消耗內存,創建了一個新的GUI庫,這就是SWT
↓
IBM為了方便開發SWT程序,在SWT基礎上又創建了一個更易用,功能強大的圖開包"JFace"
?
### 2、eclipse開發工具介紹
eclipse是什么東西,我們用三句話來說明:
1、eclipse最早是IBM附屬公司oti開發的,一共投入了4000萬美金,后來捐獻給開源社區
2、eclipse是一個開源的、可擴展的集成開發環境,已經成為目前最流行的java開發工具
3、eclipse安裝后就可以開發java?se的項目了,但不能開發java?ee項目,需要安裝web開發插件(lomboz或是myeclipse..)
ide(集成開發環境,比如jcreator、vs、myeclipse這些開發工具都是ide)
?
### 3、swing組件介紹
1、JFrame是Frame的子類
2、屬于容器類組件,頂層容器
3、JFrame有一些常用的方法,通過示例與java的幫助文檔即可了解。

在圖形用戶界面編程中,我們在窗體中會經常使用到按鈕,我們在進行選擇的時候,常常需要確認,所以按鈕很重要。
?
只需要在窗體中添加按鈕組件(JButton)即可完成。
### 按鈕組件--深入討論
1、JButton是AbstractButton的子類
2、屬于窗口類組件,可以加入別的組件
3、Swing包的按鈕組件不只有JButton,還有單選按鈕(JRadioButton)、箭頭按鈕(BasicArrowButton)、觸發器按鈕(JToggleButton)。
~~~
/**
* 功能:GUI開發
*/
package com.gui;
import javax.swing.*;
import java.awt.*;
//JFrame是一個頂層容器類(可以添加其他swing組件的類)
public class Gui1 extends JFrame {
//需要的swing組件,定義到這里
JButton jb1 = null;
// 構造函數
public Gui1() {
// 創建了一個Button按鈕
jb1 = new JButton("按鈕");
// 添加組件
add(jb1);
// 給窗體設置標題
setTitle("hello,world!");
// 設置大小,按像素計算
setSize(200, 200);
// 設置初始位置
setLocation(100, 200);
// 設置當窗口關閉時,保證JVM也退出
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 顯示
setVisible(true);
}
public static void main(String[] args) {
Gui1 gui1 = new Gui1();
}
}
~~~
### 4、三大常用布局管理器
### 布局管理器--介紹
#### 1、概念
????組件在容器(比如JFrame)中的位置和大小是由布局管理器來決定的。所有的容器都會
使用一個布局管理器,通過它來自動進行組件的布局管理。
#### 2、種類
????java共提供了五種布局管理器:流式布局管理器(FlowLayout)、邊界布局管理器(BorderLayout)、網格布局管理器(GridLayout)、卡片布局管理器(CardLayout)、網格包布局管理器(GridBagLayout)。其中前三種是最常見的布局管理器。
?
##### 邊界布局BorderLayout--介紹
????邊界布局(BorderLayout)將容器簡單的劃分為東南西北5個區域,中間區域最大。
????JFrame窗體,JDialog對話框組件默認布局方法
?
~~~
/**
* 邊界布局
*/
package com.gui;
import java.awt.*;
import javax.swing.*;
//1.繼承JFrame
public class Gui2 extends JFrame{
//2.定義組件
JButton jb1, jb2, jb3, jb4, jb5;
public Gui2(){
//3.創建組件
jb1 = new JButton("中部");
jb2 = new JButton("北部");
jb3 = new JButton("東部");
jb4 = new JButton("南部");
jb5 = new JButton("西部");
//4.添加各個組件
add(jb1, BorderLayout.CENTER);
add(jb2, BorderLayout.NORTH);
add(jb3, BorderLayout.EAST);
add(jb4, BorderLayout.SOUTH);
add(jb5, BorderLayout.WEST);
//5.設置窗體屬性
setTitle("邊界布局");
setSize(300, 200);
setLocation(200, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//6.顯示窗體
setVisible(true);
}
public static void main(String[] args) {
Gui2 gui1 = new Gui2();
}
}
~~~
##### 邊界布局BorderLayout--注意事項
1、不是五個部分都必需添加;
2、中部組件會自動調節大小;
3、JFrame,JDialog默認布局管理器就是BorderLayout
##### 流式布局FlowLayout--介紹
FlowLayout布局,按照組件的添加次序將按鈕組件(當然也可以是別的組件)從左到右放置在容器中。當到達容器的邊界時,組件將放置到下一行中。FlowLayout可以以左對齊、居中對齊、以右對齊的方式排列組件。
?
~~~
/**
* 流式布局
*/
package com.gui;
import java.awt.*;
import javax.swing.*;
public class Gui3 extends JFrame{
//定義組件
JButton jb1, jb2, jb3, jb4, jb5, jb6;
//構造函數
public Gui3(){
//創建組件
jb1 = new JButton("Button1");
jb2 = new JButton("Button2");
jb3 = new JButton("Button3");
jb4 = new JButton("Button4");
jb5 = new JButton("Button5");
jb6 = new JButton("Button6");
//添加組件
add(jb1);
add(jb2);
add(jb3);
add(jb4);
add(jb5);
add(jb6);
//設置流式布局
setLayout(new FlowLayout(FlowLayout.RIGHT));
//設置窗體屬性
setTitle("流式布局");
setSize(300, 200);
setLocation(200, 200);
//禁止用戶改變窗體大小
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Gui3 gui1 = new Gui3();
}
}
~~~
##### 流式布局FlowLayout--注意事項
1、不限制他所管理的組件大小,允許他們有最佳大小
2、當容器被縮放、擴大時,組件的位置可能變化,但組件的大小不變。
3、默認組件是居中對齊,可以通過FlowLayout(int?align)函數來指定對齊方式。
##### 網格布局GridLayout--介紹
GridLayout布局,聽其名而知其意,它將容器分割成多行多列,組件被填充到每個網格中,添加到容器中的組件首先放置在左上角的網格中,然后從左到右放置其它的組件,當占滿該行的所有網格后,接著繼續在下一行從左到右放置組件。
~~~
/**
* 網格布局
*/
package com.gui;
import java.awt.*;
import javax.swing.*;
public class Gui4 extends JFrame{
int size = 9;
//定義組件;
JButton[] jbs = new JButton[9];
public Gui4(){
//創建組件
for(int i = 0; i < size; i++){
jbs[i] = new JButton("" + i);
}
//設置網格布局
setLayout(new GridLayout(3, 3, 5, 5));
//添加組件
for(int i = 0; i < size; i++){
add(jbs[i]);
}
//設置窗體屬性
setTitle("網格布局");
setSize(300, 300);
setLocation(200,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Gui4 gui1 = new Gui4();
}
}
~~~
##### 網格布局GridLayout--注意事項
1、組件的相對位置不隨容器的縮放而變化,但大小會變化;
2、所有組件的大小相同;
3、可以通過GridLayout(int?rows,int?cols,int?hgap,int?vgap)來指定網格的行/列,水平間隙/垂直間隙。
參數說明:rows:行數/cols:列數/hgap:垂直間隙/vgap:水平間隙
#### 3、開發GUI程序步驟
1、繼承JFrame(類繼承)
2、定義需要的組件(成員變量)
3、創建組件(構造函數中)
4、添加組件(構造方法中)
5、設置布局管理器(構造方法中)
6、顯示窗體(構造函數中)
### 5、Swing組件--面板組件
### 面板組件(JPanel)--介紹
在圖形用戶界面編程中,如果只是普通的組件布局,我們用前面講的三種布局管理器就可以解決,但在比較復雜的布局要求時,就需要使用布局管理器的組合使用。
?
JPanel:面板組件,非頂層容器,一個界面只可以有一個JFrame窗體組件,但可以有多個JPanel面板組件,而JPanel上也可以使用FlowLayout、BorderLayout、GirdLayout等各種布局管理器,這樣可以組合使用達到較為復雜的布局效果。
~~~
/**
* 多種布局管理器的使用
*/
package com.gui;
import java.awt.*;
import javax.swing.*;
public class Gui5 extends JFrame{
//定義組件
JPanel jp1, jp2;
JButton jb1, jb2, jb3, jb4, jb5, jb6;
//構造方法
public Gui5(){
//創建組件
//JPanel布局默認是FlowLayout
jp1 = new JPanel();
jp2 = new JPanel();
jb1 = new JButton("Button1");
jb2 = new JButton("Button2");
jb3 = new JButton("Button3");
jb4 = new JButton("Button4");
jb5 = new JButton("Button5");
jb6 = new JButton("Button6");
//添加JPanel
jp1.add(jb1);
jp1.add(jb2);
jp2.add(jb3);
jp2.add(jb4);
jp2.add(jb5);
//把JPanel加入JFrame
add(jp1, BorderLayout.NORTH);
add(jb6, BorderLayout.CENTER);
add(jp2, BorderLayout.SOUTH);
//設置窗體
setTitle("多種布局管理器的使用");
setSize(300, 300);
setLocation(200, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String args[]){
Gui5 gui1 = new Gui5();
}
}
~~~
### 面板(JPanel)組件--注意事項
1、JPanel是JComponent的子類;
2、屬于容器類組件,可以加入別的組件;
3、默認布局管理器是流式布局(FlowLayout)
### Swing組件--文本框/密碼框/標簽組件
在圖形用戶界面編程中,我們常常會提供用戶登錄界面,比如登錄到會員管理系統,登錄到工資管理系統、倉庫管理系統等。這時候我們就會用到:
1、文本框(JTextField)
2、密碼框(JPasswordField)
3、標簽(JLable)
~~~
package com.gui;
import java.awt.*;
import javax.swing.*;
public class Gui6 extends JFrame{
//定義組件
JPanel jp1, jp2, jp3;
JLabel jlb1, jlb2;
JButton jb1, jb2;
JTextField jtf;
JPasswordField jpf;
//構造方法
public Gui6(){
//創建組件
jp1 = new JPanel();
jp2 = new JPanel();
jp3 = new JPanel();
jlb1 = new JLabel("用戶名:");
jlb2 = new JLabel("密 碼:");
jb1 = new JButton("登錄");
jb2 = new JButton("取消");
jtf = new JTextField(10);
jpf = new JPasswordField(10);
//設置布局管理器
setLayout(new GridLayout(3, 1));
//加入組件
jp1.add(jlb1);
jp1.add(jtf);
jp2.add(jlb2);
jp2.add(jpf);
jp3.add(jb1);
jp3.add(jb2);
//加入到JFrame
add(jp1);
add(jp2);
add(jp3);
//設置窗體
setTitle("登錄界面");
setSize(300, 150);
setLocation(500,500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Gui6 gui1 = new Gui6();
}
}
~~~
### Swing組件--復選框/單選框組件
在圖形用戶界面編程中,我們常常會提供用戶注冊界面,這時候我們就會用到:
1、復選框組件(JCheckBox)
2、單選框組件(JRadioBuutton)
特別說明:
????同一組單選按鈕必需先創建ButtonGroup,然后把單選框組件放入到ButtonGroup中
~~~
package com.gui;
import java.awt.*;
import javax.swing.*;
public class Gui7 extends JFrame{
//定義組件
JPanel jp1, jp2, jp3;
JLabel jl1, jl2;
JButton jb1, jb2;
JCheckBox jcb1, jcb2, jcb3;
JRadioButton jrb1, jrb2;
ButtonGroup bg;
//構造函數
public Gui7(){
//創建組件
jp1 = new JPanel();
jp2 = new JPanel();
jp3 = new JPanel();
jl1 = new JLabel("你喜歡的運動:");
jl2 = new JLabel("你喜歡的運動:");
jb1 = new JButton("注冊用戶");
jb2 = new JButton("取消注冊");
jcb1 = new JCheckBox("足球");
jcb2 = new JCheckBox("籃球");
jcb3 = new JCheckBox("網球");
jrb1 = new JRadioButton("男");
jrb2 = new JRadioButton("女");
//單選組件一定要放入到一個ButtonGroup
//不放入的話,可以多選
bg = new ButtonGroup();
bg.add(jrb1);
bg.add(jrb2);
//設置布局管理器
setLayout(new GridLayout(3, 1));
//添加組件
jp1.add(jl1);
jp1.add(jcb1);
jp1.add(jcb2);
jp1.add(jcb3);
jp2.add(jl2);
jp2.add(jrb1);
jp2.add(jrb2);
jp3.add(jb1);
jp3.add(jb2);
add(jp1);
add(jp2);
add(jp3);
//設置窗體
setTitle("調查報告");
setSize(300, 300);
setLocation(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Gui7 gui1 = new Gui7();
}
}
~~~
### Swing組件--下拉框/列表框/流動空格組件
在圖形用戶界面編程中,常常會提供用戶調查界面,這個時候會用到:
1、下拉框組件(JComboBox)
2、列表框組件(JList)
3、滾動窗格組件(JScrollPane)
特別說明:
????一般來說,列表框組件+滾動窗格組件是結合使用的。目的是讓列表框中的選項可以有滾動條支持。
~~~
package com.gui;
import java.awt.*;
import javax.swing.*;
public class Gui8 extends JFrame{
//定義組件
JPanel jp1, jp2;
JLabel jl1, jl2;
JComboBox jcb;
JList jlist;
JScrollPane jsp;
//構造方法
public Gui8(){
//創建組件
jp1 = new JPanel();
jp2 = new JPanel();
jl1 = new JLabel("你的籍貫:");
jl2 = new JLabel("旅游地點:");
String[] jg = {"北京", "上海", "天津", "火星"};
jcb = new JComboBox(jg);
String[] dd = {"九寨溝", "故宮", "長城", "天安門"};
jlist = new JList(dd);
//設置顯示選項個數
jlist.setVisibleRowCount(2);
jsp = new JScrollPane(jlist);
//設置布局
setLayout(new GridLayout(3, 1));
//添加組件
jp1.add(jl1);
jp1.add(jcb);
jp2.add(jl2);
jp2.add(jsp);
add(jp1);
add(jp2);
//設置窗體
setTitle("旅游");
setSize(300, 300);
setLocation(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Gui8 gui1 = new Gui8();
}
}
~~~
### Swing組件--總結
總結:
1、Swing的常用組件(JFrame(框架)、Jpanel(面板)、JButton(按鈕)、JLable(標簽)、JTextField(文本框)、JPasswordField(密碼框)、JCheckBox(復選框)、JRadioButton(單選框)、JComboBox(下拉框)、JScrollPane(滾動窗格)、JList(列表框))。
2、三大布局管理器(BorderLayout(邊界布局)、FlowLayout(流布局)、GridLayout(網格布局)),要靈活使用,從而滿足設計需求。
### 6、GUI編程實踐
### 1、拆分窗格(JSplitPane)屬于容器類組件
~~~
package com.gui;
import java.awt.*;
import javax.swing.*;
public class Gui9 extends JFrame{
//定義組件
JSplitPane jsp;
JList jlist;
JLabel jl;
//構造方法
public Gui9(){
//創建組件
String[] words = {"boy", "girl", "bird"};
jlist = new JList(words);
jl = new JLabel(new ImageIcon("images/image01.jpg"));
//拆分窗格
jsp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, jlist, jl);
//可以變化
jsp.setOneTouchExpandable(true);
//添加組件
add(jsp);
//設置窗體
setTitle("分割");
setSize(400, 300);
setLocation(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Gui9 gui1 = new Gui9();
}
}
~~~
### 2、多行文本框(JTextArea)組件
~~~
package com.gui;
import java.awt.*;
import javax.swing.*;
public class Gui10 extends JFrame{
//定義組件
JTextArea jta = null;
JPanel jp1 = null;
JComboBox jcb = null;
JTextField jtf = null;
JButton jb = null;
JScrollPane jsp = null;
//構造方法
public Gui10(){
jta = new JTextArea();
jsp = new JScrollPane(jta);
jp1 = new JPanel();
String[] chatter = {"張三","李四"};
jcb = new JComboBox(chatter);
jtf = new JTextField(10);
jb = new JButton("發送");
//添加組件
jp1.add(jcb);
jp1.add(jtf);
jp1.add(jb);
//加入JFrame
add(jsp);
add(jp1, BorderLayout.SOUTH);
//設置窗體
setIconImage((new ImageIcon("images/image01.jpg")).getImage());
setTitle("聊天");
setSize(400, 300);
setLocation(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Gui10 gui1 = new Gui10();
}
}
~~~
### 3、頁簽組件(JTabbedPane)選項卡窗格
~~~
package com.gui;
import java.awt.*;
import javax.swing.*;
public class Gui11 extends JFrame{
//定義組件
JPanel jp1, jp2, jp3, jp4;
JLabel jl1, jl2, jl3, jl4, jl5;
JTextField jtf1;
JPasswordField jpf1;
JCheckBox jcb1, jcb2;
JButton jb1, jb2, jb3, jb4;
JTabbedPane jtp;
//構造函數
public Gui11(){
//創建組件
jp1 = new JPanel();
jp2 = new JPanel();
jp3 = new JPanel();
jp4 = new JPanel();
jl1 = new JLabel(new ImageIcon("images/image01.jpg"));
jl2 = new JLabel("賬號");
jl3 = new JLabel("密碼");
jl4 = new JLabel("忘記密碼");
jl4.setForeground(Color.BLUE);
jl5 = new JLabel("<html><a href='http://blog.csdn.net/q547550831'>訪問</a>");
jl5.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
jtf1 = new JTextField(10);
jpf1 = new JPasswordField(10);
jcb1 = new JCheckBox("隱身登錄");
jcb2 = new JCheckBox("記住密碼");
jb1 = new JButton("清除號碼");
jb2 = new JButton("登錄");
jb3 = new JButton("注銷");
jb4 = new JButton("注冊");
jtp = new JTabbedPane();
//設置布局
jp1.setLayout(new GridLayout(3, 3));
jp1.add(jl2);
jp1.add(jtf1);
jp1.add(jb1);
jp1.add(jl3);
jp1.add(jpf1);
jp1.add(jl4);
jp1.add(jcb1);
jp1.add(jcb2);
jp1.add(jl5);
jp2.setBackground(Color.RED);
jp3.setBackground(Color.BLUE);
jtp.add("賬號", jp1);
jtp.add("手機號碼", jp2);
jtp.add("電子郵件", jp3);
jp4.add(jb2);
jp4.add(jb3);
jp4.add(jb4);
//加入到JFrame
add(jl1, BorderLayout.NORTH);
add(jtp);
add(jp4, BorderLayout.SOUTH);
//設置窗體
setTitle("登錄界面");
setIconImage((new ImageIcon("images/image02.jpg")).getImage());
setSize(400, 300);
setLocation(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Gui11 gui1 = new Gui11();
}
}
~~~
### 4、菜單組件(JMenuBar、JMenu、JMenuItem)工具條組件(JToolBar)
~~~
package com.gui;
/**
* 1、菜單組件
JMenuBar 菜單條組件 樹干
JMenu 菜單組件 樹枝
JMenuItem 菜單項組件 樹葉
2、二級菜單制作
JMenu里面可以嵌套JMenu
3、工具條組件
JToolBar 容器類組件
*/
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.InputMethodEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;
public class Gui12 extends JFrame{
//文件組定義組件
JMenuBar jmb;//菜單條組件
JMenu menu1,menu2,menu3,menu4,menu5;//主菜單:文件、編輯、格式、查看、幫助
JMenuItem item2,item3,item4,item5,item6,item7;//子菜單:新建、打開、保存、另存為、頁面設置、打印、退出
JMenu xinjian;//二級菜單
JMenuItem file,project;
//編輯組定義組件
//編輯:撤消、剪切、復制、粘貼、刪除、查找、查找下一個、替換、轉到、全選、時間/日期
JMenuItem eitem1,eitem2,eitem3,eitem4,eitem5,eitem6,eitem7,eitem8,eitem9,eitem10,eitem11;
//格式組定義組件
JMenuItem oitem1,oitem2;//格式:自動換行、字體
//查看組定義組件
JMenuItem vitem1;//查看:狀態欄
//幫助組定義組件
JMenuItem hitem1,hitem2;//幫助:查看幫助、關于記事本
JTextArea jta;
//工具條
JToolBar jtb;
JButton jb1,jb2,jb3,jb4,jb5,jb6,jb7,jb8;
public static void main(String[] args) {
Gui12 win=new Gui12();
}
//構造函數
public Gui12(){
//構建組件
//工具條
jtb=new JToolBar();
jb1=new JButton(new ImageIcon("images/new.jpg"));
jb1.setToolTipText("新建");//設置提示信息
jb2=new JButton(new ImageIcon("images/open.jpg"));
jb2.setToolTipText("打開");
jb3=new JButton(new ImageIcon("images/save.jpg"));
jb3.setToolTipText("保存");
jb4=new JButton(new ImageIcon("images/copy.jpg"));
jb4.setToolTipText("復制");
jb5=new JButton(new ImageIcon("images/delete.jpg"));
jb5.setToolTipText("刪除");
jb6=new JButton(new ImageIcon("images/modify.jpg"));
jb6.setToolTipText("編輯");
jb7=new JButton(new ImageIcon("images/print.jpg"));
jb7.setToolTipText("打印");
jb8=new JButton(new ImageIcon("images/close.jpg"));
jb8.setToolTipText("關閉");
jmb=new JMenuBar();
//主菜單
menu1=new JMenu("文件(F)");
menu1.setMnemonic('F');//設置助記符
menu2=new JMenu("編輯(E)");
menu2.setMnemonic('E');
menu3=new JMenu("格式(O)");
menu3.setMnemonic('O');
menu4=new JMenu("查看(V)");
menu4.setMnemonic('V');
menu5=new JMenu("幫助(H)");
menu5.setMnemonic('H');
//文件--新建--子目錄
xinjian=new JMenu("新建");
file=new JMenuItem("文件");
project=new JMenuItem("工程");
item2=new JMenuItem("打開(O)");
item2.setMnemonic('O');
item2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL_MASK));//設置ctrl快捷組合鍵
item3=new JMenuItem("保存(S)");
item3.setMnemonic('S');
item3.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));
item4=new JMenuItem("另存為(A)");
item4.setMnemonic('A');
item5=new JMenuItem("頁面設置(U)");
item5.setMnemonic('U');
item6=new JMenuItem("打印(P)");
item6.setMnemonic('P');
item6.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P,InputEvent.CTRL_MASK));
item7=new JMenuItem("退出(X)");
item7.setMnemonic('X');
eitem1=new JMenuItem("撤消(U)");
eitem1.setMnemonic('U');
eitem1.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U,InputEvent.CTRL_MASK));
eitem2=new JMenuItem("剪切(T)");
eitem2.setMnemonic('T');
eitem2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T,InputEvent.CTRL_MASK));
eitem3=new JMenuItem("復制(C)");
eitem3.setMnemonic('C');
eitem3.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));
eitem4=new JMenuItem("粘貼(P)");
eitem4.setMnemonic('P');
eitem4.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P,InputEvent.CTRL_MASK));
eitem5=new JMenuItem("刪除(L)");
eitem5.setMnemonic('L');
eitem5.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0));
eitem6=new JMenuItem("查找(F)");
eitem6.setMnemonic('F');
eitem6.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F,InputEvent.CTRL_MASK));
eitem7=new JMenuItem("查找下一個(N)");
eitem7.setMnemonic('N');
eitem7.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F3,0));
eitem8=new JMenuItem("替換(R)");
eitem8.setMnemonic('R');
eitem8.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R,InputEvent.CTRL_MASK));
eitem9=new JMenuItem("轉到(G)");
eitem9.setMnemonic('G');
eitem9.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G,InputEvent.CTRL_MASK));
eitem10=new JMenuItem("全選(A)");
eitem10.setMnemonic('A');
eitem10.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,InputEvent.CTRL_MASK));
eitem11=new JMenuItem("時間/日期(D)");
eitem11.setMnemonic('D');
eitem11.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5,0));
oitem1=new JMenuItem("自動換行(W)");
oitem1.setMnemonic('W');
oitem2=new JMenuItem("字體(F)");
oitem2.setMnemonic('F');
vitem1=new JMenuItem("狀態欄(S)");
vitem1.setMnemonic('S');
hitem1=new JMenuItem("查看幫助(H)");
hitem1.setMnemonic('H');
hitem2=new JMenuItem("關于記事本(A)");
hitem2.setMnemonic('A');
jta=new JTextArea();
//設定布局管理器
//加入組件
//將按鈕添加到工具條上
jtb.add(jb1);
jtb.add(jb2);
jtb.add(jb3);
jtb.add(jb4);
jtb.add(jb5);
jtb.add(jb6);
jtb.add(jb7);
jtb.add(jb8);
//將菜單項添加到菜單上
xinjian.add(file);
xinjian.add(project);
menu1.add(xinjian);
menu1.add(item2);
menu1.add(item3);
menu1.add(item4);
menu1.addSeparator();//添加分割線
menu1.add(item5);
menu1.add(item6);
menu1.addSeparator();
menu1.add(item7);
menu2.add(eitem1);
menu2.addSeparator();
menu2.add(eitem2);
menu2.add(eitem3);
menu2.add(eitem4);
menu2.add(eitem5);
menu2.addSeparator();
menu2.add(eitem6);
menu2.add(eitem7);
menu2.add(eitem8);
menu2.add(eitem9);
menu2.addSeparator();
menu2.add(eitem10);
menu2.add(eitem11);
menu3.add(oitem1);
menu3.add(oitem2);
menu4.add(vitem1);
menu5.add(hitem1);
menu5.addSeparator();
menu5.add(hitem2);
//將菜單添加到菜單條上
jmb.add(menu1);
jmb.add(menu2);
jmb.add(menu3);
jmb.add(menu4);
jmb.add(menu5);
//將菜單條添加到窗體上
this.setJMenuBar(jmb);
//將工具條添加到窗體上
this.add(jtb,BorderLayout.NORTH);
JScrollPane jsp=new JScrollPane(jta);
jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
this.add(jsp);
//窗體設置
this.setTitle("Java記事本");
this.setSize(500, 400);
this.setLocationRelativeTo(null);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
~~~
### 7、java繪圖坐標體系
### 繪圖坐標本系--介紹
坐標原點位于左上角,以像素為單位。像素是計算機屏幕上最小的顯示單位。在java的坐標系中,第一個是X坐標,表示當前位置為水平方向,距離坐標原點X個像素;第二個是Y坐標,表示當前位置為垂直方向,距離坐標原點Y個像素。

### 坐標體系--像素
????計算機在屏幕上顯示的內容都是由屏幕上的每一個像素組成的。例如,計算機顯示器的分辨率是800×600,表示計算機屏幕上的每一行由800個點組成,共有600行,整個計算機屏幕共有480000個像素。現在的計算機可以支持更高的分辨率,也就是說,屏幕上可以顯示更多的像素。因此,像素是一個密度單位,而厘米是長度單位,兩者無法比較。
### 繪圖原理(1)
Component類提供了兩個和繪圖相關最重要的方法:
1、paint(Graphics?g)繪制組件的外觀
2、repaint()刷新組件的外觀
當組件第一次在屏幕顯示的時候,程序會自動的調用paint()方法來繪制組件
?
### 繪圖原理(2)
在以下情況paint()將會被調用:
1、窗口最小化,再最大化
2、窗口的大小發生變化
3、repaint函數被調用
### java繪圖技術--Graphics
#### Graphics類
Graphics類你可以理解就是畫筆,為我們提供了各種繪制圖形的方法:
1、畫直線?drawLine(int?x1,int?y1,int?x2,int?y2);
2、畫矩形邊框?drawRect(int?x,int?y,int?width,int?height);
3、畫橢圓邊框?drawOval(int?x,int?y,int?width,int?height);
4、填充矩形?fillRect(int?x,int?y,int?width,int?height);
5、填充橢圓?fillOval(int?x,int?y,int?width,int?height);
6、畫圖片?drawImage(Image?img.int?x,int?y,..);
7、畫字符串?drawString(String?str,int?x,int?y);
8、設置畫筆的字體?setFont(Font?font);
9、設置畫筆的顏色?setColor(Color?c);
~~~
package com.gui;
import java.awt.*;
import javax.swing.*;
public class Gui13 extends JFrame{
MyPanel mp = null;
public Gui13(){
mp = new MyPanel();
add(mp);
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Gui13 gui1 = new Gui13();
}
}
//定義一個MyPanel,用于繪圖和顯示繪圖的區域
class MyPanel extends JPanel{
//覆蓋JPanel的paint方法
//Graphics是繪圖的重要類,等價于畫筆
public void paint(Graphics g){
//1.調用父類方法,完成初始化
super.paint(g);
//空心圓
//g.drawOval(10, 10, 30, 30);
//直線
//g.drawLine(10, 10, 40, 40);
//空心矩形
//g.drawRect(10, 10, 40, 60);
//填充矩形
// g.setColor(Color.BLUE);
// g.fillRect(10, 10, 40, 60);
// g.setColor(Color.RED);
// g.fillRect(70, 70, 40, 60);
//在面板上畫出圖片
// Image im = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/images/image01.jpg"));
// g.drawImage(im, 10, 10, 200, 150, this);
//字符
// g.setColor(Color.red);
// g.setFont(new Font(("隸書"), Font.BOLD, 30));
// g.drawString("String 字符串", 100, 100);
//圓的輪廓
g.drawArc(100, 100, 100, 100, 20, 300);
}
}
~~~
### 8、java事件處理機制
?
### java事件處理機制--初步介紹
java事件處理是采取“委派事件模型”。所謂“委派事件模型”是指當事件發生時,產生事件的對象(即事件源),會把此“信息”傳遞給“事件的監聽者”處理的一種方式,而這里所說的“信息”實際上就是java.awt.event事件類庫里某個類所創建的對象,我們暫時把它稱為“事件的對象”。

? ? 比如:當按下按鈕時,就會在按鈕觸發一個“事件”,程序就會產生一個“事件對象”來表示這個事件,并把這個“事件對象”傳遞給“事件的監聽者”,“事件的監聽者”再根據“事件對象”的類型進行相應處理。
為了讓“產生事件的對象”[比如按鈕]知道要把事件傳遞給哪一個“事件監聽者”,我們必需先把“事件監聽者”在“產生事件的對象”注冊,這個操作也就是要告知“產生事件的對象”要把事件傳遞給它。

~~~
/**
* 功能:事件處理機制
*/
package com.gui;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Gui14 extends JFrame implements ActionListener{
//定義組件
Panel mp = null;
JButton jb1, jb2;
public Gui14(){
mp = new Panel();
//設置背景顏色
mp.setBackground(Color.black);
jb1 = new JButton("黑色");
jb2 = new JButton("紅色");
add(jb1, BorderLayout.NORTH);
add(mp);
add(jb2, BorderLayout.SOUTH);
//注冊監聽
jb1.addActionListener(this);
jb2.addActionListener(this);
//事件源是jb1,jb2,事件監聽者是gui14的對象
//指定action命令
jb1.setActionCommand("黑色");
jb2.setActionCommand("紅色");
//設置窗體
setSize(300, 200);
setLocation(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Gui14 gui1 = new Gui14();
}
//對事件處理的方法
@Override
public void actionPerformed(ActionEvent e) {
//判斷是哪個按鈕被點擊
if(e.getActionCommand().equals("黑色")){
//System.out.println("黑色");
mp.setBackground(Color.black);
} else if(e.getActionCommand().equals("紅色")){
//System.out.println("紅色");
mp.setBackground(Color.red);
} else {
}
}
}
class MyPanel2 extends JPanel{
public void paint(Graphics g){
}
}
~~~
~~~
/**
* 1.通過上下左右鍵來控制一個小球的移動
*/
package com.gui;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Gui15 extends JFrame{
//定義組件
MyPanel3 mp =null;
public Gui15(){
mp = new MyPanel3();
//mp加入JFrame
add(mp);
//添加監聽
addKeyListener(mp);
//設置窗體
setTitle("小球");
setSize(400, 300);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Gui15 gui1 = new Gui15();
}
}
//定義自己的面板
class MyPanel3 extends JPanel implements KeyListener{
private int x = 10;
private int y = 10;
public void paint(Graphics g){
super.paint(g);
//圓
g.fillOval(x, y, 20, 20);
}
//輸入的一個具體信息
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
//System.out.println("typed");
}
//按壓
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
//System.out.println("press");
//向下 向上 向左 向右
if(e.getKeyCode() == KeyEvent.VK_DOWN){
y += 2;
} else if(e.getKeyCode() == KeyEvent.VK_UP){
y -= 2;
} else if(e.getKeyCode() == KeyEvent.VK_LEFT){
x -= 2;
} else if(e.getKeyCode() == KeyEvent.VK_RIGHT){
x += 2;
}
//調用repaint()方法,重繪面板
repaint();
}
//釋放
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
//System.out.println("released" + (char)e.getKeyCode());
}
}
~~~
### java事件處理機制--深入理解
#### 1、事件源
????事件源是一個產生(或觸發)事件的對象,比如前面的JButton的一個對象jb1。當這個事件源對象的某些狀態以某種方式發生變化時,就會產生某種類型的事件(一個事件源可能會生成多個不同類型的事件)。如果某個組件(對象)希望得到事件源產生的事件,就需要在這個事件源上注冊。
#### 2、事件
事件就是承載事件源狀態改變時的信息對象。或者說,事件是事件源事件監聽器傳輸事件源狀態信息的載體。在用戶與GUI組件進行交互時就會生成事件,比如當鼠標在面板中移動時,就會生成一個鼠標移動事件的對象,而這個對象保存著當前鼠標在面板中位置信息。java.awt.event包和javax.swing.event包中定義了各種事件類型,常見的事件類有:
<table><tbody><tr><td valign="top"><p>事件類</p></td><td valign="top"><p>說明</p></td></tr><tr><td valign="top"><p>ActionEvent</p></td><td valign="top"><p>通常在按下按鈕,或雙擊一個列表項或選中某個菜單時發生</p></td></tr><tr><td valign="top"><p>AdjustmentEvnet</p></td><td valign="top"><p>當操作一個滾動條時發生</p></td></tr><tr><td valign="top"><p>ComponentEvent</p></td><td valign="top"><p>當一個組件隱藏、移動、改變大小時發送</p></td></tr><tr><td valign="top"><p>ContainerEvent</p></td><td valign="top"><p>當一個組件從容器中加入或者刪除時發生</p></td></tr><tr><td valign="top"><p>FocusEvent</p></td><td valign="top"><p>當一個組件獲得或是失去焦點時發生</p></td></tr><tr><td valign="top"><p>ItemEvent</p></td><td valign="top"><p>當一個復選框或是列表項被選中時,當一個選擇框或選擇菜單被選中</p></td></tr><tr><td valign="top"><p>KeyEvent</p></td><td valign="top"><p>當從鍵盤的按鍵被按下,松開時發生</p></td></tr><tr><td valign="top"><p>MouseEvent</p></td><td valign="top"><p>當鼠標被拖動、移動、點擊、按下..</p></td></tr><tr><td valign="top"><p>TextEvent</p></td><td valign="top"><p>當文本區和文本域的文本發生改變時發生</p></td></tr><tr><td valign="top"><p>WindowEvent</p></td><td valign="top"><p>當一個窗口激活、關閉、失效、恢復、最小化...</p></td></tr></tbody></table>
#### 3、事件監聽器接口
????事件源產生一個事件,可以傳送給事件監聽者處理,那么怎樣才能編寫一個事件監聽者呢?
????事件監聽者實際上就是一個類,該類實現了某個事件監聽器接口、比如前面我們案例中的MyPanel就是一個類,它實現了ActionListener接口,它就可以作為一個事件監聽者,對接受到的事件進行處理。
????事件監聽器接口有多種,不同的事件監聽器接口可以監聽不同的事件,一個類可以實現一個事件監聽接口,也可以實現多個監聽接口,這些接口在java.awt.event和javax.swing.event包中定義。
~~~
package com.gui;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Gui16 extends JFrame{
//定義組件
MyPanel4 mp = null;
//構造方法
public Gui16(){
mp = new MyPanel4();
//mp加入JFrame
add(mp);
//注冊監聽
addMouseListener(mp);
addKeyListener(mp);
addMouseMotionListener(mp);
//設置窗體
setSize(400, 300);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
Gui16 gui1 = new Gui16();
}
}
//1 鼠標按下輸出坐標,移出,移入,按下,釋放
//2.按鍵按下對應字符
//3.鼠標移動、拖拽
//4.窗口變化(關閉,最小化,最大化)
//定義自己的面板
class MyPanel4 extends JPanel implements MouseListener, KeyListener, MouseMotionListener, WindowListener{
public void paint(Graphics g){
super.paint(g);
}
//鼠標
//鼠標點擊
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("鼠標點擊了 x = " + e.getX() + " y = " + e.getY());
}
//鼠標按下
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("鼠標按下");
}
//鼠標松開
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("鼠標松開");
}
//鼠標移動到MyPanel4
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("鼠標移出");
}
//鼠標移出MyPanel4
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("鼠標進入");
}
//鼠標拖拽
@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
}
//鼠標移動
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("鼠標當前坐標x = " + e.getX() + " Y = " + e.getY());
}
//鍵盤
//輸入具體信息
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
//按下
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
System.out.println(e.getKeyChar() + "鍵被按下");
}
//釋放
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
//窗口
//窗口打開
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
//窗口正在關閉
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
}
//窗口關閉
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
//窗口最小化
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
//窗口最小化到顯示
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
//窗口被激活了
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
//窗口變成非激活窗口
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
}
~~~
### java事件處理機制--總結
#### 總結--事件編程步驟:
1、編寫事件處理類(事件監聽者)
2、根據需求給事件處理類實現監聽器接口
3、在事件處理中重寫(實現)其事件處理的函數
4、在事件源類中指定該事件的監聽器(響應者)是誰
?
#### 注意事項:
1、java采用委托機制處理事件
2、java中的事件是分類的,比如對窗體事件、鼠標事件、按鍵事件、操作事件[按按鈕]
3、java中一個類要監聽某個事件,則必需實現相應的事件監聽接口
4、事件監聽接口有多種,程序員應當針對不同的情況,實現不同的監聽接口,比如監聽鼠標事件就應當實現MouseListener;要監聽鍵盤事件,就應當實現KeyListener..
5、在實現監聽接口的類(事件監聽類/者)中,需要重寫處理函數,比如實現了ActionListener接口,就應當重寫actionPerformed(ActionEvent?e),可以參考前面的事件監聽器接口表格
6、在事件源中需要注冊事件監聽類。否則事件監聽類接收不到事件源發生的事件。
?
#### 一個類要實現監聽的步驟:
a、實現相應的接口[KeyListener/MouseListener/ActionListener/WindowListener]
b、把接口的處理方法根據需要重新編寫(Override)
c、在事件源上注冊監聽
d、事件傳遞是靠事件(類)對象
----------參考《韓順平.循序漸進學.java.從入門到精通》
----------參考《JDK_API_1_6_zh_CN》
Java學習筆記--導航[http://blog.csdn.net/q547550831/article/details/49819641](http://blog.csdn.net/q547550831/article/details/49819641)