Howdy all, I need some help. Attached are a preliminary SVGLayoutManager and a test SVG GUI. The story so far:
Having become horribly bent out of shape with the pain of creating good-looking GUIs in Java, and being rather familiar with Batik, I decided to make a SVGLayoutManager -- a LayoutManager2 which sits on top of a JSVGComponent and places child components on top of specified SVG Elements, e.g.: svgCanvas.loadSVGDocument("file:myGUI.svg"); svgCanvas.add(new JButton("test"), "test_button_id"); from: <svg ...> <rect id="border" x="9" y="9" width="12" height="12" /> <rect id="test_button_id" x="10" y="10" width="10" height="10" /> </svg> So, here's the Issue: when the GVT tree first finishes rendering, everything's fine; but if I resize the component, how do I know that the layout needs to be rebuilt? Right now, I've overridden JSVGCanvas.paintComponent() to call 'doLayout()'. Obviously this is not an ideal solution. I've tried adding GVTTreeBuilderListeners and GVTTreeRendererListeners and GVTComponentListeners, all to no avail. And if I let the system call 'doLayout()' on its own, it calls it /before/ the transforms are changed -- i.e., the child components get sized to what they should have been /before/ the resize. Any suggestions? Thanks! Ciao, Bibek
/* * Created on Mar 28, 2004 * * To change the template for this generated file go to * Window - Preferences - Java - Code Generation - Code and Comments */ package org.globalcircle; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.LayoutManager2; import java.awt.Rectangle; import java.awt.geom.Dimension2D; import javax.swing.*; import org.w3c.dom.*; import org.apache.batik.gvt.*; import org.apache.batik.swing.*; import org.apache.batik.swing.svg.*; /** * @author bibek * * To change the template for this generated type comment go to * Window - Preferences - Java - Code Generation - Code and Comments */ public class SVGLayoutManager implements LayoutManager2 { private final static Dimension EMPTY_SIZE = new Dimension(0, 0); private final static Dimension MAXIMUM_SIZE = new Dimension(20000, 20000); /* (non-Javadoc) * @see java.awt.LayoutManager2#getLayoutAlignmentX(java.awt.Container) */ public float getLayoutAlignmentX(Container arg0) { // TODO Auto-generated method stub System.out.println("getLayoutAlignmentX"); return 0; } /* (non-Javadoc) * @see java.awt.LayoutManager2#getLayoutAlignmentY(java.awt.Container) */ public float getLayoutAlignmentY(Container arg0) { // TODO Auto-generated method stub System.out.println("getLayoutAlignmentY"); return 0; } /* (non-Javadoc) * @see java.awt.LayoutManager2#invalidateLayout(java.awt.Container) */ public void invalidateLayout(Container arg0) { // TODO Auto-generated method stub System.out.println("invalidateLayout"); } /* (non-Javadoc) * @see java.awt.LayoutManager2#maximumLayoutSize(java.awt.Container) */ public Dimension maximumLayoutSize(Container arg0) { // TODO Auto-generated method stub System.out.println("maximumLayoutSize"); return MAXIMUM_SIZE; } /* (non-Javadoc) * @see java.awt.LayoutManager2#addLayoutComponent(java.awt.Component, java.lang.Object) */ public void addLayoutComponent(Component component, Object constraints) { // TODO Auto-generated method stub System.out.println("addLayoutComponent"); component.setName((String) constraints); } /* (non-Javadoc) * @see java.awt.LayoutManager#removeLayoutComponent(java.awt.Component) */ public void removeLayoutComponent(Component arg0) { // TODO Auto-generated method stub System.out.println("removeLayoutComponent"); } /* (non-Javadoc) * @see java.awt.LayoutManager#layoutContainer(java.awt.Container) */ public void layoutContainer(Container container) { // TODO Auto-generated method stub System.out.println("layoutContainer"); JSVGComponent svgComponent = (JSVGComponent) container; if(svgComponent.getSVGDocument() != null) { for(int i=svgComponent.getComponentCount(); i > 0; --i) { Component childComponent = svgComponent.getComponent(i-1); Element elem = svgComponent.getSVGDocument().getElementById(childComponent.getName()); GraphicsNode gn = svgComponent.getUpdateManager().getBridgeContext().getGraphicsNode(elem); System.out.println("layoutContainer: elem=" + elem + "; gn=" + gn); if(gn != null) { Rectangle transformedBounds = gn.getGlobalTransform().createTransformedShape(gn.getBounds()).getBounds(); System.out.println("layoutContainer: transformedBounds = " + transformedBounds); childComponent.setBounds(transformedBounds); } } } } /* (non-Javadoc) * @see java.awt.LayoutManager#addLayoutComponent(java.lang.String, java.awt.Component) */ public void addLayoutComponent(String constraints, Component component) { // TODO Auto-generated method stub System.out.println("addLayoutComponent"); component.setName((String) constraints); } /* (non-Javadoc) * @see java.awt.LayoutManager#minimumLayoutSize(java.awt.Container) */ public Dimension minimumLayoutSize(Container arg0) { // TODO Auto-generated method stub System.out.println("minimumLayoutSize"); return EMPTY_SIZE; } /* (non-Javadoc) * @see java.awt.LayoutManager#preferredLayoutSize(java.awt.Container) */ public Dimension preferredLayoutSize(Container container) { // TODO Auto-generated method stub System.out.println("preferredLayoutSize"); JSVGComponent comp = (JSVGComponent) container; Dimension2D size = comp.getSVGDocumentSize(); if(size != null) return new Dimension((int)size.getWidth(), (int)size.getHeight()); // can't figure out size; return empty-size (0, 0). return EMPTY_SIZE; } public static void main(String[] args) { final JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JSVGCanvas canvas = new JSVGCanvas() { public void paintComponent(Graphics g) { super.paintComponent(g); doLayout(); } }; canvas.setLayout(new SVGLayoutManager()); canvas.add(new JButton("save"), "save_button"); // canvas.add(new JButton("new"), "New_Lesson"); frame.setContentPane(canvas); canvas.addGVTTreeBuilderListener(new GVTTreeBuilderAdapter() { public void gvtBuildCompleted(GVTTreeBuilderEvent e) { System.out.println("GVT Build Complete."); frame.pack(); } }); canvas.loadSVGDocument("file:NorthPanel.svg"); frame.setVisible(true); } }
<<attachment: NorthPanel.svg>>
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]