java Swing基礎(chǔ)教程之圖形化實(shí)例代碼
java Swing基礎(chǔ)教程之圖形化實(shí)例代碼
與多線(xiàn)程、泛型等不同,Swing主要在于使用。
下面主要放代碼和注釋?zhuān)僬f(shuō)話(huà)。
(一)基本框架
package Swing;
import java.awt.*;
import javax.swing.*;
/**
*
* @author QuinnNorris
* 基本框架
*/
public class FrameTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 開(kāi)啟一個(gè)線(xiàn)程,所有的Swing組件必須由事件分派線(xiàn)程進(jìn)行配置,線(xiàn)程將鼠標(biāo)點(diǎn)擊和按鍵控制轉(zhuǎn)移到用戶(hù)接口組件。
EventQueue.invokeLater(new Runnable() {
// 匿名內(nèi)部類(lèi),是一個(gè)Runnable接口的實(shí)例,實(shí)現(xiàn)了run方法
public void run() {
SimpleFrame frame = new SimpleFrame();
// 創(chuàng)建下面自己定義的SimpleFrame類(lèi)對(duì)象,以便于調(diào)用構(gòu)造器方法
frame.setExtendedState(Frame.MAXIMIZED_BOTH);
// 將窗口最大化
// 其他可選屬性:Frame.NORMAL ICONIFIED MAXIMIZED_HORIZ MAXIMIZED_VERT
// MAXIMIZED_BOTH
frame.setTitle("Christmas");
// 設(shè)置窗口標(biāo)題
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 選擇當(dāng)用戶(hù)關(guān)閉框架時(shí)進(jìn)行的操作 ,在有些時(shí)候需要將窗口隱藏,不能直接退出需要用到這個(gè)方法
frame.setVisible(true);
// 將窗口可見(jiàn)化,這樣以便用戶(hù)在第一次看見(jiàn)窗口之前我們能夠向其中添加內(nèi)容
}
});
}
// main結(jié)束時(shí),程序并沒(méi)有結(jié)束,而是結(jié)束了主線(xiàn)程,知道所有框架關(guān)閉或者調(diào)用了 System.exit事才終止程序
}
class SimpleFrame extends JFrame {
public SimpleFrame() {
Toolkit kit = Toolkit.getDefaultToolkit();
// 修改窗口在屏幕上面的位置,改變窗口大小
// Toolkit類(lèi)包含很多與本地窗口交互的方法
Dimension screenSize = kit.getScreenSize();
// Toolkit的獲取頻幕大小的方法返回一個(gè)Dimension的類(lèi)對(duì)象
setSize((int) (screenSize.getWidth()), (int) (screenSize.getHeight()));
// setBounds(0,0,(int)(screenSize.getWidth()),(int)(screenSize.getHeight()));
// 定義窗口的位置和大小
// setLocation(0,0); 定位窗口距離左上角的位置
// setLocationByPlatform(true); 讓窗口系統(tǒng)控制窗口位置,距離上一個(gè)窗口很小的偏移量
// 用圖片來(lái)替換窗口圖標(biāo)
Image img = new ImageIcon("D:/icon.png").getImage();
setIconImage(img);
}
}
輸出結(jié)果:一個(gè)充滿(mǎn)整個(gè)屏幕的框體,標(biāo)題欄名字叫做Christmas,圖表是自己填充的圖片。
(二)輸出文字
package Swing;
import java.awt.*;
import javax.swing.*;
/**
*
* @author QuinnNorris
* 輸出文字
*/
public class HelloWorld {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 開(kāi)啟一個(gè)線(xiàn)程,所有的Swing組件必須由事件分派線(xiàn)程進(jìn)行配置,線(xiàn)程將鼠標(biāo)點(diǎn)擊和按鍵控制轉(zhuǎn)移到用戶(hù)接口組件
EventQueue.invokeLater(new Runnable() {
// 匿名內(nèi)部類(lèi),是一個(gè)Runnable接口的實(shí)例,實(shí)現(xiàn)了run方法
public void run() {
JFrame frame = new HelloWorldFrame();
// HelloworldFrame在下面定義,繼承了JFrame,使用其中的構(gòu)造器方法
frame.setTitle("HelloWrold");
// 設(shè)置標(biāo)題
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 選擇當(dāng)用戶(hù)關(guān)閉框架時(shí)進(jìn)行的操作 ,在有些時(shí)候需要將窗口隱藏,不能直接退出需要用到這個(gè)方法
frame.setVisible(true);
// 將窗口可見(jiàn)化,這樣以便用戶(hù)在第一次看見(jiàn)窗口之前我們能夠向其中添加內(nèi)容
}
});
}
}
// 編寫(xiě)繼承了JFrame的類(lèi),我們的工作在這里進(jìn)行
class HelloWorldFrame extends JFrame {
public HelloWorldFrame() {
add(new HelloWorldComponent());
//向其中添加一個(gè)實(shí)例化的實(shí)現(xiàn)JComponent類(lèi)的子類(lèi)
pack();
//調(diào)用框架組件的首選大小,或者我們可以用SetSize方法來(lái)替換它
}
}
class HelloWorldComponent extends JComponent {
public static final int MESSAGE_X = 75;
public static final int MESSAGE_Y = 100;
private static final int DEFAULT_WIDTH = 300;
private static final int DEFAULT_HEIGHT = 200;
/**
* 我們覆蓋了這個(gè)以用來(lái)書(shū)寫(xiě)內(nèi)容
*
* @param g
* Graphics對(duì)象保存著用于繪制圖像和文本的設(shè)置
*/
public void paintComponent(Graphics g) {
g.drawString("Hello World!", MESSAGE_X, MESSAGE_Y);
// 參數(shù):書(shū)寫(xiě)內(nèi)容,字符串中第一個(gè)字符位于從左向右75像素,字符串中第一個(gè)字符從上向下100像素
}
/**
* 我們覆蓋了這個(gè)方法來(lái)表示出這個(gè)類(lèi)的組件的大小
*
* @return 返回這個(gè)類(lèi)的組件本身應(yīng)該有多大
*/
public Dimension getPreferredSize() {
return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
// 返回一個(gè)Dimension對(duì)象,表示這個(gè)組件的大小
}
}
輸出結(jié)果:位于左上角的名字叫做HelloWrold的小窗口,在窗口中部有“Hello World!”字樣。
(三)打印圖形
package Swing;
import java.awt.EventQueue;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
/**
*
* @author QuinnNorris
* 打印圖形
*/
public class DrawTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 開(kāi)啟一個(gè)線(xiàn)程,所有的Swing組件必須由事件分派線(xiàn)程進(jìn)行配置,線(xiàn)程將鼠標(biāo)點(diǎn)擊和按鍵控制轉(zhuǎn)移到用戶(hù)接口組件。
EventQueue.invokeLater(new Runnable()
{
// 匿名內(nèi)部類(lèi),是一個(gè)Runnable接口的實(shí)例,實(shí)現(xiàn)了run方法
public void run(){
JFrame frame = new DrawFrame();
// 創(chuàng)建下面自己定義的SimpleFrame類(lèi)對(duì)象,以便于調(diào)用構(gòu)造器方法
frame.setTitle("DrawTest");
// 設(shè)置標(biāo)題
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 選擇當(dāng)用戶(hù)關(guān)閉框架的時(shí)候進(jìn)行的操作 ,在有些時(shí)候需要將窗口隱藏,不能直接退出需要用到這個(gè)方法
frame.setVisible(true);
// 將窗口可見(jiàn)化,這樣以便用戶(hù)在第一次看見(jiàn)窗口之前我們能夠向其中添加內(nèi)容
}
});
}
}
class DrawFrame extends JFrame
{
public DrawFrame(){
add(new DrawComponent());
//向其中添加一個(gè)實(shí)例化的實(shí)現(xiàn)JComponent類(lèi)的子類(lèi)
pack();
//調(diào)用框架組件的首選大小,或者我們可以用SetSize方法來(lái)替換它
}
}
class DrawComponent extends JComponent
{
private static final int DEFAULT_WIDTH = 400;
private static final int DEFAULT_HEIGHT = 400;
/**
* 我們覆蓋了這個(gè)以用來(lái)打印圖形
*
* @param g
* Graphics對(duì)象是我們需要用的Graphics2D的父類(lèi)
*/
public void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D)g;
//實(shí)例化Graphics2D這個(gè)類(lèi)的對(duì)象,他是參數(shù)Graphics2D的一個(gè)子類(lèi)
double leftX = 100;
double topY = 100;
double width = 200;
double height = 150;
//我們?cè)O(shè)置矩形的四個(gè)屬性
Rectangle2D rect = new Rectangle2D.Double(leftX,topY,width,height);
//創(chuàng)建一個(gè)Rectangle2D的對(duì)象,這個(gè)對(duì)象繼承了Sharp接口
//Double是其中的一個(gè)靜態(tài)內(nèi)部類(lèi),當(dāng)我們初始化時(shí)需要在Double中設(shè)置參數(shù)
g2.draw(rect);
//傳入一個(gè)實(shí)現(xiàn)Sharp接口的實(shí)例,并在畫(huà)布上畫(huà)出
Ellipse2D ellipse = new Ellipse2D.Double();
//創(chuàng)建一個(gè)橢圓的實(shí)例
ellipse.setFrame(rect);
//橢圓和矩形類(lèi)是兄弟關(guān)系,因?yàn)樗麄冇兄嗤倪吔缗袛喾绞?
//這里我們直接用rect來(lái)對(duì)橢圓形進(jìn)行描述(通過(guò)橢圓的外接矩形)
g2.draw(ellipse);
//傳入一個(gè)實(shí)現(xiàn)Sharp接口的實(shí)例,并在畫(huà)布上畫(huà)出
g2.draw(new Line2D.Double(leftX,topY,leftX+width,topY+height));
//在畫(huà)布上畫(huà)出一條直線(xiàn)
double centerX = rect.getCenterX();
double centerY = rect.getCenterY();
double radius = 150;
//定義圓心坐標(biāo)和半徑
Ellipse2D circle = new Ellipse2D.Double();
//創(chuàng)建一個(gè)圓的實(shí)例
circle.setFrameFromCenter(centerX, centerY, centerX+radius, centerY+radius);
//設(shè)置坐標(biāo)和半徑
g2.draw(circle);
//在畫(huà)布上畫(huà)出一個(gè)圓
}
/**
* 我們覆蓋了這個(gè)方法來(lái)表示出這個(gè)類(lèi)的組件的大小
*
* @return 返回這個(gè)類(lèi)的組件本身應(yīng)該有多大
*/
public Dimension getPreferredSize(){
return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
// 返回一個(gè)Dimension對(duì)象,表示這個(gè)組件的大小
}
}
輸出結(jié)果:左上角的窗口中有一個(gè)橢圓,外面有一個(gè)外界矩形,有一條從矩形左上角到右下角的直線(xiàn),以這個(gè)矩形中心為原點(diǎn)有一個(gè)半徑為150像素的圓。
(四)圖形上色
Rectangle2D rect = new Rectangle2D.Double(leftX,topY,width,height); //創(chuàng)建一個(gè)Rectangle2D的對(duì)象,這個(gè)對(duì)象繼承了Sharp接口 //Double是其中的一個(gè)靜態(tài)內(nèi)部類(lèi),當(dāng)我們初始化時(shí)需要在Double中設(shè)置參數(shù) g2.setColor(Color.BLUE); //為g2對(duì)象設(shè)置一種填充顏色,會(huì)影響線(xiàn)條顏色 g2.fill(rect); //將我們選擇的顏色填充到rect表示的封閉圖形中 g2.draw(rect); //傳入一個(gè)實(shí)現(xiàn)Sharp接口的實(shí)例,并在畫(huà)布上畫(huà)出
在上一個(gè)代碼其他部分不改變的情況下,插入這樣兩行代碼(在1,4行代碼的原位置中間插入2,3行代碼)。得到上色效果。
輸出結(jié)果:中間為藍(lán)色矩形,以矩形中心為原點(diǎn),150像素為半徑有個(gè)藍(lán)色線(xiàn)條的圓形。
(五)特殊字體
package Swing;
import javax.swing.*;
import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
/**
*
* @author QuinnNorris 特殊字體
*/
public class FontTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 開(kāi)啟一個(gè)線(xiàn)程,所有的Swing組件必須由事件分派線(xiàn)程進(jìn)行配置,線(xiàn)程將鼠標(biāo)點(diǎn)擊和按鍵控制轉(zhuǎn)移到用戶(hù)接口組件。
EventQueue.invokeLater(new Runnable() {
// 匿名內(nèi)部類(lèi),是一個(gè)Runnable接口的實(shí)例,實(shí)現(xiàn)了run方法
public void run() {
JFrame frame = new FontFrame();
// 創(chuàng)建下面自己定義的SimpleFrame類(lèi)對(duì)象,以便于調(diào)用構(gòu)造器方法
frame.setTitle("FontTest");
// 設(shè)置標(biāo)題
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 選擇當(dāng)用戶(hù)關(guān)閉框架的時(shí)候進(jìn)行的操作 ,在有些時(shí)候需要將窗口隱藏,不能直接退出需要用到這個(gè)方法
frame.setVisible(true);
// 將窗口可見(jiàn)化,這樣以便用戶(hù)在第一次看見(jiàn)窗口之前我們能夠向其中添加內(nèi)容
}
});
}
}
class FontFrame extends JFrame {
public FontFrame() {
add(new FontComponent());
// 向其中添加一個(gè)實(shí)例化的實(shí)現(xiàn)JComponent類(lèi)的子類(lèi)
pack();
// 調(diào)用框架組件的首選大小,或者我們可以用SetSize方法來(lái)替換它
}
}
class FontComponent extends JComponent {
private static final int DEFAULT_WIDTH = 300;
private static final int DEFAULT_HEIGHT = 200;
/**
* 我們覆蓋了這個(gè)以用來(lái)做一些工作
*
* @param g
* Graphics對(duì)象是我們需要用的Graphics2D的父類(lèi)
*/
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
// 實(shí)例化Graphics2D這個(gè)類(lèi)的對(duì)象,他是參數(shù)Graphics2D的一個(gè)子類(lèi)
String message = "Hello World!";
// 寫(xiě)出我們要操作的文字
Font f = new Font("Dialog", Font.BOLD, 36);
// 創(chuàng)建一個(gè)字體類(lèi)型,參數(shù)包括字體族,風(fēng)格類(lèi)型,大小
// 也可以通過(guò)特殊的方法,調(diào)用加載得到本地的字體包
g2.setFont(f);
// 將f設(shè)置在g2之中
FontRenderContext context = g2.getFontRenderContext();
// 通過(guò)調(diào)用方法,得到屏幕設(shè)備字體屬性的描述對(duì)象
Rectangle2D bounds = f.getStringBounds(message, context);
// getStringBounds方法返回一個(gè)包圍著字符串的矩形
double x = (DEFAULT_WIDTH - bounds.getWidth()) / 2;
// bounds.getWidth方法可以獲得字符串的寬度
double y = (DEFAULT_HEIGHT - bounds.getHeight()) / 2;
// bounds.getHeight方法可以獲得字符串的高度
double ascent = -bounds.getY();
// 獲得字體的上坡度
double baseY = y + ascent;
// 文字的基線(xiàn)位置
g2.drawString(message, (int) x, (int) y);
// 設(shè)置字符串位置
g2.setPaint(Color.LIGHT_GRAY);
// 設(shè)置線(xiàn)條顏色為亮灰色
g2.draw(new Line2D.Double(x, baseY, x + bounds.getWidth(), baseY));
// 在文字的基線(xiàn)上畫(huà)下一條橫線(xiàn)
Rectangle2D rect = new Rectangle2D.Double(x, y, bounds.getWidth(),
bounds.getHeight());
g2.draw(rect);
}
/**
* 我們覆蓋了這個(gè)方法來(lái)表示出這個(gè)類(lèi)的組件的大小
*
* @return 返回這個(gè)類(lèi)的組件本身應(yīng)該有多大
*/
public Dimension getPreferredSize() {
return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
// 返回一個(gè)Dimension對(duì)象,表示這個(gè)組件的大小
}
}
輸出結(jié)果:窗口正中間有文字“Hello World”,外圍被一個(gè)灰色矩形包括,在基線(xiàn)的地方有一條橫線(xiàn)分割。
(六)添加圖片
package Swing;
import javax.swing.*;
import java.awt.*;
/**
*
* @author QuinnNorris 添加圖片
*/
public class ImageTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 開(kāi)啟一個(gè)線(xiàn)程,所有的Swing組件必須由事件分派線(xiàn)程進(jìn)行配置,線(xiàn)程將鼠標(biāo)點(diǎn)擊和按鍵控制轉(zhuǎn)移到用戶(hù)接口組件。
EventQueue.invokeLater(new Runnable() {
// 匿名內(nèi)部類(lèi),是一個(gè)Runnable接口的實(shí)例,實(shí)現(xiàn)了run方法
public void run() {
JFrame frame = new ImageFrame();
// 創(chuàng)建下面自己定義的SimpleFrame類(lèi)對(duì)象,以便于調(diào)用構(gòu)造器方法
frame.setTitle("ImageTest");
// 設(shè)置標(biāo)題
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 選擇當(dāng)用戶(hù)關(guān)閉框架的時(shí)候進(jìn)行的操作 ,在有些時(shí)候需要將窗口隱藏,不能直接退出需要用到這個(gè)方法
frame.setVisible(true);
// 將窗口可見(jiàn)化,這樣以便用戶(hù)在第一次看見(jiàn)窗口之前我們能夠向其中添加內(nèi)容
}
});
}
}
class ImageFrame extends JFrame {
public ImageFrame() {
add(new ImageComponent());
// 向其中添加一個(gè)實(shí)例化的實(shí)現(xiàn)JComponent類(lèi)的子類(lèi)
pack();
// 調(diào)用框架組件的首選大小,或者我們可以用SetSize方法來(lái)替換它
}
}
class ImageComponent extends JComponent {
private static final int DEFAULT_WIDTH = 300;
private static final int DEFAULT_HEIGHT = 200;
private Image image;
/**
* ImageComponent的構(gòu)造函數(shù),用來(lái)實(shí)例化圖片
*/
public ImageComponent(){
image = new ImageIcon("D:/image.jpg").getImage();
//通過(guò)路徑得到圖片
}
/**
* 我們覆蓋了這個(gè)以用來(lái)做一些工作
*
* @param g
*
*/
public void paintComponent(Graphics g) {
if(image == null ) return;
//如果圖片不正確,則直接返回避免發(fā)生錯(cuò)誤
g.drawImage(image, 0,0,null);
//在畫(huà)布上給出圖片
}
/**
* 我們覆蓋了這個(gè)方法來(lái)表示出這個(gè)類(lèi)的組件的大小
*
* @return 返回這個(gè)類(lèi)的組件本身應(yīng)該有多大
*/
public Dimension getPreferredSize() {
return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
// 返回一個(gè)Dimension對(duì)象,表示這個(gè)組件的大小
}
}
輸出結(jié)果:在畫(huà)布以左上角為開(kāi)始放置你添加的圖片。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Spring-boot集成pg、mongo多數(shù)據(jù)源過(guò)程詳解
這篇文章主要介紹了Spring-boot集成pg、mongo多數(shù)據(jù)源過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
Spring使用@Autowired注解實(shí)現(xiàn)自動(dòng)裝配方式
這篇文章主要介紹了Spring使用@Autowired注解實(shí)現(xiàn)自動(dòng)裝配方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Java實(shí)現(xiàn)將數(shù)組的元素用逗號(hào)連接的多種方法
在 Java 開(kāi)發(fā)中,我們經(jīng)常需要將數(shù)組中的元素用逗號(hào)連接成一個(gè)字符串,這種需求在日志記錄、數(shù)據(jù)導(dǎo)出、API 響應(yīng)等場(chǎng)景中非常常見(jiàn),本文將詳細(xì)介紹如何在 Java 中實(shí)現(xiàn)這一功能,并提供多種簡(jiǎn)潔的方法和優(yōu)化建議,需要的朋友可以參考下2025-01-01
解決Eclipse配置Tomcat出現(xiàn)Cannot create a server using the selected
這篇文章主要介紹了解決Eclipse配置Tomcat出現(xiàn)Cannot create a server using the selected type錯(cuò)誤的相關(guān)資料,需要的朋友可以參考下2017-02-02
Spring使用注解實(shí)現(xiàn)Bean的自動(dòng)裝配
大家好,本篇文章主要講的是Spring使用注解實(shí)現(xiàn)Bean的自動(dòng)裝配,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下2022-02-02

