最近在和一位朋友一起做一个下棋的小项目,算法部分暂时没有想到太好的优化方法,但是盯着一个二维数组下棋实在是太难受了,于是我觉得先写一个好看点的界面,于是我开始研究怎么写gui,又由于那位朋友前面的程序全是用java写的,所以我决定就用javafx来写gui。写下这篇博客一边学一边记录。
配好环境之后,我发现其实javafx其实帮我把大部分的工作都完成了,我只用照着模板调用就可以了。。。。。
要写gui,首先要有一个窗口,这么写就可以了
这两句先是定义了一个标题叫hello window的窗口然后再把它显示出来,运行结果如下
一个窗口就出来了,接下来我需要在她上面加个按钮,按照它的逻辑,按钮这个元素必须要存在一个容器之中,于是我们要先定义一个按钮,然后把他放到容器上
可以这么写,首先new一个叫做btok的button,传入text参数“ok”使它显示ok,之后再new一个容器,里面放着btok,再传参控制它的大小,运行后结果如下
于是现在我们就创造了一个里面有按钮的窗口了, 用同样的方法可以在一个程序内写出多个窗口
但是这时候,我们发现了一个巨大的问题,那就是一个容器(scene)里只能装一个东西,但是我们的界面里可能需要很多东西,于是可以这么操作:把界面中需要的元素像贴纸一样贴到一个板子(pane)上,再把pane放到容器(scene)之中,这样既满足了容器里只能有一个东西,又满足了界面中需要有很多东西的要求
这里就是先创建了一个scene,然后再把button放到了scene里面
但是这时问题出现了,当我们把两个不同的button放到了同一个pane里面之后,却发现出现的窗口中仍然只有一个button
这是因为两个button虽然都被创建了,但它们被创建在了窗口中的同一个位置,导致后创建的button把先创建的button挡住了,
为了解决这个问题就需要把这些元素按照一定的顺序排列起来,于是就需要用到布局,常用布局有以下几个:
流布局(flowpane) :把元素按照顺序排列
网格布局(gridplane) :把元素按照行和列排序
边框布局(borderpane):把页面分成五个部分
之后,把需要的元素布局好后放到pane中就可以了,元素种类较多这里就不一一赘述了。
创建了界面的下一步就是响应用户的操作,而这就需要用到事件响应,就需要用到事件处理器
可以先定义一个事件处理器,然后再编写事件处理器的具体内容
运行后结果如下
当然,也可以使用lambda简化使代码更加简洁,如下
这么写就可以了,于是,我们就可以使得程序在收到信号后进行事件响应了。