大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 其他相关 -> 轻松实现Java用户界面编程

轻松实现Java用户界面编程

时间: 2021-07-31 作者:daque

buoy 是一个建立在 swing 之上的免用度户界面(ui)东西包,它为 ui 开拓职员供给了简单性和大略性。在正文中作家用一个大略的 fractal 用户界面步调,引见了 buoy 不妨做什么、干什么这么做。

第一次试验用 java 谈话建立大略的用户界面时,我对 swing 接口的搀杂性感触有些诧异。淳厚说,有点想打退堂鼓。迩来,一个伙伴向我提到,他运用的衬托步调 art of illusion(请参见 参考材料)鉴于一个各别的东西包:buoy。引荐它的因为之一是它的界面更和睦。当他第一次提到它时,我觉得他在谈 "bui",而它与 gui 这个名字的一致是蓄意的。在这边 b 代办 better(更好),然而名字 buoy 并不是缩写。

buoy 是免费的。本质上,它是大众的货色。它并没有在某个盛开水平有理的承诺下颁布,本质上它基础不受任何承诺遏制。这表示着在任何用 java 谈话编写的不妨运转 buoy 的名目中都不妨运用 buoy,而不必商量承诺题目。由于供给了完备的源代码,以是这个东西包很简单窜改和扩充。正文鉴于 buoy 1.3 刊行版,诉求读者群对 swing 有基础的领会,固然不领会也能周旋往日。

示例步调

我已经试验用 swing 建立的第一个运用步调结果以波折结束。为了看开工具包之间的比较情景,我确定运用 buoy 来建立这同一个步调。作品中的代码示例十足来自该步调的 buoy 本子。步调天生了少许分形,简直地说,是迭代的分形。基础思维很大略:在平面上设置一系列的线条区段,从(0,0) 到(1,0),环绕大肆一个单元线条定位。绘制那些区段之后,绘制同一套变形线条,用这个区段动作单元向量。做起来比说的更简单,就像在图 1 中看到的。

图 1. 分形编纂器中的分形

这个步调的界面十分大略。它有少许界面小元件,有一个画布,在画布上绘制美丽的图片,还扶助用鼠标安排图片。本质上,必需要做的十足处事即是安排形成原始弧线的点,原始弧线会迭代地绘制出来。界面再有一个最小化的菜单;它不妨翻开和封闭文献,封闭窗口,大概把暂时图像生存为 png 方法的文献。固然大略,然而这个界面简本地供给了一个 buoy 小元件的有理示例,再有十分数目对事变处置体例的领会。

步调本质的中心代码 —— 分形天生器 —— 仍旧写好了,这把这个示例形成一个很好的尝试步调。固然,在革新它的进程中,我也创造而且补缀了少许 bug。

轻松实现java用户界面编程图1

