java Swing基础教程之图形化实例代码
程序员文章站
2024-03-06 11:32:01
java swing基础教程之图形化实例代码
与多线程、泛型等不同,swing主要在于使用。
下面主要放代码和注释,少说话。
(一)基本框架...
java swing基础教程之图形化实例代码
与多线程、泛型等不同,swing主要在于使用。
下面主要放代码和注释,少说话。
(一)基本框架
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 // 开启一个线程,所有的swing组件必须由事件分派线程进行配置,线程将鼠标点击和按键控制转移到用户接口组件。 eventqueue.invokelater(new runnable() { // 匿名内部类,是一个runnable接口的实例,实现了run方法 public void run() { simpleframe frame = new simpleframe(); // 创建下面自己定义的simpleframe类对象,以便于调用构造器方法 frame.setextendedstate(frame.maximized_both); // 将窗口最大化 // 其他可选属性:frame.normal iconified maximized_horiz maximized_vert // maximized_both frame.settitle("christmas"); // 设置窗口标题 frame.setdefaultcloseoperation(jframe.exit_on_close); // 选择当用户关闭框架时进行的操作 ,在有些时候需要将窗口隐藏,不能直接退出需要用到这个方法 frame.setvisible(true); // 将窗口可见化,这样以便用户在第一次看见窗口之前我们能够向其中添加内容 } }); } // main结束时,程序并没有结束,而是结束了主线程,知道所有框架关闭或者调用了 system.exit事才终止程序 } class simpleframe extends jframe { public simpleframe() { toolkit kit = toolkit.getdefaulttoolkit(); // 修改窗口在屏幕上面的位置,改变窗口大小 // toolkit类包含很多与本地窗口交互的方法 dimension screensize = 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); 让窗口系统控制窗口位置,距离上一个窗口很小的偏移量 // 用图片来替换窗口图标 image img = new imageicon("d:/icon.png").getimage(); seticonimage(img); } }
输出结果:一个充满整个屏幕的框体,标题栏名字叫做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 // 开启一个线程,所有的swing组件必须由事件分派线程进行配置,线程将鼠标点击和按键控制转移到用户接口组件 eventqueue.invokelater(new runnable() { // 匿名内部类,是一个runnable接口的实例,实现了run方法 public void run() { jframe frame = new helloworldframe(); // helloworldframe在下面定义,继承了jframe,使用其中的构造器方法 frame.settitle("hellowrold"); // 设置标题 frame.setdefaultcloseoperation(jframe.exit_on_close); // 选择当用户关闭框架时进行的操作 ,在有些时候需要将窗口隐藏,不能直接退出需要用到这个方法 frame.setvisible(true); // 将窗口可见化,这样以便用户在第一次看见窗口之前我们能够向其中添加内容 } }); } } // 编写继承了jframe的类,我们的工作在这里进行 class helloworldframe extends jframe { public helloworldframe() { add(new helloworldcomponent()); //向其中添加一个实例化的实现jcomponent类的子类 pack(); //调用框架组件的首选大小,或者我们可以用setsize方法来替换它 } } 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; /** * 我们覆盖了这个以用来书写内容 * * @param g * graphics对象保存着用于绘制图像和文本的设置 */ public void paintcomponent(graphics g) { g.drawstring("hello world!", message_x, message_y); // 参数:书写内容,字符串中第一个字符位于从左向右75像素,字符串中第一个字符从上向下100像素 } /** * 我们覆盖了这个方法来表示出这个类的组件的大小 * * @return 返回这个类的组件本身应该有多大 */ public dimension getpreferredsize() { return new dimension(default_width, default_height); // 返回一个dimension对象,表示这个组件的大小 } }
输出结果:位于左上角的名字叫做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 // 开启一个线程,所有的swing组件必须由事件分派线程进行配置,线程将鼠标点击和按键控制转移到用户接口组件。 eventqueue.invokelater(new runnable() { // 匿名内部类,是一个runnable接口的实例,实现了run方法 public void run(){ jframe frame = new drawframe(); // 创建下面自己定义的simpleframe类对象,以便于调用构造器方法 frame.settitle("drawtest"); // 设置标题 frame.setdefaultcloseoperation(jframe.exit_on_close); // 选择当用户关闭框架的时候进行的操作 ,在有些时候需要将窗口隐藏,不能直接退出需要用到这个方法 frame.setvisible(true); // 将窗口可见化,这样以便用户在第一次看见窗口之前我们能够向其中添加内容 } }); } } class drawframe extends jframe { public drawframe(){ add(new drawcomponent()); //向其中添加一个实例化的实现jcomponent类的子类 pack(); //调用框架组件的首选大小,或者我们可以用setsize方法来替换它 } } class drawcomponent extends jcomponent { private static final int default_width = 400; private static final int default_height = 400; /** * 我们覆盖了这个以用来打印图形 * * @param g * graphics对象是我们需要用的graphics2d的父类 */ public void paintcomponent(graphics g){ graphics2d g2 = (graphics2d)g; //实例化graphics2d这个类的对象,他是参数graphics2d的一个子类 double leftx = 100; double topy = 100; double width = 200; double height = 150; //我们设置矩形的四个属性 rectangle2d rect = new rectangle2d.double(leftx,topy,width,height); //创建一个rectangle2d的对象,这个对象继承了sharp接口 //double是其中的一个静态内部类,当我们初始化时需要在double中设置参数 g2.draw(rect); //传入一个实现sharp接口的实例,并在画布上画出 ellipse2d ellipse = new ellipse2d.double(); //创建一个椭圆的实例 ellipse.setframe(rect); //椭圆和矩形类是兄弟关系,因为他们有着相同的边界判断方式 //这里我们直接用rect来对椭圆形进行描述(通过椭圆的外接矩形) g2.draw(ellipse); //传入一个实现sharp接口的实例,并在画布上画出 g2.draw(new line2d.double(leftx,topy,leftx+width,topy+height)); //在画布上画出一条直线 double centerx = rect.getcenterx(); double centery = rect.getcentery(); double radius = 150; //定义圆心坐标和半径 ellipse2d circle = new ellipse2d.double(); //创建一个圆的实例 circle.setframefromcenter(centerx, centery, centerx+radius, centery+radius); //设置坐标和半径 g2.draw(circle); //在画布上画出一个圆 } /** * 我们覆盖了这个方法来表示出这个类的组件的大小 * * @return 返回这个类的组件本身应该有多大 */ public dimension getpreferredsize(){ return new dimension(default_width,default_height); // 返回一个dimension对象,表示这个组件的大小 } }
输出结果:左上角的窗口中有一个椭圆,外面有一个外界矩形,有一条从矩形左上角到右下角的直线,以这个矩形中心为原点有一个半径为150像素的圆。
(四)图形上色
rectangle2d rect = new rectangle2d.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像素为半径有个蓝色线条的圆形。
(五)特殊字体
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 // 开启一个线程,所有的swing组件必须由事件分派线程进行配置,线程将鼠标点击和按键控制转移到用户接口组件。 eventqueue.invokelater(new runnable() { // 匿名内部类,是一个runnable接口的实例,实现了run方法 public void run() { jframe frame = new fontframe(); // 创建下面自己定义的simpleframe类对象,以便于调用构造器方法 frame.settitle("fonttest"); // 设置标题 frame.setdefaultcloseoperation(jframe.exit_on_close); // 选择当用户关闭框架的时候进行的操作 ,在有些时候需要将窗口隐藏,不能直接退出需要用到这个方法 frame.setvisible(true); // 将窗口可见化,这样以便用户在第一次看见窗口之前我们能够向其中添加内容 } }); } } class fontframe extends jframe { public fontframe() { add(new fontcomponent()); // 向其中添加一个实例化的实现jcomponent类的子类 pack(); // 调用框架组件的首选大小,或者我们可以用setsize方法来替换它 } } class fontcomponent extends jcomponent { private static final int default_width = 300; private static final int default_height = 200; /** * 我们覆盖了这个以用来做一些工作 * * @param g * graphics对象是我们需要用的graphics2d的父类 */ public void paintcomponent(graphics g) { graphics2d g2 = (graphics2d) g; // 实例化graphics2d这个类的对象,他是参数graphics2d的一个子类 string message = "hello world!"; // 写出我们要操作的文字 font f = new font("dialog", font.bold, 36); // 创建一个字体类型,参数包括字体族,风格类型,大小 // 也可以通过特殊的方法,调用加载得到本地的字体包 g2.setfont(f); // 将f设置在g2之中 fontrendercontext context = g2.getfontrendercontext(); // 通过调用方法,得到屏幕设备字体属性的描述对象 rectangle2d bounds = f.getstringbounds(message, context); // getstringbounds方法返回一个包围着字符串的矩形 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; // 文字的基线位置 g2.drawstring(message, (int) x, (int) y); // 设置字符串位置 g2.setpaint(color.light_gray); // 设置线条颜色为亮灰色 g2.draw(new line2d.double(x, basey, x + bounds.getwidth(), basey)); // 在文字的基线上画下一条横线 rectangle2d rect = new rectangle2d.double(x, y, bounds.getwidth(), bounds.getheight()); g2.draw(rect); } /** * 我们覆盖了这个方法来表示出这个类的组件的大小 * * @return 返回这个类的组件本身应该有多大 */ public dimension getpreferredsize() { return new dimension(default_width, default_height); // 返回一个dimension对象,表示这个组件的大小 } }
输出结果:窗口正中间有文字“hello world”,外围被一个灰色矩形包括,在基线的地方有一条横线分割。
(六)添加图片
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 // 开启一个线程,所有的swing组件必须由事件分派线程进行配置,线程将鼠标点击和按键控制转移到用户接口组件。 eventqueue.invokelater(new runnable() { // 匿名内部类,是一个runnable接口的实例,实现了run方法 public void run() { jframe frame = new imageframe(); // 创建下面自己定义的simpleframe类对象,以便于调用构造器方法 frame.settitle("imagetest"); // 设置标题 frame.setdefaultcloseoperation(jframe.exit_on_close); // 选择当用户关闭框架的时候进行的操作 ,在有些时候需要将窗口隐藏,不能直接退出需要用到这个方法 frame.setvisible(true); // 将窗口可见化,这样以便用户在第一次看见窗口之前我们能够向其中添加内容 } }); } } class imageframe extends jframe { public imageframe() { add(new imagecomponent()); // 向其中添加一个实例化的实现jcomponent类的子类 pack(); // 调用框架组件的首选大小,或者我们可以用setsize方法来替换它 } } class imagecomponent extends jcomponent { private static final int default_width = 300; private static final int default_height = 200; private image image; /** * imagecomponent的构造函数,用来实例化图片 */ public imagecomponent(){ image = new imageicon("d:/image.jpg").getimage(); //通过路径得到图片 } /** * 我们覆盖了这个以用来做一些工作 * * @param g * */ public void paintcomponent(graphics g) { if(image == null ) return; //如果图片不正确,则直接返回避免发生错误 g.drawimage(image, 0,0,null); //在画布上给出图片 } /** * 我们覆盖了这个方法来表示出这个类的组件的大小 * * @return 返回这个类的组件本身应该有多大 */ public dimension getpreferredsize() { return new dimension(default_width, default_height); // 返回一个dimension对象,表示这个组件的大小 } }
输出结果:在画布以左上角为开始放置你添加的图片。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!