范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

基于Java和Bytemd用120行代码实现一个桌面版Markdown编辑器

  原文出自:公众号 Throwable
  原文链接:https://mp.weixin.qq.com/s/c9s47Yf_INZD-sKnN4RCBQ前提
  某一天点开掘金的写作界面的时候,发现了内置Markdown编辑器有一个Github的图标,点进去就是一个开源的Markdown编辑器项目bytemd(https://github.com/bytedance/bytemd):
  这是一个NodeJs项目,由字节跳动提供。联想到之前业余的时候做过一些Swing或者JavaFx的Demo,记得JavaFx中有一个组件WebView已经支持Html5、CSS3和ES5,这个组件作为一个嵌入式浏览器,可以轻松地渲染一个URL里面的文本内容或者直接渲染一个原始的Html字符串。另外,由于原生的JavaFx的视觉效果比较丑,可以考虑引入Swing配合IntelliJ IDEA的主题提供更好的视觉效果。本文的代码基于JDK11开发。  引入依赖
  很多人吐槽过Swing组件的视觉效果比较差,原因有几个:  技术小众,现在有更好的组件进行混合开发和跨平台开发  基于上一点原因,导致很少人会去开发Swing组件的UI,其实Swing的每个组件都可以重新实现UI的表现效果  compose-jb(JetBrains)组件很晚才发布出来,刚好碰上Swing官方停止维护,后面应该更加少人会使用Swing做GUI开发
  使用Swing并且成功了的方案最知名的就是JetBrains全家桶。目前来看,为了解决这个"丑"的问题,现在有比较简单的处理方案:  方案一:使用compose-jb(名字有点不好听,官方仓库为https://github.com/JetBrains/compose-jb)开发,这个是JetBrains系列的通用组件,基于Swing做二次封装, 「不过必须使用语言Kotlin,有点强买强卖的嫌疑」 ,这列贴两个官方的图参考一下:
  方案二:FormDev(之前推出过Swing布局器的开发商,官网https://www.formdev.com/flatlaf)提供的FlatLaf(Flat Look and Feel),提供了Light Dark IntelliJ and Darcula themes,而且依赖少,使用起来十分简单,个人认为当前这个是Swing UI组件视觉效果首选
  引入FlatLaf和OpenFx的依赖:       com.formdev     flatlaf     1.5       com.formdev     flatlaf-intellij-themes     1.5       org.openjfx     javafx-media     11.0.2       org.openjfx     javafx-swing     11.0.2       org.openjfx     javafx-web     11.0.2       org.openjfx     javafx-base     11.0.2       org.openjfx     javafx-graphics     11.0.2       org.openjfx     javafx-controls     11.0.2  布局和实现
  布局的实现比较简单:
  最终的H5文本渲染在WebView组件中(JFXPanel是JavaFx => Swing的适配器,WebView是JavaFx的组件,但是这里使用的外层容器都是Swing组件),具体的编码实现如下:  public class MarkdownEditor {      private static final int W = 1200;     private static final int H = 1000;     private static final String TITLE = "markdown editor";      public static String CONTENT = " " +             " " +             " " +             "     " +             "     " +             "    ByteMD example " +             "     " +             "     " +             "     " +             "     " +             "     " +             "     " +             " " +             " " +             " " +             "    bytemd " +             " " +             " " +             " " +             "";      static {         // 初始化主题         try {             UIManager.setLookAndFeel(FlatIntelliJLaf.class.getName());         } catch (Exception e) {             throw new IllegalStateException("theme init error", e);         }     }      private static JFrame buildFrame(int w, int h, LayoutManager layoutManager) {         JFrame frame = new JFrame();         frame.setLayout(layoutManager);         frame.setTitle(TITLE);         frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);         frame.setSize(w, h);         Toolkit toolkit = Toolkit.getDefaultToolkit();         int x = (int) (toolkit.getScreenSize().getWidth() - frame.getWidth()) / 2;         int y = (int) (toolkit.getScreenSize().getHeight() - frame.getHeight()) / 2;         frame.setLocation(x, y);         return frame;     }      private static void initAndDisplay() {         // 构建窗体         JFrame frame = buildFrame(W, H, new BorderLayout());         JFXPanel panel = new JFXPanel();         Platform.runLater(() -> {             panel.setSize(W, H);             initWebView(panel, CONTENT);             frame.getContentPane().add(panel);         });         frame.setVisible(true);     }      public static void main(String[] args) {         SwingUtilities.invokeLater(MarkdownEditor::initAndDisplay);     }      private static void initWebView(JFXPanel fxPanel, String content) {         StackPane root = new StackPane();         Scene scene = new Scene(root);         WebView webView = new WebView();         WebEngine webEngine = webView.getEngine();         webEngine.setJavaScriptEnabled(true);         webEngine.loadContent(content);         root.getChildren().add(webView);         fxPanel.setScene(scene);     } }
  H5文本来源于bytemd的原生JS实现例子:
  所有代码加上注释大概120多行。使用JDK11运行,结果如下:
  目前有2个没有解决的问题(也有可能是):  JS的动作触发有轻微延迟  WebView组件初始化比较慢  小结
  Oracle JDK官方已经宣布不再维护Swing项目,按照一般的尿性后面有可能从JDK中移除,也许是因为它体现不了自身的价值(低情商:不赚钱)。Swing的开发中布局是比较反人类的,一般可能一个Swing项目布局会耗费90%以上的时间,原生组件的UI设计看上去比较"丑",没有丰富的扩展组件和活跃的社区,加上现在有其他更好的跨平台开发方案如Qt、React Native和Flutter等等,Swing被遗忘是一个既定的结局。往后除了一枝独秀的JetBrains,Swing的结局就是成为少数人业务的爱好,成为JDK GUI编程爱好者的收藏品。
  Demo源码:  local-markdown-editor(https://gitee.com/throwableDoge/local-markdown-editor)

许巍水木年华点燃气氛,博越X激情上市为热爱而来没有什么能够阻挡,你对自由的向往以音乐之名,为热爱相聚。10月10日,美丽的三亚沙滩,夜场,吉利博越X在一场嗨翻全场的音乐节中自由上市,新车标配1。8TD7DCT动力组合,涵盖4款竺延风隔空加油打气,岚图FREE销量破千首战告捷引言一路走来,有艰辛有质疑,但也感受和收获了太多的温暖。卢放坦言,这让我们更加的感恩时代热爱生活,我们将继续坚守初心,为用户提供更好的产品与服务因为YQ反弹等不可控因素,推迟了两个周杰伦代言力荐,MARVELR实力强大到没朋友?时代在巨变,经典依旧是经典。如果你去问8090后的两代人,哪位歌手对他们的影响最大记忆最深,我想大多数人的答案会高度一致周杰伦。从双节棍到园游会,从听妈妈的话到青花瓷,杰伦早已经不618月影家居玩大了,张继科即刻送五菱宏光MINI马卡龙买灯送网红车?!最近,全铜灯饰全国销量第一的知名品牌月影灯饰在其官方微博上发布的一则活动,吸引了众多网友的注意。活动显示,6月18日2000,奥运冠军张继科将以月影家居星推官的身份海尔烟灶套装,帮你轻松避开伤害皮肤的油烟对于爱做菜的人来说,烹饪美食理应是件开心的事,可偏偏遇上了油烟。不管油烟机的吸力多大,总感觉会有部分油烟偷偷跑出来,直接就往脸上冲。日积月累之后,毛孔堵塞肤色暗沉等皮肤问题接踵而来不到百元,国产小众耳机评测,还有ANC降噪算法加持耳机作为日常生活中常用的3C配件,它的成长发展一直以来都备受人们的关注。智能手机为了自身防水性纤薄性的需求,3。5mm耳机孔逐渐退出人们的视野,与此同时,无线耳机开始了它的全面进攻用牛鞭效应解释,全球芯荒后,为何即将迎来一波倒闭热潮?三线发烧友,吃瓜在一线。全球芯荒的寒冬过后,芯片厂商将迎来一波倒闭热潮。近两年,在IT行业,相信大家听得最多的就是缺芯的问题,尤其是在2019年第四季度到2020年上半年,因疫情原尹同跃当年挺身力保,贾亚权将带领奇瑞汽车开挂?引言和贾亚权一样,李海港的资历也很老,二人皆是1996年前后进入这个行业,贾起步于长城,李起步于神龙,也都是非常具有代表性的车企。他俩都堪称汽车媒体界的老熟人。明年北京车展上,奇瑞佛教四大名山四大石窟四大名刹中国佛教四大名山分别是安徽九华山山西五台山浙江普陀山四川峨眉山,分别是地藏王菩萨文殊菩萨观世音菩萨普贤菩萨的道场。四大名山随印度佛教的传入,自中国汉朝开始建寺庙修道场,延续至今。四中国古代酷刑凌迟中国古代各种残酷的刑罚中,最惨无人道的莫过于凌迟。凌迟,原来写作陵迟,本意指山丘的缓延的斜坡。荀子说三尺之岸,而虚车不能登也。百仞之山,任负车登焉。何则?陵迟故也。意思是指,三名花十二客宋代张敏叔以十二花为十二客,各赋诗一首。从此以后,十二客即成为画家画题。特别是中国南宗的国画家常以此题作画。牡丹贵客赏客,梅花清客,菊花寿客,瑞香佳客,丁香素客,兰花幽客,莲花静客
联想没有柳传志能发展到今天成为PC世界第一吗?组装电脑世界第一多,关键是卖给国外很便宜,所以全世界其他各国都喜欢买。便宜了就不容易赚钱,怎么办,以两倍价卖给国内,何况前些年机关统一采购,市场在国内,量大得很,不就赚了。而其他电拥有一台真正的千元机是种怎样的体验?感谢邀请拥有一台真正的千元机是种怎样的体验?题主问题的核心是拥有一台真正的千元机是种怎么样的体验?我觉得你算是问对人了,因为我平时使用就是千元机当做备用,而且还有一款主力机型。不过我用的手机是国产华为和红米,感觉越来越好了有朋友看我换了新手机,还会问一句,为啥又换个红米了,苹果的也降价了,你又不是买不起,哈,我觉得不是钱的问题,我一般会调侃一句我是爱国民族主义者,哈哈!其实爱国是真的赤子心,但是我爱俄罗斯人帮华为突破了3G而土耳其人帮华为占领了5G当一些老人到了77岁时,如果会用智能手机聊天,我们会觉得他很厉害了。而77岁的任正非,还在大风大浪中引领着华为奋勇前进,不得不说,任总真的很辛苦。而我今日想说的,正是任正非的远见,首发4nm芯片,华为的劣势越来越大,芯片行业或将迎来洗牌众所周知,目前芯片行业中的巨头企业总共也就几家,分别是苹果华为高通和联发科。其中,苹果是整个行业的带头大哥,A系列芯片一直是行业天花板,而高通凭借着小米OV等企业遥遥领先市场,5G国产厂商纷纷官宣骁龙8新机网友就差魅族了每一次高通带来新的旗舰处理器,各大手机厂商都会随着出一波官宣搭载该处理器的新机消息,即使拿不到首发权和首批机型的名头,也能沾一波新旗舰的热度,今天的新一代骁龙8也不例外。随着高通官哪种助听器的清晰度最好?助听器的清晰度其实与本身的听损时间长短,耳鸣时间的长短,自己的言语识别能力,还有所选择助听器的性能都有一定的关系,可以到专业的验配中心去是试听,在做选择。助听器的清晰度直接影响到患为什么所有APP几乎都要访问手机通讯录,访问以后到底有什么用?大数据啊,窥探你的隐私,搜集信息呗。晚上你比较无聊孤单的时候,找网上的小妹妹和你聊天,越来越投入的时候,人家邀请你裸聊,你答应了,到那时候你就知道通讯录的好处了!第一个原因使用软件有人用真我手机吗?感觉怎么样?今年7月份买的红米note10pro,还可以,但阳光下或者偏一点角度就看不清,有时阳光下接电话手捂住也不行,后来看头条真我的视频,就抱着试试的心态买了q3pro,比红米少了nfc什家用宽带要选择多大速率的?我觉得选择当地宽带的主流带宽即可。或者是最低的。我们这就是200兆最低了,没有100了好像。前几年国家大力推行宽带网络建设。我本来办的3年的10兆的宽带,结果快到期的时候,居然已经5G手机芯片大战升级安卓阵营即将迈入4nm时代每经记者王晶每经编辑文多5G手机芯片战局烟硝再起。继联发科推出5G旗舰芯片天玑9000后不久,12月1日,芯片厂商高通(Qualcomm)也发布了采用4nm制程工艺的芯片产品骁龙8