[page_break]    刊行包中包括示例步调的源代码,再有编写翻译好的类文献和 buoy 的 jar 文献(单击正文顶部或底部的 code 图标,载入 factal.tar)。包中还包括一个叫作 frac 的目次,内里包括少许示例分形。即使运用一台 unix 作风的呆板,在路途中有 java 编写翻译器,那么只有运转 make 就能运转它。要不,须要树立 classpath 包括暂时路途和 buoy 的 jar 文献地方的目次,而后运转 fractalviewer 类。在 windows 体例上,精确的吩咐行该当是 java -classpath .;buoy.jar fractalviewer。  sed -e s/j/b/g  在第一次深刻接洽代码时,大概会产生如许的回忆:把 swing 代码变换成 buoy 代码大略得就像把 ui 元素称呼中的假名 j 换成 b 一律大略。比方, fractalviewer 类不复扩充 jframe;它此刻扩充的是 bframe。重要的小元件称呼也不妨照此估计获得。spinner 和 slider 像往日一律有沟通的名字,不过换了一个假名。 menubar(菜单条) 仍旧由 menus(菜单)形成,菜单则包含 menuitems。  有些定名变换略有各别。在 swing 援用 borderlayout 的场合,buoy 有 bordercontainer。普遍来说,buoy 的定名变换十分一致,固然不老是与 swing 的定名一律。一个鲜明的辨别是 buoy 简直拉拢了容器和构造处置器的观念;每种容器典型都领会本人怎样构造。这大大简化了安排。比方,在分形天生器中运用的 labelwidget 类是一个 bordercontainer;在 swing 中,这大概是一个带有 borderlayout 构造处置器的 jpanel。  然而,两者仍旧有很多一致之处。这对符合新货色有很大扶助。更要害的是,buoy 建立在 swing 之上。这表示着,普遍来说,即使须要做的事不许轻快地用 bouy 实行时,不妨把 buoy 东西传播给它包装的 swing 东西。对于这种情景,即使想考察少许没有 buoy 对应物的 swing 东西,不妨大略地把它包装在 awtwidget 东西中,这个东西供给了特殊薄的包装器,经过它,不只 buoy 本人的小元件,并且一切的小元件都能考察 buoy 的小元件 api。比方,即使创造真实须要 gridbaglayout,大概就须要如许做。  比方,fractalpanel 类是一个 awtwidget。在早期安排中, 它是 jpanel 的子类, 但本质上我并不须要 jpanel 代码。差异,我建立了包装定制类的类 fractalcanvas, 它自己是普遍的 canvas 类的一个子类。把它形成一个 awtwidget,就不妨在它上头运用 buoy 高效的事变处置体制。   事变处置代码特殊大略。在按下鼠标按钮时,经过 addeventlink() 的魅力,buoy 发送一个新的 mousepressedevent 事变到 mousepressed() 因变量。我忽视了按下哪个按钮这个题目,只商量按住 shift 单击或普遍单击。普遍单击采用最邻近的点,而按住 shift 单击则从新把表露居中。而后,即使鼠标挪动,那么历次 buoy 提防到挪动时城市发端发送 mousedraggedevent 事变。在处置那些事变时,fractalpanel 会天生本人的事变。   近观 pointchangedevent  为了让少许计划越发简直,请来看 pointchangedevent。这是一个考查性的类,即使不爱好它,那也只能怪老天了。这个类的办法是:让一个类来表白状况点中的变革。编纂器盯梢“暂时”点 —— 也即是编纂器小元件暂时正在编纂的点。不妨用那些小元件或在分形面板中单击采用新的点,采用的是最邻近的点。  我得出如许一个论断:在代码中,大约有二类波及到点的事变须要从一个类发送给另一个类。  一个是变换某个点的特性: point 事变典型。即使由编纂器发送,即是报告分形变换原形线条上的点,并诉求重画线条。即使由分形发送,则是报告编纂器方才选中的点的个性。   下一个是采用某个点。不妨按索引或场所举行采用。以是,即使只供给了索引或场所,那么结构因变量会觉得企图是弥补其余值。有一点特出的场合,点索引 -1 用来表白没有选中的点,以是必需用 -2表白编纂器正在探求指定场所的点。这大概不美丽,然而灵验。   有点道理的是 fractal 类相应 select 事变的办法。即使胜利地采用了一个点,就会发回一个新的 point 典型的 pointchangedevent 事变,如清单 1 所示。   清单 1. 用事变回复事变case pointchangedevent.select:if (e.getindex() >= -1)selectpoint(e.getindex());elseselectpoint(e.getpoint());// just in case they don't knowevent(new fractalchangedevent(fractalchangedevent.size, size));if (selectedpoint >= 0 && selectedpoint < size)event(new pointchangedevent(selectedpoint, points[selectedpoint]));elseevent(new pointchangedevent(selectedpoint, null));event(new fractalchangedevent(fractalchangedevent.redraw));break;  结果,挪动点是一个特出情景,即使不须要变换点的其余属性(比方脸色),那么所要处置的即是场所。这即是 move 事变典型。在功效上,它与 point 事变典型功效很像,但它不须要事变天生器(常常是 fractalpanel 类)去关怀那些它基础不领会的属性。[page_break]  insert 和 delete 事变典型惟有局部关系,大概该当属于 fractalchangedevent 事变。  事变处置  正如仍旧发端看到的,事变处置是 buoy 与 swing 最鲜明的各别之处。事变处置供给了洪量精巧性。buoy 自己的事变集十分充分,且承诺您抉择本人感爱好的事变,从任何小元件向其余东西发送事变。比方,即使想在 swing 中捕捉鼠标事变,捕捉事变的类须要实行 mouselistener 接口。这个接口有 5 个因变量须要实行,纵然它们即是安排也必需实行。并且必需运用接口供给的因变量称呼。更糟的是,因变量必需是侦听器接口的大众局部;要么把这动作大众接口的一局部公然,要么创造一个什么都不做、不过包装事变侦听器代码的里面类。   在 buoy 中,每个小元件都是 eventsource 。这表示着不妨从每个小元件侦听事变。什么典型的事变呢?任何典型都不妨。要害的因变量是 addeventlink()。这承诺您指定类、侦听器以及可选的本领。每当 eventsource 分配这个类或它的子类的事变时,侦听器城市接受到事变,要么是经过一个叫作 processevent()的本领,要么是经过在发端挪用 addeventlink() 时供给的本领称呼。供给的因变量不许接收参数,也不许接收与指定事变典型兼容的类的东西;父类和接口不妨。   这是一个简单的树立。不妨把各别的事变路由到各别的因变量或沟通的因变量。比方,mousepressedevent 和 mousereleasedevent 会被辨别处置。在示例步调中,鼠目标按下、开释和拖动辨别有各别的线程,如清单 2 所示。提防,这远远胜过 swing 的 mouselistener 所能做的。即使用 swing 编制程序的话,就须要实行 mouselistener 和 mousemotionlistener 这两个接口。   清单2. 只挑感爱好的事变this.addeventlink(mousepressedevent.class, this, "mousepressed");this.addeventlink(mousereleasedevent.class, this, "mousereleased");this.addeventlink(mousedraggedevent.class, this, "mousedragged");[...]public void mousereleased(widgetmouseevent ev) {lastcenter = null;dispatchevent(new fractalchangedevent(fractalchangedevent.slow));setantialiasing(true);}  mousereleased() 因变量惟有最少的处事要做。它不过在 mousepressed() 因变量之保守行整理,报告 fractal 东西到了发端所有重绘的功夫了。  buoy 的事变处置再有其余一个风趣的个性。即使承诺的话,不妨创造新的事变典型。一个事变典型即是一个类。真实如许。它以至不须要接受任何类或实行什么。它即是一个类。即使这个类的东西被发送给 dispatchevent(),那么它或它的父类的侦听器就会被挪用。在 swing 中也不妨创造新的事变典型,然而实足要本人举行;必需安排 listener 接口,还要编写本人的代码天生事变并侦听事变。在示例步调中,安排了 fractal 类,演练了不妨对立简单地把事变处置功效加就任何原有的类中。只须要证明一个 fractalviewer 类用来增添侦听器的事变源 eventsource。fractalviewer 类就会把来自事变源(比方 fractaleditor)的事变链接树立到它们的侦听器,如清单 3 所示。  清单3. 绑定private void tieevents() {// set up event handling relations.addeventlink(windowresizedevent.class, this, "layoutchildren");addeventlink(windowresizedevent.class, panel, "repaint");tiecontrolevents();tiefractalevents();tiepanelevents();}  定制事变类普遍是为了表白用户动作。在 buoy 中,普遍只经过用户动作,而不是体例接口天生事变 —— 只有本人想显式地挪用 dispatchevent() 自行天生事变。当分形东西以那种会形成字段革新的办法变革的功夫,一切元件的遏制面板城市获得报告。如许,咱们创造一个新类 parameterchangedevent,用它表白参数仍旧变革。大概,即使变革的是选中的点的场所或是索引,就发送一个新的 pointchangedevent。即使动作充满鲜明的话,那么事变处置器以至不须要接收参数。动作事变处置的一个示例,请看清单 4,它演练了 fractaleditor 的 parameterchanged() 本领的发端局部。   清单 4. 参数爆发了变革void parameterchanged(parameterchangedevent ev) {fractalparameters p = ev.getparams();int v = ev.getvalue();switch (ev.gettype()) {case parameterchangedevent.all:maxslider.setvalue(p.getmaxiterations());minslider.setmaximum(p.getmaxiterations());minslider.setvalue(p.getminiterations());maxslider.setminimum(p.getminiterations());zoomslider.setvalue(p.getzoom());break;[...]  在这个例子中,用事变处置体例把百般消息前后传播。在往日的本子中,每个类都有对其余每个类的援用,并且参差不齐的 get 本领是按天排序的。而在暂时的本子中,buoy 的事变处置体例被用来处置百般报告。比方,fractalchangedevent 类不妨用来让代码的其余局部领会对分形的窜改,大概是点的数目变革(编纂器用点的数目为点采用器设置精确的 spinnernumbermodel),大概是须要重绘的报告[page_break] 清单 5. 明显到了重绘的功夫public void fractalchanged(fractalchangedevent e) {switch (e.gettype()) {case fractalchangedevent.redraw:repaint();break;}}  buoy 的文书档案精细计划了 swing 事变模子与 buoy 事变模子的分别,以及那些分别的因为。有很好的来由,并且 buoy 的模子常常会引导更小、更明显的代码。固然,仍旧不妨做过剩的或笨拙的工作,就像在任何体例中都不妨做的那么,然而起码在做那些工作的功夫有一个纯洁美丽的界面。  进修弧线  我已经查看到,进修运用一个 gui 东西,一下昼的功夫还不够长。对于 buoy,我大约须要 6 个钟点大概差不离一所有处事日。我真实从更有体味的 buoy 用户何处获得了很棒的扶助。往日进修 swing 的体味也是有扶助的,但本质上,我并不觉得 swing 的体味是必定的。buoy 的文书档案十分好,而它的大略性真实有扶助。对于基础的 ui 实物,没有太多要学的货色。  buoy 的文书档案并不像 swing 文书档案那么完备,然而掩盖了很多详细,并且特殊好。其余,源代码也在那儿,以是回复少许对于界面包车型的士大略题目特殊简单。具备更完备的文书档案固然是功德。然而,既是这个名目放在 sourceforge 上,以是即使您承诺,您不妨编写更多的货色为它做奉献。  buoy 的进修弧线比起 swing 是一个很大的上风。用十分大略的界面就能让大普遍界面小元件精确处事。要运用 buoy 文书档案中的一个示例:在 swing 中,jlist 诉求要么运用静态列表,要么建立一个实行 listmodel 接口的新类。在 buoy 中,只需向列表中增添名目;在大普遍罕见情景下,沉重的处事已经过 buoy 替您做了。  buoy 十分小。完备的刊行包中包括源代码、jar文献和文书档案,所有不到 1 mb。代码的构造杰出,不妨简单地找就任何一定的代码段,即使须要安排安排,也不艰巨。  bug  纵然 buoy 是一个宁静、有效的体例,但并不是一个一致完备的货色。偶然在鲜明采用很有理的场合它也会有怪僻的展现,爆发令人诧异的动作。即使商量用 buoy 来实行一个本质的名目,就须要领会 bug:它们的一致水平、重要性,以及克复它们的难度。  在开拓这个运用步调的进程中,我碰到少许工作,其时看上去像是 bug。但不全是。有少许大概是文书档案中的 bug —— 在那些情景中,代码的动作不是预期的,然而却特殊有理。本质上,我不妨特殊确定,从本质上讲并不是 buoy 中的 bug,但它们真实表露了在调节和测试 buoy 运用步调时大概会遇到少许工作。在调节和测试了几天代码之后,我不妨特殊确定,我遇到的每个鲜明的 bug,要么是我的缺点,要么是我不太爱好的底层 swing 中的安排计划。不妨确定地说,在 swing 中不大概制止那些题目。  震动条刻度  早期我最常遇到的一个 bug 是处置标尺中的刻度标志的功夫。首先,我没辙获得在它们上头表露的标签。  清单 6. 让人烦恼的震动条代码minslider.setshowlabels(true);minslider.setmajortickspacing(2);  清单 6 中的代码不起效率。不妨看到,标签不过在树立了刻度间距后才表露。即使在报告震动条表露标签之前没有树立刻度间距,它不表露任何刻度就中断了。更巧妙的是,随后也不许变换刻度间距;变换刻度间距的试验没有功效。然而,这本质不是 buoy 的 bug,而是 swing 的处事办法。因为 bslider 类不过把乞求传播给 jslider,以是指责 buoy 是不公道的。[page_break]  一个更巧妙、也与底层 jslider 的缺点相关的 bug 爆发在对齐刻度的动作上。 bslider 的结构因变量把其次刻度设为5,把主刻度设为 20 —— 对立于默许尺寸 100 来说这两个值是有理的。然而,当用 1-10 的范畴创造震动条时,却看得见其次刻度,所以只能把主刻度间距值设为 1。截止爆发一个刻度值为 1-10 的震动条,并且只中断在 1 和 6 处;对齐刻度的动作妨害了沿用其余的值,由于对齐到了其次刻度而不是主刻度。   固然这个题目源自 jslider 的实行,但却在 buoy 的默许动作中爆发了,期近将颁布的 1.4 刊行版中会建设它。   提防,这对我是个题目的专一因为是,示例步调要连接地革新少许震动条的范畴。比方,即使有一个线条区段,只承诺举行最多 50 次迭代,那么要在震动条上标上每个数字的处事量大概有点多。另一上面,即使只承诺少量迭代,那么脱漏某些数字看上去就不好了。在一个震动条范畴不常革新的界面,仍旧很简单的。  菜单赶快键  buoy 用字符或键盘事变(keyevent)简单地为菜单赶快键供给了结构因变量。在第一次尝试它时,我没法让它处事。看上去必需运用小写假名;但在挪用结构因变量时必需用 'w' 包办 'w',如清单 7 所示。   清单 7. 增添 close 菜单项mi = new bmenuitem("close", new shortcut('w'));mi.setactioncommand("close");mi.addeventlink(commandevent.class, this, "menuevent");filemenu.add(mi);  如许大概必需要处置 java 5.0 sdk 与 1.42 不提防朦胧反复的场合。外表来看,即使把小写假名传播给结构器,所做的工作正与憧憬的一律。底层的题目 —— jvm 要用哪一套键或化装符来表白 ctrl-? —— 还须要一个小的自在的库本领实足处置。  文献采用  出于少许不鲜明的因为,在 mac 体例上启用新的文献采用器时,buoy 默许启用的是根目次。我做了一个精细的 bug 汇报,是对于它看上去是还好吗脱漏洪量文献的,然而随后我就看法到我仍旧把我的主目次从 /users/seebs 挪动到了 /volumes/home/seebs,而文献采用器真实表露了磁盘上的货色。分数:buoy 1,seebs 0。  我仍旧想领会干什么它要从文献体例的根发端。这大概是 jvm 的 mac 实行的缺点。  中断语  buoy 按照驰名的陈旧的 unix 形而上学:百分之十的处事处置百分之九十的题目。buoy 并不想为一切人处置一切的题目,然而它不妨实行界面用户或安排师须要的大局部处事。它具有大概是最佳的承诺条件,并且还在连接兴盛。最佳的是,即使创造它不许让您做本人真实须要做的工作,您不妨得心应手地接洽它、窜改它,要么窜改 buoy 的源代码,要么挪用 getcomponent() 并编写本人的 swing 代码。   即使感触较大的 ui 东西包太恐怖,那么 buoy 是个不错的采用。它不妨让大略的 ui 连接大略,把搀杂的代码留到须要的功夫。在试验中,对于少量 swing 比 buoy 有上风的情景,径直在 buoy 建立的步调中编写少量代码就能处置。这是一个让我犯得着花功夫用 java 举行 ui 编制程序的东西包。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.