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".