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

基于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)

OPPO在ChinaJoy上搭建个超玩岛,EVA系列领衔IoT智能家族亮相往年在ChinaJoy上,我们最熟悉的或许就是ShowGirl和各种游戏展台,不过从去年开始,手机厂商也陆续加入了CJ的行列。比如OPPO,去年我们看到了OPPOReno系列的新品爱上星辰迷幻黑,徕声AT200无线蓝牙耳机,享受酷炫好音乐从互联网到移动互联网,从有线到无线,人们的追求一直朝着实用简单的方向发展。减少线材的束缚,自由自在,就连传统的充电方式都被颠覆,各种无线充电的形式受到青睐。而作为手机必备的配件之一使用近30年,蓝底白字92式车牌即将拜拜?还记得某一年春晚小品里的一句台词人这辈子怎么这么多的证,我不相信这么多的证,证明不了我的身份!。那么今天我们就来说说汽车的身份证车牌。现如今买车,钱不是问题,问题是需要有证明身份的华硕更新旧处理器Win11BIOS可以支持KabyLake了按照目前已知的信息,Windows11将会在10月份正式上线,但是在这之前的一个月或者说9月份就会冻结推出厂商(RTM)版本,因此理论上Windows11的实际正式版时间其实就是下光线追踪和DLSS带来了什么变化?神秘岛重制版体验在1993年,CyanWorld发布了一款名为Myst(神秘岛)的电脑游戏,该游戏一经推出就大受追捧,在上个世纪90年代的美国非常风靡,属于电脑类游戏榜单首位常客,直到本世纪初才被Intel新任CEO只要钱管够,任何处理器都能帮你生产Intel今年走马上任的新CEOPatGelsinger日前在财务分析师会议上表示,Intel目前推行的IDM2。0策略里有名为Intel代工服务(IFS)集团的重要部门,该部门负AMD游戏卡是给游戏玩家的,不是给矿工的自从Zen微架构产品推出以后,AMD的营收彻底摆脱了过往的颓势,2020年营收达到了创纪录的97。63亿美元,今年或者说2021年的增长目标被设置为60,这意味着155亿美元,考虑十一换个方式约朋友开黑广州VES电竞酒店探店临近十一黄金周,但是由于疫情的缘故,可能还是得窝在广州比较靠谱,但是如果你和我一样不想就这样把黄金周蹲没的话,不妨来和我一样,约上三五知己到这家电竞酒店一起开黑。这次应朋友邀请前往本地同城服务红利,抖音商家玩法大揭秘市场创造需求,商业满足需求。本地生活服务作为同城吃喝玩乐,餐饮美食机票预订酒店预订演出票务通讯充值等服务的全覆盖商业模式,一直是互联网巨头们争夺的主要战场。电商短视频直播,增加了人实体商家抖音营销,如何有效变现?短视频直播平台是近几年不可忽视的营销渠道,每个生意人都想通过这个渠道红利为自己的企业产品添砖加瓦。现阶段的视播营销,紧紧围绕着电商行业展开,对于实体商家和线下企业的作用微乎其微。实小程序不是APP的附属品,它的价值不止引流距离5月20日微信正式停止小程序打开APP技术服务已经过去一周的时间,大部分利用小程序引流的商家从平台发布信息到现在一直处于焦虑的状态。小程序不能打开APP,看似只是少了一个接口,