/* * $Id$ * * Copyright 2006 Sun Microsystems, Inc., 4150 Network Circle, * Santa Clara, California 95054, U.S.A. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * */ package org.jdesktop.swingx.painter; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.util.logging.Logger; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.border.Border; import org.jdesktop.swingx.InteractiveTestCase; import org.jdesktop.swingx.JXFrame; import org.jdesktop.swingx.JXLabel; import org.jdesktop.swingx.action.AbstractActionExt; /** * Test to exposed known issues of <code>Painter</code>s. * * Ideally, there would be at least one failing test method per open * Issue in the issue tracker. Plus additional failing test methods for * not fully specified or not yet decided upon features/behavior. * * * @author Jeanette Winzenburg */ public class PainterIssues extends InteractiveTestCase { static Logger log = Logger.getAnonymousLogger(); public static void main(String args[]) { // setSystemLF(true); PainterIssues test = new PainterIssues(); try { test.runInteractiveTests(); // test.runInteractiveTests(".*Label.*"); } catch (Exception e) { System.err.println("exception when executing interactive tests:"); e.printStackTrace(); } } // ------------------ visual tests /** * JXLabel default foreground painter - share between labels. * Probably illegal :-) * IMHO not illegal and sometimes even desirable (Jan). * */ public void interactiveXLabelSharedDefaultForegroundPainter() { JComponent box = Box.createVerticalBox(); final JXLabel foreground = new JXLabel( "setup: compound - default and overlay "); ShapePainter shapePainter = new ShapePainter(); AlphaPainter<?> alpha = new AlphaPainter<Object>(); alpha.setAlpha(0.2f); alpha.setPainters(shapePainter); CompoundPainter<?> compound = new CompoundPainter<Object>(alpha, foreground .getForegroundPainter()); foreground.setForegroundPainter(compound); box.add(foreground); JXLabel shared = new JXLabel( "setup: shared compound of first label - this doesn't show up"); shared.setForegroundPainter(compound); box.add(shared); showInFrame(box, "shared foreground painters"); } /** * * paint doc relieves impl from restoring graphics. Who * is responsible for cleanup? * */ public void interactiveRestoreGraphics() { Border redLine = BorderFactory.createLineBorder(Color.RED, 3); final Painter<JComponent> permanentTranslate = new Painter<JComponent>() { public void paint(Graphics2D g, JComponent object, int width, int height) { g.translate(50, 0); } }; JLabel label = new JLabel() { @Override protected void paintComponent(Graphics g) { Graphics2D scratch = (Graphics2D) g.create(); try { permanentTranslate.paint(scratch, this, getWidth(), getHeight()); ui.paint(scratch, this); } finally { scratch.dispose(); } } }; label.setText("Painter: translated Graphics implement Painter"); label.setBorder(redLine); JLabel labelP = new JLabel("setup: painter with translate, no scratch") { /** * Illegal paintComponent - painter made permanent changes */ @Override protected void paintComponent(Graphics g) { permanentTranslate.paint((Graphics2D) g, this, getWidth(), getHeight()); super.paintComponent(g); } }; labelP.setBorder(redLine); final AbstractPainter<JComponent> painterAP = new AbstractPainter<JComponent>() { @Override protected void doPaint(Graphics2D g, JComponent component, int width, int height) { g.translate(50, 0); } }; JLabel labelAP = new JLabel() { @Override protected void paintComponent(Graphics g) { Graphics2D scratch = (Graphics2D) g.create(); try { painterAP.paint(scratch, this, getWidth(), getHeight()); ui.paint(scratch, this); } finally { scratch.dispose(); } } }; labelAP.setText("Painter: translated graphics subclass AbstractPainter"); labelAP.setBorder(redLine); JComponent box = Box.createVerticalBox(); box.add(label); box.add(labelAP); box.add(labelP); showInFrame(box, "unrestored graphics"); } /** * Style.None - use case? Always invisible? */ public void interactiveRenderingLabel() { JComponent box = Box.createVerticalBox(); final JXLabel label = new JXLabel("setup: ShapePainter with fillstyle none"); // fixed: NPE with null shape - but has default instead of null? final ShapePainter styleNone = new ShapePainter(); styleNone.setStyle(ShapePainter.Style.NONE); label.setBackgroundPainter(styleNone); box.add(label); final JXLabel label2 = new JXLabel("setup: default ShapePainter"); final ShapePainter painter = new ShapePainter(); label2.setBackgroundPainter(painter); box.add(label2); Action action = new AbstractActionExt("toggle painter visible") { public void actionPerformed(ActionEvent e) { styleNone.setVisible(!styleNone.isVisible()); painter.setVisible(!painter.isVisible()); label.repaint(); label2.repaint(); } }; JXFrame frame = wrapInFrame(box, "renderer label with shape painter - fillstyle none"); addAction(frame, action); frame.pack(); frame.setVisible(true); } }