我不认为自己智商有问题,有问题的是各种GUI,包括Java Swing以及所有的语言GUI库。这样,打击面似乎有点广。
我研究过Delphi,JavaSwing,WIn32API,MFC扫过一些程序,Python tkinter。即使是实现一些常见的功能都非常困难,不是做不到,而是缺乏系统的说明书,只能搜索相关键词,找相关的代码试验,某个类、方法的具体意义。
没错,就是乱试一通。网上的外行只会让你看文档,事实上那些让你看文档的通常自己什么都不会。目前GUI的设计确实反人类的,充斥着一堆垃圾设计。文档又太多,打印出来可能是一部字典那么厚,有哪个小学生造句需要通读字典呢?
虽然现在各种GUI库,各种系统、程序设计语言,但是毫不客气的说,它们都是垃圾;当然,那些用这些垃圾制造出实用、精美的软件的程序设计者是可敬的。
希望将来会出现这样一种GUI库,只需要掌握很少的概念 -- 比如某种组件(类),就能掌握该GUI的精髓,用户只要掌握不超过10个最多几十个函数就能组合出各种软件界面。
以我的标准,现在的GUI库确实都是垃圾,说明文档更是垃圾。我学的最好GUI,居然是html、CSS、JavaScript这一套网页设计标准。
我寻思着,把html这一套东西用于桌面软件开发难道是一件很难或者不可能的事情吗?理想情况下,我们把设计好的网页(由html css JavaSCript完成),然后在某个IDE里打开这这些文件,然后点击一个按钮,然后,原生的exe生成了,其显示和用浏览器打开一样!多么惬意!
只有这种GUI库或者叫框架,才是合格、勉强能算优秀的框架。
html、css、javascript之所以相对优秀,因为这三者是将页面排版和用户程序交互分离的开来,html负责排版、javascript则用于用户和各种控件的交互处理,而css似乎是用于自定义标签。
将来的GUI框架、库都应该有类似这样一套哲学:排版和交互的分离,Python等语言有流程、循环等控制结构,用于处理用户和程序的互动(鼠标、键盘操作),而页面布局,则应该专门设计一套类似html标签性质的东西。
实际上,这一套东西,并不是没有。Delphi里的窗体文件是类似的作用,但是很少用户懂得编辑窗体文件,毕竟,delphi为快速设计窗体开发,用户通过鼠标拖放控件来设计窗体。几乎没有人会教你直接编辑窗体文件来设计窗体。
很可惜,GUI设计是如此之难,而网页排版似乎又很容易,这很奇怪,不是吗?
上面说的把网页设计直接编译成exe过于理想化,但是,把html标签用到Java、C++、Python等各种程序设计环境中,似乎是可以做到的。
我希望,将来的GUI库,设计者,要认真严肃的考虑这个问题,就是直接支持html标签,或者支持其中的一个子集。html也是不断发展变化的。
总之,我这篇文章的意思其实前人都提过了,就是把排版(窗体界面设计)和程序设计(交互、功能)分离开来。
各种程序语言,并非用来设计排版的,而目前的GUI系统,以Swing为例,用了一个很原始的layout对象来定义“排版对象”不伦不类,勉强能用。
将来的GUI框架,首相应该开门见山,告诉你,我们这一套框架有两个组成部分:
一、窗体排版,实用类似html标签的方式。
二、交互设计。使用各种带if while等流程、过程式设计的程序设计语言。我不反对类、对象的使用,但是用户设计窗体界面时,不应该考虑这些问题。
总之,面向对象是个毒瘤,为什么GUI设计会如此之难,因为它们都被所谓的面向对象设计方法给毒害太深。也许是因为,它们没有给html这种控制页面起一个很好听的方法或者名字,才抛弃了这种优秀的设计,转而去搞那些不伦不类的垃圾。
我鼓励程序员制造优秀的GUI框架,因为目前的GUI框架,可能上百上千,但没一个能用的,只要记住一条,设计好排版系统,也就是设计好类似html这样的标签控制,你可以直接使用html标签,如果你能设计一套更为简单易懂的排版,我也支持 --- 但是出于现实考虑,大量懂得网页排版的前端,我认为直接使用html的一个子集作为GUI库的窗体排版(布局)比较好。
为什么BS架构比CS架构更为流行?也许是因为html比较人性化。倘若我上面所说类似html排版的GUI库能出现,那时候,使用用C/++或者Java做CS架构会更多。
GUI库,需要的并不是面向对象(封装、继承、多态),类似C这样的过程式程序设计语言,已经足够,GUI库需要的是一个简单易懂的窗体排版系统!
所以,我说,目前所有的GUI库,都是垃圾。其中,delphi的窗体文件设计、QT的QML勉强算是摸到门路了,但是还是太复杂,而且它们的目的就不对,它们是为了可视化设计,但是如果GUI设计的发展和html的发展一样,可视化设计窗体的方式将来也会消失。现在谁还用Fontpage、Dreamwaver设计网页 ?-- 这两都是所谓的所见即所得的设计软件。
实际上,有经验的人们都知道,所谓的所见即所得,是个彻头彻尾的谎言,因为不同的电脑,显示器大小是不一样的,你所见的网页,在另一台电脑、甚至同一台电脑不同的浏览器、即使相同的浏览器、不同的分辨率都可能是不一样的。并不存在所谓的所见即所谓,这是程序员们欺骗那些眼神不好,看东西不仔细的人编出的谎言,当然,乍一看,同一个程序在不同的电脑表现差不多。
Delphi里,几乎没有人会手动编辑窗体文件,很可惜,因为Delphi强调的是快速开发,本身就是为了鼠标拖放控件来设计窗体的,QT的QML也是这样。它们的理念是一种进步 -- 也就是将版面设计和交互流程分开设计。但是,它们错误的使用了所见即所得的设计方式,这是一颗毒瘤。
正确的设计方式是:使用屏幕分辨率坐标。Java Swing Delphi、Win32API都使用屏幕左上角作为(0,0)坐标,屏幕右下角坐标则是则是你的屏幕分辨率,除此之外,html/css还是用百分比坐标控制,比如你的UI里使用一个button,你也许可以指定按钮到屏幕左边的距离占整个屏幕宽度的30%,而不是指定分辨率,也许百分比的概念可能比屏幕分辨率更容易理解,这不一定。
既然JavaScrit能从浏览器中挖出来,作为服务器程序开发系统Node.js, html标签,css这一套页面排版系统也能从浏览器里挖出来,作为GUI系统的排版系统。
老哥,你的想法很大胆,但是问题就是想得太多,想的也太简单了。所谓的GUI可以说是非常复杂的一项技术了,复杂程度可能远远超过你我想象。面向对象编程这个概念,本来就是为了描述图形界面而产生的,可见它很难很复杂。
你自己也说了:
如果想要涵盖图形界面编程的大部分情况,还真得写成字典这么厚。如果只是为了写一个demo的话,当然可以就写一页纸。但是如果想要开发一个生产可用的程序,可能会遇到很多奇奇怪怪的问题,而它们其实都已经被你说的那些“反人类”的框架解决过了。不说一本字典这么厚, 最起码二三十页总是该有的吧。
你的另一个想法是非常正确的,确实类似html这样的xml格式非常适合描述GUI界面,所以实际上很多流行的框架都支持XML格式。Qt的QML、WPF的XAML、JavaFX的FXML都是这样的……新出的Flutter倒是不支持XML,因为他时直接代码描述界面的,优点就是不用额外学习XML那些东西了,缺点就是我觉得写出来的代码一大堆new和括号,感觉很丑……
你准备设计的框架貌似按照你的说法准备仅支持分辨率设定,也就是按照像素进行绝对定位。但是一个框架真准备给人用的话,肯定要各种定位(硬数值、百分比等等)都支持才行。别的不说,就是我这个电脑正好接了两个不同分辨率的显示器,一个窗口拉到另一个显示器上就不能看了。你要做个框架,这一点肯定要处理的吧,那么就必须根据分辨率动态设定窗口大小,那写死尺寸肯定是不行的。
以上所说的还仅仅是界面相关的部分,其实这只算是最简单的一个部分。因为界面说来说去,把用户想看的数据显示出来才算完成。比如说某个文件夹里面有1000个文件,用户想打开某一个,于是你写了个对话框显示这些文件,而且还要保证高效处理和异步。不然用户点一下,程序卡死了,那这玩意有什么用?这还需要大量的知识才能保证。
所以我还是推荐你学习一个成熟稳定的图形框架,可能他们有些地方确实做的很烂,但是就算我们自己来做的话,几乎不可能比他们做得好,因为那些专业领域的程序员都做不好,我们这就更别提了。
JavaFx
看到你问题描述里面带了个Java,正好Java就有一个现成的GUI框架,也就是JavaFX。之前网上很多教程或者旧书上会介绍Swing和AWT之类的,但是他们都已经是过时的老古董了。新人入门的话,JavaFX是一个非常好的选择,它也支持XML格式描述界面,甚至可以直接用CSS来设定界面样式,而且还是跨平台的,你在Windows上开发的,同样也可以在Linux运行。
Electron
这个就更直接了,相当于直接就是一个浏览器,所以你可以直接用html和css描述界面,用JavaScript编写代码。Electron也是很流行的一个技术,用的人也很多,Visual Studio Code就是用Electron写的。
它的缺点就是运行速度稍微慢点,不过大多数情况下没什么影响。
