import org.openscience.cdk.geometry.GeometryTools; import org.openscience.cdk.interfaces.IAtomContainer; import org.openscience.cdk.renderer.Renderer2D; import org.openscience.cdk.renderer.Renderer2DModel; import javax.swing.*; import java.awt.*; public class Renderer2DPanel extends JPanel { private static final long serialVersionUID = 1L; IAtomContainer molecule; boolean withHydrogen = true; Renderer2DModel r2dm; Renderer2D renderer; String title; public Renderer2DPanel() { } public Renderer2DPanel(IAtomContainer mol, IAtomContainer needle, int x, int y, boolean withHydrogen, String name) { this.title = name; r2dm = new Renderer2DModel(); renderer = new Renderer2D(r2dm); Dimension screenSize = new Dimension(x, y); setPreferredSize(screenSize); r2dm.setBackgroundDimension(screenSize); // make sure it is synched with the JPanel size setBackground(r2dm.getBackColor()); this.molecule = mol; this.withHydrogen = withHydrogen; try { r2dm.setDrawNumbers(false); r2dm.setUseAntiAliasing(true); r2dm.setColorAtomsByType(false); r2dm.setShowImplicitHydrogens(true); r2dm.setShowAromaticity(true); r2dm.setShowReactionBoxes(false); r2dm.setKekuleStructure(false); if (needle != null) { r2dm.setSelectedPartColor(Color.red); r2dm.setSelectedPart(needle); } GeometryTools.translateAllPositive(this.molecule); GeometryTools.scaleMolecule(this.molecule, getPreferredSize(), 0.9); GeometryTools.center(this.molecule, getPreferredSize()); } catch (Exception exc) { exc.printStackTrace(); } } public void paint(Graphics g) { super.paint(g); int gw = getParent().getWidth() / 2; int gh = getParent().getHeight(); Dimension newScreenSize = new Dimension(gw, gh); setPreferredSize(newScreenSize); r2dm.setBackgroundDimension(newScreenSize); GeometryTools.translateAllPositive(molecule); GeometryTools.center(molecule, getPreferredSize()); GeometryTools.scaleMolecule(molecule, getPreferredSize(), 0.9); renderer.paintMolecule(this.molecule, (Graphics2D) g, false, true); Rectangle rect = g.getClipBounds(); double w = getSize().width; double h = getSize().height; int paddingX = (int) (w * 0.015); int paddingY = (int) (h * 0.015); // draw the name ypos = (int) (h - paddingY - fontMetrics.getHeight()); g.drawString(title, xpos, ypos); } }