W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
圖形用戶界面(Graphical User Interface,簡稱 GUI,又稱圖形用戶接口)是指采用圖形方式顯示的計算機操作用戶界面
與早期計算機使用的命令行界面相比,圖形界面對于用戶來說在視覺上更易于接受
主要包含5 個 API: AWT, JavaD, Accessibility,Drag & Drop,Swing
它提供了幫助開發(fā)人員設(shè)計復(fù)雜應(yīng)用程序的一整套應(yīng)用程序開發(fā)包
組件構(gòu)成圖形界面零部件面板按鈕下拉選等等,具有圖形界面,并能完成一定功能的封裝體
用于包含其它組件的組件
- Swing 是 Java 平臺的 UI —— 它充當處理用戶和計算機之間全部交互的軟件
它實際上充當用戶和計算機內(nèi)部之間的中間人
- Swing組件是Java語言提供的第二代GUI設(shè)計工具包
它以AWT為基礎(chǔ)在AWT內(nèi)容的基礎(chǔ)上新增或改進了一些GUI組件使得GUI程序功能更強大設(shè)計更容易、更方便
Swing 組件主要為文本處理、按鈕、標簽、列表、pane、組合框、滾動條、滾動 pane、菜單、表格和樹提供了組件
- JButton 能顯示文本和圖形的按鈕,它是AWT按鈕組件的替代組件
- JCheckBox 能顯示文本和圖形的復(fù)選框,它是AWT選擇組件的替代組件
- JCheckBoxMenuItem 一個復(fù)選框菜單項,它是AWT的復(fù)選框菜單項組件的替代組件
- JComboBox 帶下拉列表的文本框,它是AWT選擇組件的替代組件
- JComponent 所有輕量J組件的基類
- JDesktopPane 內(nèi)部窗體的容器
- JDialog Swing對話框的基類,它擴展了AWT Dialot類
- JEditorPane 用于編輯文本的文本窗格
- JFrame 擴展java.awt.Frame的外部窗體
- JInternalFrame 在JDesktopPane中出現(xiàn)的內(nèi)部窗體
- JLabel 可顯示文本和圖標的標簽,它是AWT標簽組件的替代組件
- JLayeredPane 能夠在不同層上顯示組件的容器
- JList 顯示選項列表的組件,它是AWT列表組件的替代組件
- JMenu 菜單條中顯示的一個菜單,它是AWT菜單組件的替代組件
- JMenuBar 用于顯示菜單的菜單條,它是AWT菜單條組件的替代組件
- JMenuItem 菜單項,它是AWT菜單項組件的替代組件
- JOptionPane 顯示標準的對話框,如:消息和問題對話框
- JPanel 通用容器,它是AWT面板和畫布組件的替代組件
- JPasswordfield JTextField的擴展,使輸入的字符不可見
- JPopupMenu 彈出式菜單,它是AWT彈出式菜單組件的替代組件
- JProgressBar 進度指示器
- JRadioButton 單選按鈕,它是AWT復(fù)選框組件的替代組件
- JRootPane 頂層容器,它包含一個玻璃窗格,一個層窗格,一個內(nèi)容窗格和一個可選的菜單條
- JScrollBar 滾動條,它是AWT滾動條組件的替代組件
- JScrollPane 滾動窗格,它是AWT滾動窗格組件的替代組件
- JSeparator 水平或垂直分隔條
- JSlider 滑桿
- JSplitPane 有兩個分隔區(qū)的容器,這兩個分隔區(qū)可以水平排列或者垂直排列且分隔區(qū)的大小能自動調(diào)整
- JTabbedPane 帶選項卡的窗格
- JTable 表格
- JTableHeader 表格頭
- JTextArea 用于輸入多行文本的文本域,它是AWT文本域組件的替代組件
- JTestComponent 文本組件的基類,它替代AWT的TextComponent類
- JTextField 單行文本域,它替代AWT的單行文本域組件
- JTextPane 簡單的文本編輯器
- JToggleButton 兩種狀態(tài)的按鈕,它是JCheckBox和JRadioButton組件的基類
- JToolBar 工具條
- JToolTip 當光標停留在一個組件上時,該組件上顯示的一行文字
- JTree 用于按鈕層次組織數(shù)據(jù)的結(jié)構(gòu)控件
- JViesport 用于瀏覽可滾動組件的視口
- JWindow 外部窗口,它是java.awt.Window的擴展
AWT: AWT 是抽象窗口工具集(Abstract Window Toolkit)的英文縮寫,為用戶界面程序提供所需要的組件
- 例如按鈕、標簽、復(fù)選框、下拉菜單、畫布、文本輸入?yún)^(qū)、列表等
- 此外,AWT還提供事件類、監(jiān)聽器類、圖形處理工具、2D 圖形等的支持
- AWT 存在缺少剪貼板、打印支持等缺陷,甚至沒有彈出式菜單和滾動窗口
java.awt包,在這個包中,提供了基本的java程序GUI設(shè)計工具:
- Component/MenuComponent
- Container
- LayoutMa
Swing: 不是真正使用原生平臺提供設(shè)備,而是僅僅在模仿,因此可以在任何平臺上使用Swing 圖形用戶界面組件
- Swing 絕大部分組件都是輕量級組件,它不像重量級組件那樣必須在它們自己本地窗口中繪制,而是在它們所在的重量級窗口中繪制,它比AWT適應(yīng)性更強
Container(容器)
- 容器(Container)實際上是Component的子類,因此容器類對象本身也是一個組件,具有組件的所有性質(zhì),另外還具有容納其它組件和容器的功能。
- 容器類對象可使用方法add()添加組件
兩種主要的容器類型
- Window:可獨立存在的頂級窗口
- Panel:可作為容器容納其它組件,但不能獨立存在,必須被添加到其它容器中(如Window 或 Applet)
Container常用方法:
- add()
- setLocation():設(shè)置位置
- setSize():設(shè)置大小
- setBoundes():同時設(shè)置大小、位置
- setVisible()
- pack()
Frame類:
- 代表一個窗口,是Window類的子類
- 有標題,可通過拖拉改變大小
- 初始化時為不可見,可用setVisible(true)使其顯示出來
- 使用BorderLayout作為其缺省布局管理器
- 使用setLayout方法改變布局管理器
Container的布局管理器
- AWT中的布局管理器有:
- FlowLayout
- BorderLayout
- GridLayout
- CardLayout
- GridBagLayout
基本組件
- Button:按鈕,可接收單擊操作
- Canvas:用于繪圖的畫布
- Checkbox:復(fù)選框組件(也可變成單選框組件)
- CheckboxGroup:用于將多個Checkbox組件組合成一組,一組Checkbox組件將只有一個可以被選中,即全部變成單選框組件
- Choice:下拉式選擇框組件
- Frame:窗口,在GUI程序里通過該類創(chuàng)建窗口
- Label:標簽類,用于放置提示性文本
- List。列表框組件,可以添加多項條目
- Panel:不能單獨存在基本容器類,必須放到其他容器中
- Scrollbar:滑動條組件。如果需要用戶輸入位于某個范圍的值,就可以使用滑動條組件。如調(diào)色板中設(shè)置RGB的三個值所用的滑動條。當創(chuàng)建一個滑動條時,必須指定它的方向、初始值、滑塊的大小、最小值和最大值
- ScrollPane:帶水平及垂直滾動條的容器組件
- TextArea:多行文本域
- TextField:單行文本框
AWT的事件處理方式
- 委派式事件處理(delegation)----個別的組件將整個事件處理委托給特定的對象,當該組件發(fā)生指定的事件時,就通知所委托的對象,有這個對象來處理這個事件,這個受委托處理事件的對象稱為事件傾聽對象(event listener)
- 每個組件均可以針對特定的事件指定一個或多個事件傾聽對象,由這些事件傾聽對象負責處理事件
創(chuàng)建菜單 :創(chuàng)建一個菜單步驟:
- 創(chuàng)建一個MenuBar對象,將其放置到菜單容器中(如Frame)
- 創(chuàng)建若干個Menu對象,將其放置到MenuBar對象中
- 創(chuàng)建若干個MenuItem對象,將其放置到Menu對象中
MenuItem包括
- MenuItem:普通的菜單項
- CheckboxMenuItem:可以選擇的菜單項
右鍵菜單 :右鍵菜單使用PopupMenu對象表示,創(chuàng)建右鍵菜單的步驟如下:
- (1)創(chuàng)建PopupMenu的實例
- (2)創(chuàng)建多個MenuItem實例,依次將這些實例加入PopupMenu中
- (3)將PopupMenu加入到目標組件之中
- (4)為需要出現(xiàn)上下文菜單的組件編寫鼠標監(jiān)聽器,當用戶釋放鼠標右鍵時彈出右鍵菜單
AWT中畫圖:創(chuàng)建Canvas類或Panel的子類,并覆蓋paint方法
- 每當組件出現(xiàn)時調(diào)用paint方法
- 每個組件都有一個Graphics對象
- Graphics類實現(xiàn)了很多繪圖方法
Graphics類:Graphics是一個抽象的畫筆對象,Graphics可以在組件上繪制豐富多彩的幾何圖形和位圖,Graphics類提供了如下幾個方法用于繪制幾何圖形和位圖
- drawLine:繪制直線
- drawString:繪制字符串
- drawRect:繪制矩形
- drawRoundRect:繪制圓角矩形
- drawOval:繪制橢圓形狀
- drawPolygon:繪制多邊形邊框
- drawArc:繪制一段圓弧(可能是橢圓的圓?。?
- drawPolyline:繪制折線
- fillRect:填充一個矩形區(qū)域
- fillRoundRect:填充一個圓角矩形區(qū)域
- fillOval:填充橢圓區(qū)域
- fillPolygon:填充一個多邊形區(qū)域
- fillArc:填充圓弧和圓弧兩個端點到中心連線所包圍的區(qū)域。
- drawImage:繪制位圖
JMenu/JMenuItem/JMenuBar(菜單、菜單項、菜單條)
1.菜單條:類JMenuBar的實例就是菜單條。例如,以下代碼創(chuàng)建菜單條對象menubar:
JMenuBar menubar = new JMenuBar();
在窗口中增設(shè)菜單條,必須使用JFrame類中的setJMenuBar()方法
例如,代碼:setJMenuBar(menubar);
類JMenuBar的常用方法有:
- add(JMenu m):將菜單m加入到菜單條中
- countJMenus():獲得菜單條中菜單條數(shù)
- getJMenu(int p):取得菜單條中的菜單
- remove(JMenu m):刪除菜單條中的菜單m
2. 菜單:由類JMenu創(chuàng)建的對象就是菜單,類JMenu的常用方法如下:
- JMenu():建立一個空標題的菜單
- JMenu(String s):建立一個標題為s的菜單
- add(JMenuItem item):向菜單增加由參數(shù)item指定的菜單選項
- add(JMenu menu):向菜單增加由參數(shù)menu指定的菜單。實現(xiàn)在菜單嵌入子菜單
- addSeparator():在菜單選項之間畫一條分隔線
- getItem(int n):得到指定索引處的菜單項
- getItemCount():得到菜單項數(shù)目
- insert(JMenuItem item,int n):在菜單的位置n插入菜單項item
- remove(int n):刪除菜單位置n的菜單項
- removeAll():刪除菜單的所有菜單項
3.菜單項:類JMenuItem 的實例就是菜單項。類JMenuItem的常用方法如下:
- JMenuItem():構(gòu)造無標題的菜單項
- JMenuItem(String s):構(gòu)造有標題的菜單項
- setEnabled(boolean b):設(shè)置當前單項是否可被選擇
- isEnabled():返回當前菜單項是否可被用戶選擇
- getLabel():得到菜單項的名稱
- setLabel():設(shè)置菜單選項的名稱
- addActionListener(ActionListener e):為菜單項設(shè)置監(jiān)視器。監(jiān)視器接受點擊某個菜單的動作事件
什么是事件
- 用戶用于交互而產(chǎn)生的鍵盤或鼠標動作
- 響應(yīng)用戶的動作稱為處理事件
JAVA事件的委托機制
- 1.事件源先注冊好監(jiān)聽器(監(jiān)聽器負責監(jiān)聽事件的產(chǎn)生),(監(jiān)聽器是實現(xiàn)監(jiān)聽器接口的類,監(jiān)聽器接口定義了一個要成為監(jiān)聽器的類應(yīng)該實現(xiàn)的方法,同時監(jiān)聽器接口都繼承與監(jiān)聽器接口基類java.util.EventListener 雖然這個接口沒有定義任何需要實現(xiàn)的方法,但是它有它的用途,它作為一種標志,標志著繼承自它的接口是監(jiān)聽器接口)
- 2.事件源產(chǎn)生事件(前提: 聲明好相應(yīng)的事件類,事件類都必須繼承自JAVA的事件基類java.util.EventObject,EventObject(Object source)是EventObject唯一的構(gòu)造方法,這意味著所有事件必須在實例化時就指定事件源,這一點很好,要求在產(chǎn)生事件的時候明確 是誰產(chǎn)生的 為后面的尋根提供保障)
- 3.事件源廣播事件給任意一個在它上面注冊的監(jiān)聽器
- 4.監(jiān)聽器接受事件并執(zhí)行相應(yīng)的事件處理方法
Java的事件處理機制
- 1.事件源(event source)
事件源是一個能夠注冊監(jiān)聽器對象并發(fā)送事件對象的對象。例如按鈕或者滾動條就是事件源
- 2.事件,事件類型和事件對象
事件一般是用戶在界面上的一個操作,當一個事件發(fā)生時,該事件用一個事件對象來表示,事件對象有對應(yīng)的事件類
不同的事件類描述不同類型的用戶動作,不同的事件源可以產(chǎn)生不同類別的事件。例如,按鈕可以發(fā)送ActionEvent對象,而窗口可以發(fā)送WindowEvent對象,在Java中,所有的事件對象都最終派生于java.util.EventObject類
- 3.事件監(jiān)聽器(event listener)
監(jiān)聽器對象是一個實現(xiàn)了特定監(jiān)聽器接口(listener interface)的類的實例
事件監(jiān)聽器類(監(jiān)聽器對象所屬的類)必須實現(xiàn)事件監(jiān)聽器接口或繼承事件監(jiān)聽器適配器類
事件監(jiān)聽器接口定義了處理事件必須實現(xiàn)的方法
事件監(jiān)聽器適配器類是對事件監(jiān)聽器接口的簡單實現(xiàn)。目的是為了減少編程的工作量
處理事件的方法被稱為事件處理器,即事件監(jiān)聽器接口定義,并在事件監(jiān)聽器類中實現(xiàn)的方法
- 4.注冊事件監(jiān)聽器
為了能夠讓事件監(jiān)聽器檢查某個組件(事件源)是否發(fā)生了某些事件,并且在發(fā)生時激活事件處理器進行相應(yīng)的處理,必須在事件源上注冊事件監(jiān)聽器
這是通過使用事件源組件的以下方法來完成的:
addXxxListener(事件監(jiān)聽器對象)
Xxx對應(yīng)相應(yīng)的事件類
實例一:GUI記事本
package cn.guis;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
/**
* 記事本
* @author JEEP-711
*
*/
@SuppressWarnings("serial")
public class GuiNotepad extends JFrame{
JEditorPane je = null;//定義成員
//構(gòu)造器
public GuiNotepad(){
/**
* 繪制界面
*/
this.setLayout(null);
JLabel jb = new JLabel();
setTitle("記事本");//窗口標題
this.setBounds(615, 98,836,908);//設(shè)置窗口寬為536像素,高為408像素
je = new JEditorPane();//創(chuàng)建文本框?qū)ο?
je.setText("\r\n");//提示
je.setFont(new java.awt.Font("Dialog",1, 20));//設(shè)置字體樣式
je.setSize(836,908);//設(shè)置寬高
add(je);//添加當前對象
setResizable(false);// 設(shè)置窗體是否可以調(diào)整大小,參數(shù)為布爾值
this.add(jb);//將其加入到窗口當中
/**
* 設(shè)置窗口圖標
*/
Toolkit kit = Toolkit.getDefaultToolkit();
Image image = kit.getImage("src//image//0x1f4dd.png"); //設(shè)置窗口圖標路徑
setIconImage(image); //換掉窗體樣式
/**
* 繪制菜單
* 文件菜單
*
*/
JEditorPane jee = new JEditorPane();
JMenuBar jr = new JMenuBar();//創(chuàng)建菜單條對象
JMenu jm = new JMenu("文件");
//新建項
JMenuItem ji = new JMenuItem();//創(chuàng)建菜單項對象
ji.setText("新建");
//動作事件接口
ji.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
//jee.JEditorPane();//創(chuàng)建文本框?qū)ο?
jee.setText("請輸入內(nèi)容: ");//提示
jee.setSize(836,908);//設(shè)置寬高
add(jee);//添加當前對象
}
});
this.add(ji);
/**
* 保存項
*/
JMenuItem bc = new JMenuItem("保存");//創(chuàng)建保存項
//動作事件接口
bc.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
try {
FileWriter fw = new FileWriter("src//記事本.txt",true);//實例化文件寫入
fw.write(je.getText());//寫入當前內(nèi)容
fw.flush();//刷新
fw.close();//關(guān)閉流
System.out.println("成功保存");//提示
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
} catch(NullPointerException e1){
System.out.println("您操作有誤!");
}
}
});
this.add(bc);
/**
* 編輯菜單
*/
JMenu j1 = new JMenu(); //創(chuàng)建菜單對象
j1.setText("編輯");
JMenuItem jit = new JMenuItem();//創(chuàng)建菜單項對象
jit.setText("查找");
/**
* 格式菜單
*/
JMenu j2 = new JMenu(); //創(chuàng)建菜單格式對象
j2.setText("格式");
JMenuItem zt = new JMenuItem();//創(chuàng)建菜單項對象
zt.setText("字體");
/**
* 查看菜單
*/
JMenu j3 = new JMenu(); //創(chuàng)建菜單查看對象
j3.setText("查看");
JMenuItem ztl = new JMenuItem();//創(chuàng)建菜單項對象
ztl.setText("狀態(tài)欄");
/**
* 幫助菜單
*/
JMenu j4 = new JMenu(); //創(chuàng)建菜單幫助對象
j4.setText("幫助");
JMenuItem jt = new JMenuItem();//創(chuàng)建菜單項對象
jt.setText("關(guān)于記事本");
/**
* 添加功能
*/
jm.add(ji);//把新建添加到菜單
jr.add(jm);//把菜單加載到菜單條
jr.add(j1);//把編輯添加到菜單條
j1.add(jit);//將查找添加到編輯
jr.add(j2);//把格式添加到菜單條
jr.add(j3);//把查看添加到菜單條
jr.add(j4);//把幫助添加到菜單條
j4.add(jt);//把關(guān)于記事本添加j4
j2.add(zt);//將字體加入到j(luò)2
j3.add(ztl);//將菜單項加入到菜單
jm.add(bc);//將保存加入到菜單
setDefaultCloseOperation(EXIT_ON_CLOSE);// 用戶點擊窗口關(guān)閉
this.setJMenuBar(jr);
this.setVisible(true);//設(shè)置是否窗口顯示
}
//定義主方法
public static void main(String[] args){
new GuiNotepad();//調(diào)用方法
}
}
實例二:GUI用戶猜數(shù)程序
package cn.gui;
import java.awt.Color;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Scanner;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
/**
* 猜數(shù)小程序
* @author JEEP-711
*
*/
@SuppressWarnings("serial")
public class Plays extends JFrame{
boolean flag = true;
Scanner info = new Scanner(System.in);
//構(gòu)造方法
public Plays(){
/**
* 繪制界面
*/
this.setLayout(null);
JLabel jl = new JLabel();//實例化界面對象
setTitle("猜數(shù)游戲");//設(shè)置窗口標題
setResizable(false);//設(shè)置窗口不可調(diào)整大小
this.setBounds(560, 290,836, 510);//設(shè)置窗口大小
this.add(jl);//添加到窗口
/**
* 返回隨機數(shù)文本輸入框
*/
JTextArea jt = new JTextArea("游戲隨機數(shù):");//實例化文本框?qū)ο?
jt.setBounds(215,105,140,50);//設(shè)置文本大小
jt.setFont(new java.awt.Font("宋體",0, 16));//設(shè)置字體樣式
this.add(jt);//添加當前文本對象
jt.setBackground(new Color(231,210,181));
/**
* 用戶輸入數(shù)字文本框
*/
JTextArea ues = new JTextArea("請輸入一個數(shù)字:");//實例化用戶文本框?qū)ο?
ues.setBounds(460,105,140,50);//設(shè)置文本大小
ues.setFont(new java.awt.Font("宋體",0, 15));//設(shè)置字體樣式
this.add(ues);//添加當前文本對象
ues.setBackground(new Color(230,207,176));
/**
* 設(shè)置游戲開始按鈕
*/
JButton jbn = new JButton("點擊游戲開始");//實例化開始按鈕對象
jbn.setBounds(218,205,140,50);//設(shè)置按鈕位置
jbn.setFont(new java.awt.Font("Dialog",1, 15));//設(shè)置字體樣式
jbn.setForeground(Color.white);//設(shè)置字體顏色
jbn.setBackground(new Color(8,163,219));//設(shè)置按鈕顏色
//監(jiān)聽事件
jbn.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
//實例化線程
new Thread(new Runnable(){
@Override//覆寫線程方法
public void run() {
//循環(huán)flag
while(flag){
int sj = (int)(Math.random()*95+5);//random*括號里的最大數(shù)減去最小數(shù)加最小數(shù)千位我認識的看風景阿斯蒂芬& & 聚少離多激發(fā)了考慮考慮我怎么知道掃你在哪啦圣誕節(jié)付款金額按樂山大佛薩頂頂 的
jt.setText(""+sj);//設(shè)置顯示隨機數(shù)框
try {
Thread.sleep(100);//睡眠100毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();//開始線程
}});
this.add(jbn);//添加當前開始按鈕
/**
* 停止以后輸出結(jié)果
*/
JLabel jg = new JLabel("--公布游戲結(jié)果--");
jg.setBounds(330, 270, 200, 30);
jg.setFont(new java.awt.Font("宋體",0, 12));//設(shè)置字體樣式
this.add(jg);
/**
* 設(shè)置游戲結(jié)束按鈕
*/
JButton jtn = new JButton("點擊結(jié)束游戲");//實例化結(jié)束按鈕對象
jtn.setFont(new java.awt.Font("Dialog",1, 15));//設(shè)置字體樣式
jtn.setBounds(420,205,140,50);//設(shè)置按鈕位置
jtn.setForeground(Color.white);//設(shè)置字體顏色
jtn.setBackground(new Color(8,163,219));//設(shè)置按鈕顏色
//監(jiān)聽事件
jtn.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
flag = false;//等于假就結(jié)束
//比較結(jié)果
if(ues.getText().equals(jt.getText())){
jg.setText("恭喜你猜對了,結(jié)果為:"+ues.getText());
}else{
jg.setText("你的輸入不正確,"+"正確答案是:"+jt.getText());
}
}
});
this.add(jtn);//添加當前結(jié)束按鈕
/**
* 設(shè)置窗口圖標
*/
Toolkit kit = Toolkit.getDefaultToolkit();
Image image = kit.getImage("src//image//0x1f3ae.png"); //設(shè)置窗口圖標路徑
setIconImage(image); //換掉窗體樣式
setDefaultCloseOperation(EXIT_ON_CLOSE);// 用戶點擊窗口關(guān)閉
/**
* 設(shè)置背景圖片
*
*/
setSize(836, 510);//設(shè)置大小
String path = "src//image//timg.jpg";//設(shè)置背景圖片的路徑
ImageIcon background = new ImageIcon(path); // 背景圖片
JLabel label = new JLabel(background);// 把背景圖片顯示在一個標簽里面
label.setBounds(0, 0, this.getWidth(), this.getHeight()); // 把標簽的大小位置設(shè)置為圖片剛好填充整個面板
JPanel imagePanel = (JPanel) this.getContentPane(); // 把內(nèi)容窗格轉(zhuǎn)化為JPanel,否則不能用方法setOpaque()來使內(nèi)容窗& 格透明
imagePanel.setOpaque(false);
this.getLayeredPane().add(label, new Integer(Integer.MIN_VALUE));// 把背景圖片添加到分層窗格的最底層作為背景
this.setVisible(true);//設(shè)置是否窗口顯示
}
//主方法
public static void main(String[] args) {
new Plays();//調(diào)用方法
}
}
實例三:GUI紅綠燈程序
package cn.gui;
import java.awt.Color;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractButton;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
/**
* 交通警示燈-紅 黃 綠 燈
* @author JEEP-711
*
*/
@SuppressWarnings({ "serial", "unused" })
public class WarningLight extends JFrame{
boolean flag = true;//定義成員屬性,作為標記
//構(gòu)造方法
public WarningLight(){
/**
* 繪制界面
*/
this.setLayout(null);
JLabel jl = new JLabel();//實例化界面對象
setTitle("交通信號燈程序");//設(shè)置標題
this.setBounds(515, 98,836,908);//設(shè)置窗口寬為836像素,高為908像素
this.add(jl);//將其加入到窗口當中
setResizable(false);// 設(shè)置窗體是否可以調(diào)整大小,參數(shù)為布爾值
setDefaultCloseOperation(EXIT_ON_CLOSE);// 用戶點擊窗口關(guān)閉
/**
* 設(shè)置開始按鈕
*/
JButton begin = new JButton("點擊開始");//實例化開始按鈕
begin.setBounds(610,370,140,50);
begin.setFont(new java.awt.Font("Dialog",1, 15));//設(shè)置字體樣式
begin.setForeground(Color.white);//設(shè)置字體顏色
begin.setBackground(new Color(8,163,219));//設(shè)置按鈕顏色
/**
* 設(shè)置顏色
*/
// JTextArea area = new JTextArea();
// area.setBounds(200, 200, 400, 400);
// this.add(area);
/**
* 警示燈切換
*/
JLabel lb = new JLabel();//實例化對象
lb.setBounds(200,50,568,798);//設(shè)置寬高
jl.add(lb);//添加到j(luò)n里
this.add(lb);//添加當前的lb
/**
* 文字提示
*/
JLabel ts = new JLabel("交通信號提示");
ts.setBounds(586, 280, 200, 30);
ts.setFont(new java.awt.Font("黑體",1, 30));//設(shè)置字體樣式
//jg.setForeground(Color.white);//設(shè)置字體顏色
add(ts);
//監(jiān)聽器,事件處理
begin.addActionListener(new ActionListener(){
@Override//覆寫方法
public void actionPerformed(ActionEvent e) {
//匿名實例化線程
new Thread(new Runnable(){
@Override//覆寫run方法
public void run() {
//循環(huán)標記
while(flag){
lb.setIcon(new ImageIcon("src//image//紅燈.png"));//設(shè)置顯示紅燈png
lb.setSize(368,698);//設(shè)置寬高
//area.setBackground(Color.RED);
try {
ts.setText("紅燈/停一停");
Thread.sleep(5200);//設(shè)置睡眠
} catch (InterruptedException e) {
e.printStackTrace();
}
lb.setIcon(new ImageIcon("src//image//黃燈.png"));//設(shè)置顯示黃燈png
lb.setSize(368,698);//設(shè)置寬高
ts.setText("黃燈/等一等");
//area.setBackground(Color.YELLOW);
try {
Thread.sleep(2000);//設(shè)置睡眠
} catch (InterruptedException e) {
e.printStackTrace();
}
lb.setIcon(new ImageIcon("src//image//綠燈.png"));//設(shè)置顯示綠燈png
lb.setSize(368,698);//設(shè)置寬高
ts.setText("綠燈/可通行");
// area.setBackground(Color.GREEN);
try {
Thread.sleep(5000);//設(shè)置睡眠
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();//開啟線程
}
});
this.add(begin);//添加當前按鈕
/**
* 設(shè)置結(jié)束按鈕
*/
JButton end = new JButton("點擊結(jié)束");//實例化結(jié)束按鈕
end.setBounds(610,432,140,50);
end.setFont(new java.awt.Font("Dialog",1, 15));//設(shè)置字體樣式
end.setForeground(Color.white);//設(shè)置字體顏色
end.setBackground(new Color(8,163,219));//設(shè)置按鈕顏色
//事件處理
end.addActionListener(new ActionListener(){
@Override//覆寫方法
public void actionPerformed(ActionEvent e) {
flag=false;//結(jié)束進程
}
});
this.add(end);//添加當前結(jié)束按鈕
/**
* 設(shè)置窗口圖標
*/
Toolkit kit = Toolkit.getDefaultToolkit(); //創(chuàng)建窗口圖標對象
Image image = kit.getImage("src//image//0x1f6a6.png"); //設(shè)置窗口圖標路徑
setIconImage(image); //換掉窗體樣式
/**
* 設(shè)置背景圖片
*
*/
setSize(839, 908);//設(shè)置大小
String path = "src//image//交通安全燈.jpg";//設(shè)置背景圖片的路徑
ImageIcon background = new ImageIcon(path); // 背景圖片
JLabel label = new JLabel(background);// 把背景圖片顯示在一個標簽里面
label.setBounds(0, 0, this.getWidth(), this.getHeight()); // 把標簽的大小位置設(shè)置為圖片剛好填充整個面板
JPanel imagePanel = (JPanel) this.getContentPane(); // 把內(nèi)容窗格轉(zhuǎn)化為JPanel,否則不能用方法setOpaque()來使內(nèi)容窗& 格透明
imagePanel.setOpaque(false);
this.getLayeredPane().add(label, new Integer(Integer.MIN_VALUE));// 把背景圖片添加到分層窗格的最底層作為背景
this.setVisible(true);//設(shè)置是否窗口顯示
}
//定義主方法
public static void main(String[] args) {
new WarningLight();//調(diào)用方法
}
}
實例四:GUI單機五子棋程序
package cn.gobang;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
/**
* 五子棋
* @author JEEP-711
*
*/
@SuppressWarnings("serial")
public class Gobangs extends JFrame{
/**
* 構(gòu)造方法
*/
public Gobangs(){
/**
* 自定義組件
*/
this.setLayout(null);
this.setBounds(610, 140,630,630);//設(shè)置寬高
setTitle("國際五子棋");
setResizable(false);// 設(shè)置窗體是否可以調(diào)整大小,參數(shù)為布爾值
/**
* 開始按鈕
*/
JButton dy = new JButton("開始對弈");//創(chuàng)建開始按鈕
dy.setBounds(138,670,100,50);//設(shè)置位置
dy.setFont(new java.awt.Font("Dialog",1, 15));//設(shè)置字體樣式
dy.setForeground(Color.white);//設(shè)置字體顏色
dy.setBackground(new Color(8,163,219));//設(shè)置按鈕顏色
//監(jiān)聽器
dy.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
Gobangss();//調(diào)用五子棋開始方法
}
});
this.add(dy);//添加當前對弈按鈕
/**
* 悔棋按鈕
*/
JButton hq = new JButton("悔棋");//創(chuàng)建悔棋按鈕
hq.setBounds(270,670,100,50);//設(shè)置位置
hq.setFont(new java.awt.Font("Dialog",1, 15));//設(shè)置字體樣式
hq.setForeground(Color.white);//設(shè)置字體顏色
hq.setBackground(new Color(8,163,219));//設(shè)置按鈕顏色
//監(jiān)聽器
hq.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
}
});
this.add(hq);//添加當前悔棋按鈕
/**
* 重新開始
*/
JButton cx = new JButton("重新開始");//創(chuàng)建重新開始對象
cx.setBounds(410,670,100,50);//設(shè)置位置
cx.setFont(new java.awt.Font("Dialog",1, 15));//設(shè)置字體樣式
cx.setForeground(Color.white);//設(shè)置字體顏色
cx.setBackground(new Color(8,163,219));//設(shè)置按鈕顏色
//監(jiān)聽器
cx.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
//if(cx!= null){
Gobangss();//調(diào)用方法
//}
}
});
this.add(cx);//添加當前對象
/**
* 退出游戲
*/
JButton tc = new JButton("退出游戲");//創(chuàng)建退出按鈕
tc.setBounds(545,670,100,50);//設(shè)置位置
tc.setFont(new java.awt.Font("Dialog",1, 15));//設(shè)置字體樣式
tc.setForeground(Color.white);//設(shè)置字體顏色
tc.setBackground(new Color(8,163,219));//設(shè)置按鈕顏色
//監(jiān)聽事件
tc.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
System.exit(1);//退出游戲界面
}
});
this.add(tc);//添加當前對象
/**
* 設(shè)置窗口圖標
*/
Toolkit kit = Toolkit.getDefaultToolkit();
Image image = kit.getImage("src//image//0x1f3a8.png"); //設(shè)置窗口圖標路徑
setIconImage(image); //換掉窗體樣式
/**
* 設(shè)置背景圖片
*
*/
setSize(800,800);//設(shè)置大小 board 535, 536
String path = "src//image//qp.jpg";//設(shè)置背景圖片的路徑
ImageIcon background = new ImageIcon(path); // 背景圖片
JLabel label = new JLabel(background);// 把背景圖片顯示在一個標簽里面
label.setBounds(0, 0, this.getWidth(), this.getHeight()); // 把標簽的大小位置設(shè)置為圖片剛好填充整個面板
JPanel imagePanel = (JPanel) this.getContentPane(); // 把內(nèi)容窗格轉(zhuǎn)化為JPanel,否則不能用方法setOpaque()來使內(nèi)容窗& 格透明
imagePanel.setOpaque(false);
this.getLayeredPane().add(label, new Integer(Integer.MIN_VALUE));// 把背景圖片添加到分層窗格的最底層作為背景
setDefaultCloseOperation(EXIT_ON_CLOSE);// 用戶點擊窗口關(guān)閉
this.setVisible(true);//設(shè)置是否窗口顯示
}
/**
* 創(chuàng)建五子棋開始方法
*/
public void Gobangss(){
Draw dr = new Draw();
//dr.setBounds(140,100,535,510);
dr.setBounds(140,100,535,510);
dr.addMouseListener(dr);
this.setBounds(610, 140,799,799);//設(shè)置寬高
this.add(dr);
}
public static void main(String[] args) {
new Gobangs();//調(diào)用方法
new Draw();//調(diào)用繪制五子棋類
}
}
/**
* 繪制五子棋盤,繼承JComponet類
* @author JEEP-711
* 實現(xiàn)接口 MouseListener
*/
@SuppressWarnings("serial")
class Draw extends JComponent implements MouseListener{
private boolean isblack = true;//標記黑棋子先走
java.util.List<Pieces& psList = new ArrayList<Pieces&();//創(chuàng)建List對象,存放Pieces內(nèi)容
private int pcesX = 0;//當前X棋子的位置
private int pcesY = 0;//當前Y棋子的位置
private boolean isNow = false;
//覆寫方法,自定義控件
public void paint(Graphics g){
super.paint(g);
this.addMouseListener(this);//添加當前,注冊自己
/**
* 繪制棋盤線,繪制棋子
* 十行十列,Y軸變換,X軸不變
*/
for(int i=-1;i<10;i++){
g.drawLine(0, (i*50+50), 500, (i*50+50));//x軸
g.drawLine((i*50+50),0,(i*50+50),500);//y軸
}
/**
* 繪制棋子
* 遍歷集合棋子
*/
for(Pieces p : psList){
g.setColor(p.getColor());//取得棋子顏色,黑色
g.fillOval(p.getX(), p.getY(), Pieces.PIECES_SIZE,Pieces.PIECES_SIZE);//設(shè)置黑棋子的x,y軸,棋子大小
}
iswin();//調(diào)用方
if(isNow == true){
//g.setFont(new Font("微軟雅黑",Font.ITALIC,24));
g.setColor(Color.WHITE);
g.setFont(new java.awt.Font("Dialog",1, 60));//設(shè)置字體樣式
g.drawString("旗開得勝!", 110, 270);
}
}
/**
* 判斷輸贏
* 東,西,南,北
* 東北,東南,西南,西北
*/
public void iswin(){
/**
* --北方向
*/
int nanbei = 0;
for(int nowY = pcesY-50,i=0;i<5 && nowY&=0;nowY-=50,i++){
Pieces pieces = findPieces(pcesX,nowY);
//System.out.println(pieces);
//不等于空,就有棋子
if(pieces!= null){
//當前棋子等于黑,判斷顏色是否相相等
if(isblack != true){
if(pieces.getColor() == Color.BLACK){
nanbei++;
}else{
break;
}
}
//當前等于白棋,判斷顏色是否相等
if(isblack != false){
if(pieces.getColor() == Color.WHITE){
nanbei++;
}else{
break;
}
}
}else{
break;
}
}if(isblack != true){
System.out.println("北方向黑棋子個數(shù)"+nanbei);
}else{
System.out.println("北方向白棋子個數(shù)"+nanbei);
}
if(nanbei&=5){
isNow = true;
if(isblack != true){
System.out.println("黑棋贏了");
}else{
System.out.println("白棋贏了");
}
}
/**
* --南方向
*/
for(int nowY = pcesY,i=0;i<5 && nowY<=500;nowY+=50,i++){
Pieces pieces = findPieces(pcesX,nowY);
//System.out.println(pieces);
//不等于空,就有棋子
if(pieces!= null){
//當前棋子等于黑,判斷顏色是否相相等
if(isblack != true){
if(pieces.getColor() == Color.BLACK){
nanbei++;
}else{
break;
}
}
//當前等于白棋,判斷顏色是否相等
if(isblack != false){
if(pieces.getColor() == Color.WHITE){
nanbei++;
}else{
break;
}
}
}else{
break;
}
}if(isblack != true){
System.out.println("南方向黑棋子個數(shù)"+nanbei);
}else{
System.out.println("南方向白棋子個數(shù)"+nanbei);
}
if(nanbei&=5){
isNow = true;
if(isblack != true){
System.out.println("黑棋贏了");
}else{
System.out.println("白棋贏了");
}
}
/*
*--東方向
*
*/
int dongxi = 0;
for(int nowX = pcesX,i=0;i<5 && nowX<=500;nowX+=50,i++){
Pieces pieces = findPieces(nowX,pcesY);
//System.out.println(pieces);
//不等于空,就有棋子
if(pieces!= null){
//當前棋子等于黑,判斷顏色是否相相等
if(isblack != true){
if(pieces.getColor() == Color.BLACK){
dongxi++;
}else{
break;
}
}
//當前等于白棋,判斷顏色是否相等
if(isblack != false){
if(pieces.getColor() == Color.WHITE){
dongxi++;
}else{
break;
}
}
}else{
break;
}
}
if(isblack != true){
System.out.println("東方向黑棋子個數(shù)"+dongxi);
}else{
System.out.println("東方向白棋子個數(shù)"+dongxi);
}
/**
* --西方向
*/
for(int nowX = pcesX-50,i=0;i<5 && nowX&=0;nowX-=50,i++){
Pieces pieces = findPieces(nowX,pcesY);
//不等于空,就有棋子
if(pieces!=null){
//當前棋子等于黑,判斷顏色是否相相等
if(isblack != true){
if(pieces.getColor() == Color.BLACK){
dongxi++;
}else{
break;
}
}
//當前等于白棋,判斷顏色是否相等
if(isblack != false){
if(pieces.getColor() == Color.WHITE){
dongxi++;
}else{
break;
}
}
}else{
break;
}
}
if(isblack != true){
System.out.println("西方向黑棋子個數(shù)"+dongxi);
}else{
System.out.println("西方向白棋子個數(shù)"+dongxi);
}
if(dongxi&=5){
isNow = true;
if(isblack != true){
System.out.println("黑棋贏了");
}else{
System.out.println("白棋贏了");
}
}
/**
* -*-東北方向
*/
int dongbeixinan= 0;
for(int nowX = pcesX,nowY = pcesY,i=0;nowY &=0 && nowX<=500 && i< 5;nowX+=50,nowY-=50,i++){
Pieces pieces = findPieces(nowX,nowY);
//不等于空,就有棋子
if(pieces!=null){
//當前棋子等于黑,判斷顏色是否相相等
if(isblack != true){
if(pieces.getColor() == Color.BLACK){
dongbeixinan++;
}else{
break;
}
}
//當前等于白棋,判斷顏色是否相等
if(isblack != false){
if(pieces.getColor() == Color.WHITE){
dongbeixinan++;
}else{
break;
}
}
}else{
break;
}
}
if(isblack != true){
System.out.println("東北方向黑棋子個數(shù)"+dongbeixinan);
}else{
System.out.println("東北方向白棋子個數(shù)"+dongbeixinan);
}
if(dongbeixinan&=5){
isNow = true;
if(isblack != true){
System.out.println("黑棋贏了");
}else{
System.out.println("白棋贏了");
}
}
/**
* --西南方向
*/
for(int nowX = pcesX-50,nowY = pcesY+50,i=0;nowY <=500 && nowX&=0 && i< 5;nowX-=50,nowY+=50,i++){
Pieces pieces = findPieces(nowX,nowY);
//不等于空,就有棋子
if(pieces!=null){
//當前棋子等于黑,判斷顏色是否相相等
if(isblack != true){
if(pieces.getColor() == Color.BLACK){
dongbeixinan++;
}else{
break;
}
}
//當前等于白棋,判斷顏色是否相等
if(isblack != false){
if(pieces.getColor() == Color.WHITE){
dongbeixinan++;
}else{
break;
}
}
}else{
break;
}
}if(isblack != true){
System.out.println("西南方向黑棋子個數(shù)"+dongbeixinan);
}else{
System.out.println("西南方向白棋子個數(shù)"+dongbeixinan);
}
if(dongbeixinan&=5){
isNow = true;
if(isblack != true){
System.out.println("黑棋贏了");
}else{
System.out.println("白棋贏了");
}
}
/**
* --東南方向
*/
int dongnan = 0;
for(int nowX = pcesX,nowY = pcesY,i=0;nowY <=500 && nowX<=500 && i< 5;nowX+=50,nowY+=50,i++){
Pieces pieces = findPieces(nowX,nowY);
//不等于空,就有棋子
if(pieces!=null){
//當前棋子等于黑,判斷顏色是否相相等
if(isblack != true){
if(pieces.getColor() == Color.BLACK){
dongnan++;
}else{
break;
}
}
//當前等于白棋,判斷顏色是否相等
if(isblack != false){
if(pieces.getColor() == Color.WHITE){
dongnan++;
}else{
break;
}
}
}else{
break;
}
}if(isblack != true){
System.out.println("東南方向黑棋子個數(shù)"+dongnan);
}else{
System.out.println("東南方向白棋子個數(shù)"+dongnan);
}
/**
* --西北方向
*/
for(int nowX = pcesX-50,nowY = pcesY-50,i=0;nowY &=0 && nowX&=0 && i< 5;nowX-=50,nowY-=50,i++){
Pieces pieces = findPieces(nowX,nowY);
//不等于空,就有棋子
if(pieces!=null){
//當前棋子等于黑,判斷顏色是否相相等
if(isblack != true){
if(pieces.getColor() == Color.BLACK){
dongnan++;
}else{
break;
}
}
//當前等于白棋,判斷顏色是否相等
if(isblack != false){
if(pieces.getColor() == Color.WHITE){
dongnan++;
}else{
break;
}
}
}else{
break;
}
}
if(isblack != true){
System.out.println("西北方向黑棋子個數(shù)"+dongnan);
}else{
System.out.println("西北方向白棋子個數(shù)"+dongnan);
}
if(dongnan&=5){
isNow = true;
if(isblack != true){
System.out.println("黑棋贏了");
}else{
System.out.println("白棋贏了");
}
}
}
/**
* 找點
*/
public Pieces findPieces(int x,int y){
for(Pieces p:psList){
if(p.getX() == x && p.getY() == y){
return p;//判斷坐標是否相同
}
}
return null;
}
@Override
public void mouseClicked(MouseEvent e) {
int x = e.getX()-Pieces.PIECES_SIZE/2;//取得x軸坐標
int y = e.getY()-Pieces.PIECES_SIZE/2;//取得y軸坐標
//算出在哪一條線
double xianX = Math.round(x/50.0);
double xianY = Math.round(y/50.0);
//System.out.println("第幾根線"+xianY+"---"+Math.round(xianY));
x = ((int)xianX)*50-20;
y = ((int)xianY)*50-20;
pcesX = x;//記錄棋子X當前位置
pcesY = y;//記錄棋子Y當前位置
boolean isHa = false;
//去重復(fù)棋子
for(Pieces p:psList){
if(p.getX() == x && p.getY() == y){
isHa = true;
}
}
//避免重復(fù)棋子
if(!isHa){
Pieces ps = new Pieces(x,y); //創(chuàng)建棋子對象,并傳x,y值
/**
* 找點
*/
if(isblack == true){
//黑棋子
ps.setColor(Color.BLACK);//設(shè)置棋子顏色為黑色
isblack = false;
}else{
//白棋子
ps.setColor(Color.WHITE);//設(shè)置棋子顏色為白色
isblack = true;
}
if(isNow==false){
psList.add(ps);//把棋子保存到數(shù)組里
}
this.repaint();//讓其重新調(diào)用,用戶觸發(fā),重新繪制
}
//System.out.println("目前棋子數(shù)為:"+psList.size());
//System.out.println("你點擊了,X軸為:"+e.getX()+",Y軸為:"+e.getY());
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
/**
* 繪制棋子類
* @author JEEP-711
*
*/
class Pieces{
private int x;//x軸點坐標屬性
private int y;//y軸點坐標屬性
private Color color;//棋子顏色屬性
public static final int PIECES_SIZE = 40;//棋子尺寸
//取得X軸get方法
public int getX() {
return x;
}//設(shè)置x軸set方法
public void setX(int x) {
this.x = x;
}//取得y軸方法
public int getY() {
return y;
}//設(shè)置y軸方法
public void setY(int y) {
this.y = y;
}//取得棋子顏色方法
public Color getColor() {
return color;
}//設(shè)置棋子顏色方法
public void setColor(Color color) {
this.color = color;
}
//構(gòu)造器
public Pieces(int x, int y, Color color) {
super();
this.x = x;
this.y = y;
this.color = color;
}
public Pieces(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "Pieces [x=" + x + ", y=" + y + ", color=" + color + "]";
}
}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: