{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "chem-bla-ics",
  "description": "Chemblaics (pronounced chem-bla-ics) is the science that uses open science and computers to solve problems in chemistry, biochemistry and related fields.",
  "home_page_url": "https://chem-bla-ics.linkedchemistry.info/",
  "feed_url": "https://chem-bla-ics.linkedchemistry.info/2010/04/18/cdk-jchempaint-4-embedding-renderer.json",
  "icon": "https://chem-bla-ics.linkedchemistry.info/assets/images/chem-bla-ics_logo.png",
  "language": "en",
  "authors": [
    {
      "name": "Egon Willighagen",
      "url": "https://orcid.org/0000-0001-7542-0286",
      "_orcid": "0000-0001-7542-0286"
    }
  ],
  "items": [

    {
      "id": "https://doi.org/10.59350/2148c-n1102",
      "url": "https://chem-bla-ics.linkedchemistry.info/2010/04/18/cdk-jchempaint-4-embedding-renderer.html",
      "title": "CDK-JChemPaint #4: embedding the renderer into a Swing panel",
      "content_html": "<p>Now that we covered the utmost basics of using the CDK-JChemPaint patch (see\n<a href=\"https://chem-bla-ics.linkedchemistry.info/2010/04/05/cdk-jchempaint-1-rendering-molecules.html\">#1 <i class=\"fa-solid fa-recycle fa-xs\"></i></a>,\n<a href=\"https://chem-bla-ics.linkedchemistry.info/2010/04/05/cdk-jchempaint-2-rendering-reactions.html\">#2 <i class=\"fa-solid fa-recycle fa-xs\"></i></a>,\n<a href=\"https://chem-bla-ics.linkedchemistry.info/2010/04/05/cdk-jchempaint-3-rendering-parameters.html\">#3 <i class=\"fa-solid fa-recycle fa-xs\"></i></a>),\nit is time to move on. I am happy to hear that so many people have started using the new rendering architecture, either\nvia the EBI JChemPaint Swing applet/application branch, or via the CDK-JChemPaint patch.</p>\n\n<p>A couple of issues and questions came up (scaling not working as expected; how to layout reactions; how to get charges\nto show up), and I will look at those shortly. But before I get into those matters, I’ll first show how to use the renderer\nwith a <a href=\"http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JPanel.html\">Swing JPanel</a>\n(I’ll do the SWT alternative later). First, we need to subclass the JPanel:</p>\n\n<div class=\"language-java highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kd\">class</span> <span class=\"nc\">JCPPanel</span> <span class=\"kd\">extends</span> <span class=\"nc\">JPanel</span> <span class=\"o\">{</span>\n\n  <span class=\"nc\">IMolecule</span> <span class=\"n\">mol</span><span class=\"o\">;</span>\n  <span class=\"nc\">AtomContainerRenderer</span> <span class=\"n\">renderer</span><span class=\"o\">;</span>\n  <span class=\"kt\">int</span> <span class=\"n\">width</span><span class=\"o\">;</span>\n  <span class=\"kt\">int</span> <span class=\"n\">height</span><span class=\"o\">;</span>\n\n  <span class=\"kd\">public</span> <span class=\"nf\">JCPPanel</span><span class=\"o\">(</span><span class=\"nc\">IMolecule</span> <span class=\"n\">mol</span><span class=\"o\">,</span> <span class=\"kt\">int</span> <span class=\"n\">width</span><span class=\"o\">,</span> <span class=\"kt\">int</span> <span class=\"n\">height</span><span class=\"o\">)</span> <span class=\"o\">{</span>\n    <span class=\"kd\">super</span><span class=\"o\">();</span>\n    <span class=\"k\">this</span><span class=\"o\">.</span><span class=\"na\">setSize</span><span class=\"o\">(</span><span class=\"n\">width</span><span class=\"o\">,</span> <span class=\"n\">height</span><span class=\"o\">);</span>\n    <span class=\"k\">this</span><span class=\"o\">.</span><span class=\"na\">mol</span> <span class=\"o\">=</span> <span class=\"n\">mol</span><span class=\"o\">;</span>\n    <span class=\"k\">this</span><span class=\"o\">.</span><span class=\"na\">width</span> <span class=\"o\">=</span> <span class=\"n\">width</span><span class=\"o\">;</span>\n    <span class=\"k\">this</span><span class=\"o\">.</span><span class=\"na\">height</span> <span class=\"o\">=</span> <span class=\"n\">height</span><span class=\"o\">;</span>\n\n    <span class=\"c1\">// generators make the image elements</span>\n    <span class=\"nc\">List</span> <span class=\"n\">generators</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nc\">ArrayList</span><span class=\"o\">();</span>\n    <span class=\"n\">generators</span><span class=\"o\">.</span><span class=\"na\">add</span><span class=\"o\">(</span><span class=\"k\">new</span> <span class=\"nc\">BasicSceneGenerator</span><span class=\"o\">());</span>\n    <span class=\"n\">generators</span><span class=\"o\">.</span><span class=\"na\">add</span><span class=\"o\">(</span><span class=\"k\">new</span> <span class=\"nc\">BasicBondGenerator</span><span class=\"o\">());</span>\n    <span class=\"n\">generators</span><span class=\"o\">.</span><span class=\"na\">add</span><span class=\"o\">(</span><span class=\"k\">new</span> <span class=\"nc\">BasicAtomGenerator</span><span class=\"o\">());</span>\n\n    <span class=\"c1\">// the renderer needs to have a toolkit-specific font manager</span>\n    <span class=\"n\">renderer</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nc\">AtomContainerRenderer</span><span class=\"o\">(</span>\n      <span class=\"n\">generators</span><span class=\"o\">,</span> <span class=\"k\">new</span> <span class=\"nc\">AWTFontManager</span><span class=\"o\">()</span>\n    <span class=\"o\">);</span>\n  <span class=\"o\">}</span>\n\n  <span class=\"kd\">public</span> <span class=\"nc\">Dimension</span> <span class=\"nf\">getPreferredSize</span><span class=\"o\">()</span> <span class=\"o\">{</span>\n    <span class=\"k\">return</span> <span class=\"k\">new</span> <span class=\"nf\">Dimension</span><span class=\"o\">(</span><span class=\"n\">width</span><span class=\"o\">,</span> <span class=\"n\">height</span><span class=\"o\">);</span>\n  <span class=\"o\">}</span>\n\n  <span class=\"kd\">public</span> <span class=\"kt\">void</span> <span class=\"nf\">paint</span><span class=\"o\">(</span><span class=\"nc\">Graphics</span> <span class=\"n\">graphics</span><span class=\"o\">)</span> <span class=\"o\">{</span>\n    <span class=\"c1\">// the call to 'setup' only needs to be done on the first paint</span>\n    <span class=\"n\">renderer</span><span class=\"o\">.</span><span class=\"na\">setup</span><span class=\"o\">(</span><span class=\"n\">mol</span><span class=\"o\">,</span> <span class=\"k\">new</span> <span class=\"nc\">Rectangle</span><span class=\"o\">(</span><span class=\"n\">getWidth</span><span class=\"o\">(),</span> <span class=\"n\">getHeight</span><span class=\"o\">()));</span>\n\n    <span class=\"c1\">// paint the background</span>\n    <span class=\"n\">graphics</span><span class=\"o\">.</span><span class=\"na\">setColor</span><span class=\"o\">(</span><span class=\"nc\">Color</span><span class=\"o\">.</span><span class=\"na\">WHITE</span><span class=\"o\">);</span>\n    <span class=\"n\">graphics</span><span class=\"o\">.</span><span class=\"na\">fillRect</span><span class=\"o\">(</span><span class=\"mi\">0</span><span class=\"o\">,</span> <span class=\"mi\">0</span><span class=\"o\">,</span> <span class=\"n\">getWidth</span><span class=\"o\">(),</span> <span class=\"n\">getHeight</span><span class=\"o\">());</span>\n\n    <span class=\"c1\">// the paint method also needs a toolkit-specific renderer</span>\n    <span class=\"n\">renderer</span><span class=\"o\">.</span><span class=\"na\">paint</span><span class=\"o\">(</span><span class=\"n\">mol</span><span class=\"o\">,</span> <span class=\"k\">new</span> <span class=\"nc\">AWTDrawVisitor</span><span class=\"o\">(</span><span class=\"n\">graphics</span><span class=\"o\">));</span>\n  <span class=\"o\">}</span>\n\n<span class=\"o\">}</span>\n</code></pre></div></div>\n\n<p>The panel does not implement resizing, and it could consider caching the image too, to speed things up a bit. But, we’ll use this as a starting point.</p>\n\n<p>We can then embed this panel into a JFrame to make a small runable application:</p>\n\n<div class=\"language-java highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kt\">int</span> <span class=\"no\">WIDTH</span> <span class=\"o\">=</span> <span class=\"mi\">600</span><span class=\"o\">;</span>\n<span class=\"kt\">int</span> <span class=\"no\">HEIGHT</span> <span class=\"o\">=</span> <span class=\"mi\">600</span><span class=\"o\">;</span>\n\n<span class=\"c1\">// create molecule</span>\n<span class=\"nc\">IMolecule</span> <span class=\"n\">triazole</span> <span class=\"o\">=</span> <span class=\"nc\">MoleculeFactory</span><span class=\"o\">.</span><span class=\"na\">make123Triazole</span><span class=\"o\">();</span>\n<span class=\"nc\">StructureDiagramGenerator</span> <span class=\"n\">sdg</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nc\">StructureDiagramGenerator</span><span class=\"o\">();</span>\n<span class=\"n\">sdg</span><span class=\"o\">.</span><span class=\"na\">setMolecule</span><span class=\"o\">(</span><span class=\"n\">triazole</span><span class=\"o\">);</span>\n<span class=\"n\">sdg</span><span class=\"o\">.</span><span class=\"na\">generateCoordinates</span><span class=\"o\">();</span>\n<span class=\"n\">triazole</span> <span class=\"o\">=</span> <span class=\"n\">sdg</span><span class=\"o\">.</span><span class=\"na\">getMolecule</span><span class=\"o\">();</span>\n\n<span class=\"c1\">// create the frame</span>\n<span class=\"nc\">JFrame</span> <span class=\"n\">frame</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nc\">JFrame</span><span class=\"o\">(</span><span class=\"s\">\"Swinging CDK-JChemPaint\"</span><span class=\"o\">);</span>\n<span class=\"n\">frame</span><span class=\"o\">.</span><span class=\"na\">setDefaultCloseOperation</span><span class=\"o\">(</span><span class=\"nc\">JFrame</span><span class=\"o\">.</span><span class=\"na\">EXIT_ON_CLOSE</span><span class=\"o\">);</span>\n\n<span class=\"nc\">JCPPanel</span> <span class=\"n\">panel</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nc\">JCPPanel</span><span class=\"o\">(</span><span class=\"n\">triazole</span><span class=\"o\">,</span> <span class=\"no\">WIDTH</span><span class=\"o\">,</span> <span class=\"no\">HEIGHT</span><span class=\"o\">);</span>\n<span class=\"n\">frame</span><span class=\"o\">.</span><span class=\"na\">getContentPane</span><span class=\"o\">().</span><span class=\"na\">add</span><span class=\"o\">(</span><span class=\"n\">panel</span><span class=\"o\">);</span>\n\n<span class=\"n\">frame</span><span class=\"o\">.</span><span class=\"na\">pack</span><span class=\"o\">();</span>\n<span class=\"n\">frame</span><span class=\"o\">.</span><span class=\"na\">setVisible</span><span class=\"o\">(</span><span class=\"kc\">true</span><span class=\"o\">);</span>\n</code></pre></div></div>\n\n<p>The result is pretty much the same as with the created PNG, just with a window. But, this should get you started with using the new code base in your\nSwing-based application. If you need an impression on where this can get you, have a look at the\n<a href=\"http://www.ebi.ac.uk/steinbeck-srv/jchempaint-nightly/EditorApplet.html\">applet developed by Chris’ team</a>. Likewise, a SWT-based application can be\ndeveloped, of which <a href=\"http://wiki.bioclipse.net/index.php?title=JChemPaint\">Bioclipse</a> is a full example. This shows one of the features of this\nnew JChemPaint code base: it is widget set-independent. I am not aware of applications using other widget toolkits yet, though, but I am still\nhoping someone will use <a href=\"http://qt.nokia.com/doc/qtjambi-4.4/html/com/trolltech/qt/qtjambi-index.html\">QtJambi</a> to create a Qt-based JChemPaint port.</p>",
      "summary": "Now that we covered the utmost basics of using the CDK-JChemPaint patch (see #1 , #2 , #3 ), it is time to move on. I am happy to hear that so many people have started using the new rendering architecture, either via the EBI JChemPaint Swing applet/application branch, or via the CDK-JChemPaint patch.",
      
      "date_published": "2010-04-18T00:10:00+00:00",
      "date_modified": "2026-07-17T00:00:00+00:00",
      "tags": ["cdk","jchempaint"],
      
      
      
      
      
      
        "authors": [ { "name": "Egon Willighagen", "url": "https://orcid.org/0000-0001-7542-0286" } ]
      
    }

  ]
}
