我最近在用JavaFX做一个应用。但是今天遇到了一个棘手的问题。
看。同样的一个界面。同样的参数。用纯Java代码和FXML实现起来样子是不一样的
纯Java代码实现

FXML实现

这就导致了一个严重的问题。到底用Java代码做这个窗口好呢还是用FXML好呢?Java代码虽然样子丑。但是起码保存用户输入的数据。点击按钮进行保存数据并关闭窗口这几个逻辑功能实现起来很方便。但是,这也实在太丑了吧。和FXML简直没法比。尤其是光标点击输入栏的时候。FXML做的不仅提示字直接上去了。变成一小行。UI动画很舒服。但是纯代码实现的实在太丑了。他甚至把提示用的字直接显示上去。而且FXML做的按钮点击后还会有点击效果。类似于动画但不算是动画。毕竟是人家自带的。但是纯代码就没有这一点。另外,我想要用户点击按钮后如果输入的不对那么可以在按钮上方显示一行红色的字。这个用纯代码很好实现。但是FXML就不行了。因为FXML里场景与逻辑代码是分开的。当遇到逻辑代码需要调用场景参数时。他就无能为力了。而FXML与纯代码只能用一个实现场景。因为2个场景是无法叠加的。况且一个Stage里只能放2个场景。所以想问问,如何用纯代码做出FXML的那种效果。谢谢!
肯定写的哪里不一样咯,贴代码。为什么这么说呢?fxml相比java代码也没什么神奇之处,不过是利用了反射,把xml里的元素动态生成出来了。
- “Java代码虽然样子丑。但是起码保存用户输入的数据。点击按钮进行保存数据并关闭窗口这几个逻辑功能实现起来很方便”
如果我没记错的话,按钮点击的回调可以用注解绑定吧,很方便。
如果不能用注解绑定,自己写一个注解就是了,反正也很简单,无非就是反射拿到对应的控件,然后再给控件加上监听 。 - “他甚至把提示用的字直接显示上去”
从你的描述来看,你应该是直接设置了他的文本内容吧
这种行为在不同的界面实现中有不同的叫法,比如android中叫“hint”,html中叫“placeholder ”
帮你查了一下,你想要的这种行为在fx中叫“promptText” - “当遇到逻辑代码需要调用场景参数时。他就无能为力了”
不清楚你这个具体指的是什么,是需要动态修改界面?那么只要拿到fxml里对应生成的某个对象,在对这个对象修改就行了。
fxml主要是可以用工具来生成,而不用自己进行编码,省去了很多调整界面的时间,当然我也不是在说用fxml多好多好。界面就应该单单只是一个界面,无论你是用java代码实现,还是用fxml实现,里面都应该没有任何逻辑操作。而相关的逻辑操作都应该与前面的界面分开。如果界面和逻辑糅杂在一起,项目小是无所谓,大了就比较麻烦,这也就是最基础的mvc思想。最后说一句,java的图形化界面本身也不用去深究,毕竟人家自身都放弃了,应该扬长避短,多用java擅长的领域。