java Swing基础教程之图形化实例代码
java Swing基础教程之图形化实例代码
与多线程、泛型等不同,Swing主要在于使用。
下面主要放代码和注释,少说话。
(一)基本框架
packageSwing;
importjava.awt.*;
importjavax.swing.*;
/**
*
*@authorQuinnNorris
*基本框架
*/
publicclassFrameTest{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
//开启一个线程,所有的Swing组件必须由事件分派线程进行配置,线程将鼠标点击和按键控制转移到用户接口组件。
EventQueue.invokeLater(newRunnable(){
//匿名内部类,是一个Runnable接口的实例,实现了run方法
publicvoidrun(){
SimpleFrameframe=newSimpleFrame();
//创建下面自己定义的SimpleFrame类对象,以便于调用构造器方法
frame.setExtendedState(Frame.MAXIMIZED_BOTH);
//将窗口最大化
//其他可选属性:Frame.NORMALICONIFIEDMAXIMIZED_HORIZMAXIMIZED_VERT
//MAXIMIZED_BOTH
frame.setTitle("Christmas");
//设置窗口标题
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//选择当用户关闭框架时进行的操作,在有些时候需要将窗口隐藏,不能直接退出需要用到这个方法
frame.setVisible(true);
//将窗口可见化,这样以便用户在第一次看见窗口之前我们能够向其中添加内容
}
});
}
//main结束时,程序并没有结束,而是结束了主线程,知道所有框架关闭或者调用了System.exit事才终止程序
}
classSimpleFrameextendsJFrame{
publicSimpleFrame(){
Toolkitkit=Toolkit.getDefaultToolkit();
//修改窗口在屏幕上面的位置,改变窗口大小
//Toolkit类包含很多与本地窗口交互的方法
DimensionscreenSize=kit.getScreenSize();
//Toolkit的获取频幕大小的方法返回一个Dimension的类对象
setSize((int)(screenSize.getWidth()),(int)(screenSize.getHeight()));
//setBounds(0,0,(int)(screenSize.getWidth()),(int)(screenSize.getHeight()));
//定义窗口的位置和大小
//setLocation(0,0);定位窗口距离左上角的位置
//setLocationByPlatform(true);让窗口系统控制窗口位置,距离上一个窗口很小的偏移量
//用图片来替换窗口图标
Imageimg=newImageIcon("D:/icon.png").getImage();
setIconImage(img);
}
}
输出结果:一个充满整个屏幕的框体,标题栏名字叫做Christmas,图表是自己填充的图片。
(二)输出文字
packageSwing;
importjava.awt.*;
importjavax.swing.*;
/**
*
*@authorQuinnNorris
*输出文字
*/
publicclassHelloWorld{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
//开启一个线程,所有的Swing组件必须由事件分派线程进行配置,线程将鼠标点击和按键控制转移到用户接口组件
EventQueue.invokeLater(newRunnable(){
//匿名内部类,是一个Runnable接口的实例,实现了run方法
publicvoidrun(){
JFrameframe=newHelloWorldFrame();
//HelloworldFrame在下面定义,继承了JFrame,使用其中的构造器方法
frame.setTitle("HelloWrold");
//设置标题
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//选择当用户关闭框架时进行的操作,在有些时候需要将窗口隐藏,不能直接退出需要用到这个方法
frame.setVisible(true);
//将窗口可见化,这样以便用户在第一次看见窗口之前我们能够向其中添加内容
}
});
}
}
//编写继承了JFrame的类,我们的工作在这里进行
classHelloWorldFrameextendsJFrame{
publicHelloWorldFrame(){
add(newHelloWorldComponent());
//向其中添加一个实例化的实现JComponent类的子类
pack();
//调用框架组件的首选大小,或者我们可以用SetSize方法来替换它
}
}
classHelloWorldComponentextendsJComponent{
publicstaticfinalintMESSAGE_X=75;
publicstaticfinalintMESSAGE_Y=100;
privatestaticfinalintDEFAULT_WIDTH=300;
privatestaticfinalintDEFAULT_HEIGHT=200;
/**
*我们覆盖了这个以用来书写内容
*
*@paramg
*Graphics对象保存着用于绘制图像和文本的设置
*/
publicvoidpaintComponent(Graphicsg){
g.drawString("HelloWorld!",MESSAGE_X,MESSAGE_Y);
//参数:书写内容,字符串中第一个字符位于从左向右75像素,字符串中第一个字符从上向下100像素
}
/**
*我们覆盖了这个方法来表示出这个类的组件的大小
*
*@return返回这个类的组件本身应该有多大
*/
publicDimensiongetPreferredSize(){
returnnewDimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
//返回一个Dimension对象,表示这个组件的大小
}
}
输出结果:位于左上角的名字叫做HelloWrold的小窗口,在窗口中部有“HelloWorld!”字样。
(三)打印图形
packageSwing;
importjava.awt.EventQueue;
importjavax.swing.*;
importjava.awt.*;
importjava.awt.geom.*;
/**
*
*@authorQuinnNorris
*打印图形
*/
publicclassDrawTest{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
//开启一个线程,所有的Swing组件必须由事件分派线程进行配置,线程将鼠标点击和按键控制转移到用户接口组件。
EventQueue.invokeLater(newRunnable()
{
//匿名内部类,是一个Runnable接口的实例,实现了run方法
publicvoidrun(){
JFrameframe=newDrawFrame();
//创建下面自己定义的SimpleFrame类对象,以便于调用构造器方法
frame.setTitle("DrawTest");
//设置标题
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//选择当用户关闭框架的时候进行的操作,在有些时候需要将窗口隐藏,不能直接退出需要用到这个方法
frame.setVisible(true);
//将窗口可见化,这样以便用户在第一次看见窗口之前我们能够向其中添加内容
}
});
}
}
classDrawFrameextendsJFrame
{
publicDrawFrame(){
add(newDrawComponent());
//向其中添加一个实例化的实现JComponent类的子类
pack();
//调用框架组件的首选大小,或者我们可以用SetSize方法来替换它
}
}
classDrawComponentextendsJComponent
{
privatestaticfinalintDEFAULT_WIDTH=400;
privatestaticfinalintDEFAULT_HEIGHT=400;
/**
*我们覆盖了这个以用来打印图形
*
*@paramg
*Graphics对象是我们需要用的Graphics2D的父类
*/
publicvoidpaintComponent(Graphicsg){
Graphics2Dg2=(Graphics2D)g;
//实例化Graphics2D这个类的对象,他是参数Graphics2D的一个子类
doubleleftX=100;
doubletopY=100;
doublewidth=200;
doubleheight=150;
//我们设置矩形的四个属性
Rectangle2Drect=newRectangle2D.Double(leftX,topY,width,height);
//创建一个Rectangle2D的对象,这个对象继承了Sharp接口
//Double是其中的一个静态内部类,当我们初始化时需要在Double中设置参数
g2.draw(rect);
//传入一个实现Sharp接口的实例,并在画布上画出
Ellipse2Dellipse=newEllipse2D.Double();
//创建一个椭圆的实例
ellipse.setFrame(rect);
//椭圆和矩形类是兄弟关系,因为他们有着相同的边界判断方式
//这里我们直接用rect来对椭圆形进行描述(通过椭圆的外接矩形)
g2.draw(ellipse);
//传入一个实现Sharp接口的实例,并在画布上画出
g2.draw(newLine2D.Double(leftX,topY,leftX+width,topY+height));
//在画布上画出一条直线
doublecenterX=rect.getCenterX();
doublecenterY=rect.getCenterY();
doubleradius=150;
//定义圆心坐标和半径
Ellipse2Dcircle=newEllipse2D.Double();
//创建一个圆的实例
circle.setFrameFromCenter(centerX,centerY,centerX+radius,centerY+radius);
//设置坐标和半径
g2.draw(circle);
//在画布上画出一个圆
}
/**
*我们覆盖了这个方法来表示出这个类的组件的大小
*
*@return返回这个类的组件本身应该有多大
*/
publicDimensiongetPreferredSize(){
returnnewDimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
//返回一个Dimension对象,表示这个组件的大小
}
}
输出结果:左上角的窗口中有一个椭圆,外面有一个外界矩形,有一条从矩形左上角到右下角的直线,以这个矩形中心为原点有一个半径为150像素的圆。
(四)图形上色
Rectangle2Drect=newRectangle2D.Double(leftX,topY,width,height); //创建一个Rectangle2D的对象,这个对象继承了Sharp接口 //Double是其中的一个静态内部类,当我们初始化时需要在Double中设置参数 g2.setColor(Color.BLUE); //为g2对象设置一种填充颜色,会影响线条颜色 g2.fill(rect); //将我们选择的颜色填充到rect表示的封闭图形中 g2.draw(rect); //传入一个实现Sharp接口的实例,并在画布上画出
在上一个代码其他部分不改变的情况下,插入这样两行代码(在1,4行代码的原位置中间插入2,3行代码)。得到上色效果。
输出结果:中间为蓝色矩形,以矩形中心为原点,150像素为半径有个蓝色线条的圆形。
(五)特殊字体
packageSwing;
importjavax.swing.*;
importjava.awt.*;
importjava.awt.font.*;
importjava.awt.geom.*;
/**
*
*@authorQuinnNorris特殊字体
*/
publicclassFontTest{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
//开启一个线程,所有的Swing组件必须由事件分派线程进行配置,线程将鼠标点击和按键控制转移到用户接口组件。
EventQueue.invokeLater(newRunnable(){
//匿名内部类,是一个Runnable接口的实例,实现了run方法
publicvoidrun(){
JFrameframe=newFontFrame();
//创建下面自己定义的SimpleFrame类对象,以便于调用构造器方法
frame.setTitle("FontTest");
//设置标题
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//选择当用户关闭框架的时候进行的操作,在有些时候需要将窗口隐藏,不能直接退出需要用到这个方法
frame.setVisible(true);
//将窗口可见化,这样以便用户在第一次看见窗口之前我们能够向其中添加内容
}
});
}
}
classFontFrameextendsJFrame{
publicFontFrame(){
add(newFontComponent());
//向其中添加一个实例化的实现JComponent类的子类
pack();
//调用框架组件的首选大小,或者我们可以用SetSize方法来替换它
}
}
classFontComponentextendsJComponent{
privatestaticfinalintDEFAULT_WIDTH=300;
privatestaticfinalintDEFAULT_HEIGHT=200;
/**
*我们覆盖了这个以用来做一些工作
*
*@paramg
*Graphics对象是我们需要用的Graphics2D的父类
*/
publicvoidpaintComponent(Graphicsg){
Graphics2Dg2=(Graphics2D)g;
//实例化Graphics2D这个类的对象,他是参数Graphics2D的一个子类
Stringmessage="HelloWorld!";
//写出我们要操作的文字
Fontf=newFont("Dialog",Font.BOLD,36);
//创建一个字体类型,参数包括字体族,风格类型,大小
//也可以通过特殊的方法,调用加载得到本地的字体包
g2.setFont(f);
//将f设置在g2之中
FontRenderContextcontext=g2.getFontRenderContext();
//通过调用方法,得到屏幕设备字体属性的描述对象
Rectangle2Dbounds=f.getStringBounds(message,context);
//getStringBounds方法返回一个包围着字符串的矩形
doublex=(DEFAULT_WIDTH-bounds.getWidth())/2;
//bounds.getWidth方法可以获得字符串的宽度
doubley=(DEFAULT_HEIGHT-bounds.getHeight())/2;
//bounds.getHeight方法可以获得字符串的高度
doubleascent=-bounds.getY();
//获得字体的上坡度
doublebaseY=y+ascent;
//文字的基线位置
g2.drawString(message,(int)x,(int)y);
//设置字符串位置
g2.setPaint(Color.LIGHT_GRAY);
//设置线条颜色为亮灰色
g2.draw(newLine2D.Double(x,baseY,x+bounds.getWidth(),baseY));
//在文字的基线上画下一条横线
Rectangle2Drect=newRectangle2D.Double(x,y,bounds.getWidth(),
bounds.getHeight());
g2.draw(rect);
}
/**
*我们覆盖了这个方法来表示出这个类的组件的大小
*
*@return返回这个类的组件本身应该有多大
*/
publicDimensiongetPreferredSize(){
returnnewDimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
//返回一个Dimension对象,表示这个组件的大小
}
}
输出结果:窗口正中间有文字“HelloWorld”,外围被一个灰色矩形包括,在基线的地方有一条横线分割。
(六)添加图片
packageSwing;
importjavax.swing.*;
importjava.awt.*;
/**
*
*@authorQuinnNorris添加图片
*/
publicclassImageTest{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
//开启一个线程,所有的Swing组件必须由事件分派线程进行配置,线程将鼠标点击和按键控制转移到用户接口组件。
EventQueue.invokeLater(newRunnable(){
//匿名内部类,是一个Runnable接口的实例,实现了run方法
publicvoidrun(){
JFrameframe=newImageFrame();
//创建下面自己定义的SimpleFrame类对象,以便于调用构造器方法
frame.setTitle("ImageTest");
//设置标题
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//选择当用户关闭框架的时候进行的操作,在有些时候需要将窗口隐藏,不能直接退出需要用到这个方法
frame.setVisible(true);
//将窗口可见化,这样以便用户在第一次看见窗口之前我们能够向其中添加内容
}
});
}
}
classImageFrameextendsJFrame{
publicImageFrame(){
add(newImageComponent());
//向其中添加一个实例化的实现JComponent类的子类
pack();
//调用框架组件的首选大小,或者我们可以用SetSize方法来替换它
}
}
classImageComponentextendsJComponent{
privatestaticfinalintDEFAULT_WIDTH=300;
privatestaticfinalintDEFAULT_HEIGHT=200;
privateImageimage;
/**
*ImageComponent的构造函数,用来实例化图片
*/
publicImageComponent(){
image=newImageIcon("D:/image.jpg").getImage();
//通过路径得到图片
}
/**
*我们覆盖了这个以用来做一些工作
*
*@paramg
*
*/
publicvoidpaintComponent(Graphicsg){
if(image==null)return;
//如果图片不正确,则直接返回避免发生错误
g.drawImage(image,0,0,null);
//在画布上给出图片
}
/**
*我们覆盖了这个方法来表示出这个类的组件的大小
*
*@return返回这个类的组件本身应该有多大
*/
publicDimensiongetPreferredSize(){
returnnewDimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
//返回一个Dimension对象,表示这个组件的大小
}
}
输出结果:在画布以左上角为开始放置你添加的图片。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!