Alas, neither JXLayer nor JXTransformer do work properly.

To get an idea what I mean by "do not work properly" try the below test 
program. If the scaling-factor (at the begin of "ZoomPanelUI") is set to 1.0, 
things work OK, if I change it to e.g. 0.5 then part of the content is not 
drawn, elements disappear and reappear almost at random while hovering with the 
mouse over it and it is not possible to click the intended button. 

With JXTransformer I get similar effects and - strange enough - the same 

Exception in thread "AWT-EventQueue-1" java.lang.InternalError: Win32OSSD_Lock 
cannot nest locks

that I reported already for JGUI (my second append).
Seems to be trickier than I ever thought, this generic ZoomPanel.... :-(

Michael


PS.: my little test program. It draws a couple of buttons and connects two of 
them with a red line (just to test the drawing).


package test;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

import org.jdesktop.jxlayer.JXLayer;
import org.jdesktop.jxlayer.plaf.AbstractLayerUI;
import javax.swing.JApplet;

@SuppressWarnings("serial")
public class Test extends JApplet
{
        private JPanel viewer;
        private ArrayList<JButton> buttons = new ArrayList<JButton>();
        private Container mainPanel;
        
        @Override
        public void init() {
                this.mainPanel = getContentPane();
                this.mainPanel.setLayout(new BorderLayout());
                
                this.setLayout(new BorderLayout());
                
                this.viewer = new JPanel()
                {
                        @Override
                public void paint(final Graphics g) {
                                super.paint(g);
                                addConnections(g);
                        }
                };
                this.viewer.setLayout(new GridLayout(4,4));
                for (int i = 0; i < 16; i++) {
                        JButton button = new JButton("button " + i) {
                                {
                                        this.addActionListener(new 
ActionListener()
                                        {
                                        @Override
                                        public void actionPerformed(ActionEvent 
e) {
                                                System.out.println(getText() + 
" pressed");
                                        }                       
                                        });
                                }
                                
                        };
                        this.buttons.add(button);
                        this.viewer.add(button);
                }

                JXLayer<JComponent> zoomPanel = new 
JXLayer<JComponent>(this.viewer, new ZoomPanelUI<JComponent>());
                
                this.mainPanel.add(new JScrollPane(zoomPanel,
                                                   
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                                                   
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED),
                                   BorderLayout.CENTER);
        }
        
        void addConnections(final Graphics g) {
                JButton b1 = this.buttons.get(4);
                JButton b2 = this.buttons.get(11);
                
                Point l1 = b1.getLocation();
                Dimension s1 = b1.getSize();
                
                Point l2 = b2.getLocation();
                Dimension s2 = b2.getSize();            
                g.setColor(Color.RED);
                g.drawLine(l1.x + s1.width/2, 
                           l1.y + s1.height/2, 
                           l2.x + s2.width/2, 
                           l2.y + s2.height/2);
        }
        
        @Override
        public void start() {
                // empty
        }
        
        static class ZoomPanelUI<V extends JComponent> extends 
AbstractLayerUI<V>
        {
                private double scalingFactor = 1.0; // works
                // private double scalingFactor = 0.5; // does not work...
                
                /**
                 * @return the scalingFactor
                 */
                double getScalingFactor() {
                        return this.scalingFactor;
                }
                
                /**
                 * @param scalingFactor the scalingFactor to set
                 */
                void setScalingFactor(double scalingFactor) {
                        this.scalingFactor = scalingFactor;
                }
                
                // override paintLayer(), not paint()
                @Override
                protected void paintLayer(Graphics2D g2, JXLayer<V> layer) {
                        java.awt.geom.AffineTransform backup = 
g2.getTransform();
                        try {
                                g2.scale(this.scalingFactor, 
this.scalingFactor);
                                super.paintLayer(g2, layer);
                        } finally {
                                g2.setTransform(backup);
                        }
                }
                
                // catch MouseEvents:
                @Override
                protected void processMouseMotionEvent(final MouseEvent e,
                                                       final JXLayer<V> layer) {
                        translateMouseLocation(e);
                        super.processMouseMotionEvent(e, layer);
                }
                
                @Override
                protected void processMouseEvent(final MouseEvent e,
                                                 final JXLayer<V> layer) {
                        translateMouseLocation(e);
                        super.processMouseEvent(e, layer);
                }
                
                @Override
                protected void processMouseWheelEvent(final MouseWheelEvent e,
                                                      JXLayer<V> layer) {
                        translateMouseLocation(e);
                        super.processMouseWheelEvent(e, layer);
                }
                
                private void translateMouseLocation(final MouseEvent e) {
                        final Point p = e.getPoint();
                        p.setLocation((int)(p.x / this.scalingFactor),
                                      (int)(p.y / this.scalingFactor));
                }
        }
}
[Message sent by forum member 'mmo18' (mmo18)]

http://forums.java.net/jive/thread.jspa?messageID=292710

===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA2D-INTEREST".  For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".

Reply via email to