您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息

java图形化Swing教程(二)

2024/4/19 11:47:52发布8次查看
与多线程、泛型等不同,swing主要在于使用。
下面主要放代码和注释,少说话。
(一)共用代码所有继承jframe的类都要有一个开始的框架来包含他们,这里直接给出框架,以下几点中不会重复书写。
package event;import java.awt.*;import javax.swing.*;/** * * @author quinnnorris * 共用代码 */public class baseframe { /** * @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 *********(); // 将*号的地方换成你实现的jframe的子类,来实现你的代码 frame.setextendedstate(frame.maximized_both); // 将窗口最大化 frame.settitle("christmas"); // 设置窗口标题 frame.setdefaultcloseoperation(jframe.exit_on_close); // 选择当用户关闭框架的时候进行的操作 ,在有些时候需要将窗口隐藏,不能直接退出需要用到这个方法 frame.setvisible(true); // 将窗口可见化,这样以便用户在第一次看见窗口之前我们能够向其中添加内容 } }); } }
输出结果:得到一个基本的公用框架,以后的内容可以在其他类中书写,放入这个框架中。
(二)按钮事件package event;import java.awt.*;import javax.swing.*;import java.awt.event.*;/** * * @author quinnnorris 按钮事件 */public class buttonframe extends jframe { private jpanel buttonpanel; private static final int default_width = 300; private static final int default_height = 200; public buttonframe() { setsize(default_width, default_height); // 设置默认宽度和高度 buttonpanel = new jpanel(); // 将类的实例域中的jpanel面板对象实例化 makebutton("yellow",color.yellow); makebutton("blue",color.blue); makebutton("red",color.red); //调用makebutton方法来创建并添加按钮 add(buttonpanel); // 我们将这个添加好按钮的面板添加到原框架中 } /** * 通过方法来创建按钮,并且完成关联监视器和添加入面板的操作 * @param name 创建按钮的标识 * @param backgroundcolor 点击按钮后改变的颜色,匿名内部类只能访问final修饰的变量,所以要用final */ public void makebutton(string name,final color backgroundcolor){ jbutton colorbutton = new jbutton(name); //通过不同的标识名,我们创建按钮 buttonpanel.add(colorbutton); //我们将创建的按钮添加到面板中 //匿名内部类,创建一个actionlistener的实例 colorbutton.addactionlistener(new actionlistener(){ /** * 当按钮点击的时候,会自动的调用actionperformed方法 */ public void actionperformed(actionevent event) { buttonpanel.setbackground(backgroundcolor); // 调用setbackground方法,设置背景颜色 } }); } }
输出结果:在一个全屏窗口中,上方有三个不同颜色的按钮,按下去后,背景颜色会随之改变。
(三)更改主题package event;import java.awt.*;import javax.swing.*;import java.awt.event.*;/** * * @author quinnnorris 更换主题 */public class metalframe extends jframe { private jpanel buttonpanel; private static final int default_width = 300; private static final int default_height = 200; public metalframe() { setsize(default_width, default_height); // 设置默认宽度和高度 buttonpanel = new jpanel(); // 将类的实例域中的jpanel面板对象实例化 uimanager.lookandfeelinfo[] infos = uimanager .getinstalledlookandfeels(); // 调用这个静态方法,我们获得所有主题 makebutton(infos); // 调用makebutton方法来将主题实现 add(buttonpanel); // 我们将这个添加好按钮的面板添加到原框架中 } /** * 通过方法来创建所有的主题按钮,并且将他们关联监视器 * * @param infos * 包含有所有类型主题的数组 */ private void makebutton(final uimanager.lookandfeelinfo[] infos) { for (uimanager.lookandfeelinfo info : infos) { jbutton button = new jbutton(info.getname()); // 用for-each循环来遍历所有的主题 final uimanager.lookandfeelinfo innerinfo = info; // 将info复制并且定义位final类型,便于内部类的使用 buttonpanel.add(button); // 我们将创建的按钮添加到面板中 // 匿名内部类,创建一个actionlistener的实例 button.addactionlistener(new actionlistener() { /** * 当按钮点击的时候,会自动的调用actionperformed方法 */ public void actionperformed(actionevent ae) { try { uimanager.setlookandfeel(innerinfo.getclassname()); // 调用setlookandfeel方法,更改主题 swingutilities.updatecomponenttreeui(buttonpanel); // 通过这个静态方法,将更改的主题立即应用 } catch (exception e) { // todo auto-generated catch block e.printstacktrace(); } } }); } } }
输出结果:窗口上方有五个主题按钮,分别写着他们各自主题的名字,点击后会立即更改所属主题。
(四)按钮与击键动作package event;import javax.swing.*;import java.awt.*;import java.awt.event.*;/** * * @author quinnnorris 按钮与击键动作 */public class actionframe extends jframe { private jpanel buttonpanel; private static final int default_width = 300; private static final int default_height = 200; public actionframe() { setsize(default_width, default_height); // 设置默认宽度和高度 buttonpanel = new jpanel(); // 将类的实例域中的jpanel面板对象实例化 action yellowaction = new coloraction("yellow", color.yellow); // 创建一个自己定义的coloraction对象yellowaction buttonpanel.add(new jbutton(yellowaction)); // 创建一个按钮,其属性从所提供的 action中获取 add(buttonpanel); // 我们将这个添加好按钮的面板添加到原框架中 inputmap imap = buttonpanel .getinputmap(jcomponent.when_ancestor_of_focused_component); // 我们将jpanel对象的inputmap设置为第二种输入映射,并创建该对象 imap.put(keystroke.getkeystroke("ctrl y"), "panel.yellow"); // 在imap中通过调用击键类keystroke的静态方法设置击键输入ctrl+y的组合 // 第二个参数是一个标志参数,将这对参数用键值对的形式存入imap actionmap amap = buttonpanel.getactionmap(); // 我们不能将inputmap直接和action做映射,我们需要用actionmap做过渡 // 用jpanel中的getactionmap方法获得amap对象 amap.put("panel.yellow", yellowaction); // 将imap中标记参数对应的击键组合和相应的action组合起来 } public class coloraction extends abstractaction { /** * coloraction的构造器,存放键值对 * @param name 按钮的名称 * @param c 按钮对应点击后显示的颜色 */ public coloraction(string name, color c) { putvalue(action.name, name); putvalue(action.short_description, "set panel color to " + name.tolowercase()); putvalue("color", c); //在构造器中设置一些键值对映射,这些设置的属性将会被jpanel读取 } /** * 当按钮点击或击键的时候,会自动的调用actionperformed方法 */ public void actionperformed(actionevent event) { color c = (color) getvalue("color"); buttonpanel.setbackground(c); // 调用setbackground方法,设置背景颜色 } } }
输出结果:窗口上方有yellow按钮,通过点击或者ctrl+y都可以使背景变黄,鼠标悬停在上面一段时间会显示说明文字。
(五)鼠标操作package event;import javax.swing.*;/** * * @author quinnnorris * 继承jframe的子类,将component对象内容打包 */public class mouseframe extends jframe{ public mouseframe(){ add(new mousecomponent()); //向框架中添加一个jcomponent的实例 pack(); } }
package event;import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.util.*; import javax.swing.*;/** * * @author quinnnorris 鼠标点击 */public class mousecomponent extends jcomponent { private static final int sidelength = 100; // 定义创造的正方形的边长 private arraylist<rectangle2d> squares; // 声明一个正方形集合 private rectangle2d current; // java类库中用来描述矩形的类,它的对象可以看作是一个矩形 /** * 构造器方法,做初始化工作 */ public mousecomponent() { squares = new arraylist<>(); current = null; addmouselistener(new mousehandler()); // 添加一个我们实现的类,这个类继承了监测鼠标点击情况的mouselistener addmousemotionlistener(new mousemotionhandler()); // 添加另一个实现类,这个类继承了监测鼠标移动情况的mousemotionlistener } /** * 我们覆盖了这个以用来打印图形,将会被自动调用 * * @param g * graphics是我们要使用的2d的一个父类 */ public void paintcomponent(graphics g) { graphics2d g2 = (graphics2d) g; // 转换为我们需要使用的类型 for (rectangle2d r : squares) g2.draw(r); // 对数组中的每个正方形,都进行绘制 } /** * 判断在这个坐标上是否有图形 * * @param p * 一对当前的x,y的坐标值 * @return 返回存在的图形或者null */ public rectangle2d find(point2d p) { for (rectangle2d r : squares) { if (r.contains(p)) //contains方法测定坐标是否在图形的边界内 return r; } // 如果在squares这个数组中有这个位置的坐标,表明这个位置上非空 // 返回这个位置上的对象 return null; // 否则如果什么都没有,返回null } /** * 在这个坐标位置增加一个图形 * @param p 坐标位置 */ public void add(point2d p) { double x = p.getx(); double y = p.gety(); //获取x和y的坐标 current = new rectangle2d.double(x - sidelength / 2, y - sidelength / 2, sidelength, sidelength); //用获得的坐标和既定的边长构建一个新的正方形,并将其赋值给current squares.add(current); //将current添加到squares队列中 repaint(); //重绘图像 } /** * 将这个位置的图形移除 * @param s 代表所要移除的矩形对象 */ public void remove(rectangle2d s) { if (s == null) return; //如果要移除的内容为空,直接返回 if (s == current) current = null; //如果要移除的内容和current正指向的内容相同,则将current清空 //避免发生不必要的错误 squares.remove(s); //将s从squares的列表中直接删去 repaint(); //重绘图像 } /** * * @author quinnnorris 继承了mouseadapter类的鼠标点击控制类 */ private class mousehandler extends mouseadapter { /** * 单击鼠标操作 */ public void mousepressed(mouseevent event) { current = find(event.getpoint()); // 将鼠标单击的这个点的坐标的对象赋给current if (current == null) //如果这个点没有对象,当前指向空的位置 add(event.getpoint()); //在这个点绘制正方形 } /** * 鼠标双击操作 */ public void mouseclicked(mouseevent event) { current = find(event.getpoint()); // 将鼠标单击的这个点的坐标的对象赋给current if (current != null && event.getclickcount() >= 2) //如果这个点有对象,而且点击鼠标的次数大于2 remove(current); //移除current } } /** * * @author quinnnorris * 鼠标移动拖动类 */ private class mousemotionhandler implements mousemotionlistener { /** * 鼠标光标移动到组件上,但未按下时调用 */ public void mousemoved(mouseevent event) { if (find(event.getpoint()) == null) //如果鼠标所在位置不是空 setcursor(cursor.getdefaultcursor()); //则将光标的图像设置为默认的图像 else setcursor(cursor.getpredefinedcursor(cursor.hand_cursor)); //如果当前位置有图像,则将光标样式设置为手型 } /** * 鼠标光标在组件上按下,并拖动时调用 */ public void mousedragged(mouseevent event) { if (current != null) { //因为在调用这个方法之前肯定会调用点击鼠标的方法 //所以我们直接判断:如果现在current不为空 int x = event.getx(); int y = event.gety(); //获取到坐标 current.setframe(x - sidelength / 2, y - sidelength / 2, sidelength, sidelength); //最后在鼠标放下时进行图形绘制 repaint(); //重绘图像 } } } }
输出结果:在这个窗体中,单击一次鼠标会创建一个100像素为边长的小正方形。在正方形内,双击或更多次点击会删除这个正方形。可以点住正方形并进行拖动,并且在指示正方形区域内时,鼠标指针变为手型指针。
与多线程、泛型等不同,swing主要在于使用。
下面主要放代码和注释,少说话。
以上就是java图形化swing教程(二)的内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录