All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ch.randelshofer.quaqua.QuaquaToolBarUI Maven / Gradle / Ivy

Go to download

A Mavenisation of the Quaqua Mac OSX Swing Look and Feel (Java library) Quaqua Look and Feel (C) 2003-2010, Werner Randelshofer. Mavenisation by Matt Gumbley, DevZendo.org - for problems with Mavenisation, see Matt; for issues with Quaqua, see the Quaqua home page. For full license details, see http://randelshofer.ch/quaqua/license.html

The newest version!
/*
 * @(#)QuaquaToolBarUI.java  
 *
 * Copyright (c) 2004-2010 Werner Randelshofer, Immensee, Switzerland.
 * All rights reserved.
 *
 * You may not use, copy or modify this file, except in compliance with the
 * license agreement you entered into with Werner Randelshofer.
 * For details see accompanying license terms.
 */
package ch.randelshofer.quaqua;

import ch.randelshofer.quaqua.border.BackgroundBorder;
import ch.randelshofer.quaqua.util.*;
import ch.randelshofer.quaqua.border.BackgroundBorderUIResource;
import ch.randelshofer.quaqua.color.PaintableColor;
import java.awt.*;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.plaf.*;
import javax.swing.plaf.basic.*;
import java.util.*;
import javax.swing.event.MouseInputListener;

/**
 * QuaquaToolBarUI.
 *
 * @author  Werner Randelshofer
 * @version $Id: QuaquaToolBarUI.java 361 2010-11-21 11:19:20Z wrandelshofer $
 */
public class QuaquaToolBarUI extends BasicToolBarUI {
    // Rollover button implementation.

    private final static String IS_ROLLOVER = "JToolBar.isRollover";
    /*private*/ final static String TOOLBAR_DRAW_DIVIDER_PROPERTY = "Quaqua.ToolBar.isDividerDrawn";
    public final static String TOOLBAR_STYLE_PROPERTY = "Quaqua.ToolBar.style";
    private static Border rolloverBorder;
    private static Border nonRolloverBorder;
    private static Border nonRolloverToggleBorder;
    private HashMap borderTable = new HashMap();
    private Hashtable rolloverTable = new Hashtable();
    private Handler handler;
    private Point dragWindowOffset = null;
    private Container dockingSource;
    private boolean floating;
    private RootPaneContainer floatingToolBar;
    private int floatingX;
    private int floatingY;
    protected DragWindow0 dragWindow0;
    private int dockingSensitivity = 0;

    public static ComponentUI createUI(JComponent c) {
        return new QuaquaToolBarUI();
    }

    @Override
    public void installUI(JComponent c) {
        super.installUI(c);

        // Initialize instance vars
        dockingSensitivity = 0;
        floating = false;
        floatingX = floatingY = 0;
        floatingToolBar = null;
    }

    @Override
    public void uninstallUI(JComponent c) {
        super.uninstallUI(c);
        dragWindow0 = null;
        dockingSource = null;
        floatingToolBar = null;
    }

    @Override
    protected void installDefaults() {
        if (rolloverBorder == null) {
            rolloverBorder = createRolloverBorder();
        }
        if (nonRolloverBorder == null) {
            nonRolloverBorder = createNonRolloverBorder();
        }
        if (nonRolloverToggleBorder == null) {
            nonRolloverToggleBorder = createNonRolloverToggleBorder();
        }
        super.installDefaults();

        // The toolbar is not opaque, because its background color may have
        // an alpha channel.
        QuaquaUtilities.installProperty(toolBar, "opaque", UIManager.get("ToolBar.opaque"));
    }

    private Handler getHandler() {
        if (handler == null) {
            handler = new Handler();
        }
        return handler;
    }

    @Override
    protected ContainerListener createToolBarContListener() {
        return getHandler();
    }

    @Override
    protected FocusListener createToolBarFocusListener() {
        return getHandler();
    }

    @Override
    protected PropertyChangeListener createPropertyListener() {
        return getHandler();
    }

    @Override
    protected MouseInputListener createDockingListener() {
        getHandler().tb = toolBar;
        return getHandler();
    }

    @Override
    protected WindowListener createFrameListener() {
        return new FrameListener();
    }

    @Override
    public void paint(Graphics gr, JComponent c) {
        if (c.isOpaque()) {
            Graphics2D g = (Graphics2D) gr;
            if (c.getBorder() instanceof BackgroundBorder) {
                Border bb = ((BackgroundBorder) c.getBorder()).getBackgroundBorder();
                bb.paintBorder(c, g, 0, 0, c.getWidth(), c.getHeight());
            } else {
                g.setPaint(PaintableColor.getPaint(c.getBackground(), c));
                g.fillRect(0, 0, c.getWidth(), c.getHeight());
            }
        }
    }

    /**
     * Paints the contents of the window used for dragging.
     *
     * @param g Graphics to paint to.
     * @throws NullPointerException is g is null
     * @since 1.5
     */
    @Override
    protected void paintDragWindow(Graphics g) {
        int w = dragWindow0.getWidth();
        int h = dragWindow0.getHeight();

        g.setColor(dragWindow0.getBackground());
        g.fillRect(0, 0, w, h);

        Graphics g2 = g.create();
        toolBar.paint(g2);
        g2.dispose();

        g.setColor(dragWindow0.getBorderColor());
        g.drawRect(0, 0, w - 1, h - 1);
    }

    /**
     * Creates a window which contains the toolbar after it has been
     * dragged out from its container
     * @return a RootPaneContainer object, containing the toolbar.
     */
    @Override
    protected RootPaneContainer createFloatingWindow(JToolBar toolbar) {
        class ToolBarDialog extends JDialog {

            public ToolBarDialog(Frame owner, String title, boolean modal) {
                super(owner, title, modal);
            }

            public ToolBarDialog(Dialog owner, String title, boolean modal) {
                super(owner, title, modal);
            }

            // Override createRootPane() to automatically resize
            // the frame when contents change
            @Override
            protected JRootPane createRootPane() {
                JRootPane rootPane = new JRootPane() {

                    private boolean packing = false;

                    @Override
                    public void validate() {
                        putClientProperty(
                                "Quaqua.RootPane.isVertical",
                                toolBar.getOrientation() == JToolBar.VERTICAL ? Boolean.FALSE : Boolean.TRUE);
                        super.validate();
                        if (!packing) {
                            packing = true;
                            pack();
                            packing = false;
                        }
                    }
                };
                rootPane.setFont(UIManager.getFont("ToolBar.titleFont"));
                rootPane.putClientProperty("Quaqua.RootPane.isPalette", Boolean.TRUE);
                //rootPane.setOpaque(true);
                QuaquaUtilities.installProperty(rootPane, "opaque", Boolean.TRUE);
                return rootPane;
            }
        }

        JDialog dialog;
        Window window = SwingUtilities.getWindowAncestor(toolbar);
        if (window instanceof Frame) {
            dialog = new ToolBarDialog((Frame) window, toolbar.getName(), false);
        } else if (window instanceof Dialog) {
            dialog = new ToolBarDialog((Dialog) window, toolbar.getName(), false);
        } else {
            dialog = new ToolBarDialog((Frame) null, toolbar.getName(), false);
        }

        try {
            Methods.invoke(dialog, "setUndecorated", true);
            Methods.invoke(dialog.getRootPane(), "setWindowDecorationStyle", 1);//JRootPane.FRAME);
        } catch (NoSuchMethodException e) {
            // Empty
        }

        dialog.setTitle(toolbar.getName());
        dialog.setResizable(false);
        WindowListener wl = createFrameListener();
        dialog.addWindowListener(wl);

        //RootPaneContainer dialog = super.createFloatingWindow(toolbar);
        dialog.getRootPane().putClientProperty("JDialog.isPalette", Boolean.TRUE);
        dialog.getRootPane().putClientProperty("JFrame.isPalette", Boolean.TRUE);
        dialog.getRootPane().putClientProperty("Dialog.isPalette", Boolean.TRUE);
        dialog.getRootPane().putClientProperty("Frame.isPalette", Boolean.TRUE);
        dialog.getRootPane().putClientProperty("JWindow.isPalette", Boolean.TRUE);
        dialog.getRootPane().putClientProperty("Window.isPalette", Boolean.TRUE);

        return dialog;
    }

    /**
     * Creates a rollover border for toolbar components. The 
     * rollover border will be installed if rollover borders are 
     * enabled. 
     * 

* Override this method to provide an alternate rollover border. * * @since 1.4 */ @Override protected Border createRolloverBorder() { return new BackgroundBorderUIResource(new QuaquaButtonBorder("toolBarRollover")); } /** * Creates the non rollover border for toolbar components. This * border will be installed as the border for components added * to the toolbar if rollover borders are not enabled. *

* Override this method to provide an alternate rollover border. * * @since 1.4 */ @Override protected Border createNonRolloverBorder() { return new BackgroundBorderUIResource(new QuaquaButtonBorder("toolBar")); } /** * Creates a non rollover border for Toggle buttons in the toolbar. */ private Border createNonRolloverToggleBorder() { return new BackgroundBorderUIResource(new QuaquaButtonBorder("toolBar")); } protected DragWindow0 createDragWindow0(JToolBar toolbar) { Window frame = null; if (toolBar != null) { Container p; for (p = toolBar.getParent(); p != null && !(p instanceof Window); p = p.getParent()); if (p != null) { frame = (Window) p; } } if (floatingToolBar == null) { floatingToolBar = createFloatingWindow(toolBar); } if (floatingToolBar instanceof Window) { frame = (Window) floatingToolBar; } DragWindow0 dragW = new DragWindow0(frame); JRootPane rp = dragW.getRootPane(); rp.putClientProperty("Window.alpha", new Float(0.5f)); return dragW; } /** * Sets the border of the component to have a rollover border which * was created by createRolloverBorder. * * @param c component which will have a rollover border installed * @see #createRolloverBorder * @since 1.4 */ @Override protected void setBorderToRollover(Component c) { if (c instanceof AbstractButton) { AbstractButton b = (AbstractButton) c; Border border = (Border) borderTable.get(b); if (border == null || border instanceof UIResource) { borderTable.put(b, b.getBorder()); } // Only set the border if its the default border if (b.getBorder() instanceof UIResource) { b.setBorder(rolloverBorder); } rolloverTable.put(b, b.isRolloverEnabled() ? Boolean.TRUE : Boolean.FALSE); b.setRolloverEnabled(true); } } /** * Sets the border of the component to have a non-rollover border which * was created by createNonRolloverBorder. * * @param c component which will have a non-rollover border installed * @see #createNonRolloverBorder * @since 1.4 */ @Override protected void setBorderToNonRollover(Component c) { if (c instanceof AbstractButton) { AbstractButton b = (AbstractButton) c; Border border = (Border) borderTable.get(b); if (border == null || border instanceof UIResource) { borderTable.put(b, b.getBorder()); } // Only set the border if its the default border if (b.getBorder() instanceof UIResource) { if (b instanceof JToggleButton) { ((JToggleButton) b).setBorder(nonRolloverToggleBorder); } else { b.setBorder(nonRolloverBorder); } } rolloverTable.put(b, b.isRolloverEnabled() ? Boolean.TRUE : Boolean.FALSE); b.setRolloverEnabled(false); } } /** * Sets the border of the component to have a normal border. * A normal border is the original border that was installed on the child * component before it was added to the toolbar. * * @param c component which will have a normal border re-installed * @see #createNonRolloverBorder * @since 1.4 */ @Override protected void setBorderToNormal(Component c) { if (c instanceof AbstractButton) { AbstractButton b = (AbstractButton) c; Border border = (Border) borderTable.remove(b); b.setBorder(border); Boolean value = (Boolean) rolloverTable.remove(b); if (value != null) { b.setRolloverEnabled(value.booleanValue()); } } } @Override public void setFloatingLocation(int x, int y) { floatingX = x; floatingY = y; } @Override public boolean isFloating() { return floating; } @Override public void setFloating(boolean b, Point p) { if (toolBar.isFloatable() == true) { if (dragWindow0 != null) { dragWindow0.setVisible(false); } this.floating = b; if (b == true) { if (dockingSource == null) { dockingSource = toolBar.getParent(); dockingSource.remove(toolBar); } constraintBeforeFloating = calculateConstraint(); if (propertyListener != null) { UIManager.addPropertyChangeListener(propertyListener); } if (floatingToolBar == null) { floatingToolBar = createFloatingWindow(toolBar); } floatingToolBar.getContentPane().add(toolBar, BorderLayout.CENTER); if (floatingToolBar instanceof Window) { ((Window) floatingToolBar).pack(); } if (floatingToolBar instanceof Window) { ((Window) floatingToolBar).setLocation(floatingX, floatingY); } if (floatingToolBar instanceof Window) { ((Window) floatingToolBar).setVisible(true); } } else { if (floatingToolBar == null) { floatingToolBar = createFloatingWindow(toolBar); } if (floatingToolBar instanceof Window) { ((Window) floatingToolBar).setVisible(false); } floatingToolBar.getContentPane().remove(toolBar); String constraint = getDockingConstraint(dockingSource, p); if (constraint == null) { constraint = BorderLayout.NORTH; } int orientation = mapConstraintToOrientation(constraint); setOrientation(orientation); if (dockingSource == null) { dockingSource = toolBar.getParent(); } if (propertyListener != null) { UIManager.removePropertyChangeListener(propertyListener); } dockingSource.add(constraint, toolBar); } dockingSource.invalidate(); Container dockingSourceParent = dockingSource.getParent(); if (dockingSourceParent != null) { dockingSourceParent.validate(); } dockingSource.repaint(); } } private String getDockingConstraint(Component c, Point p) { if (p == null) { return constraintBeforeFloating; } if (c.contains(p)) { dockingSensitivity = (toolBar.getOrientation() == JToolBar.HORIZONTAL) ? toolBar.getSize().height : toolBar.getSize().width; // North (Base distance on height for now!) if (p.y < dockingSensitivity && !isBlocked(c, BorderLayout.NORTH)) { return BorderLayout.NORTH; } // East (Base distance on height for now!) if (p.x >= c.getWidth() - dockingSensitivity && !isBlocked(c, BorderLayout.EAST)) { return BorderLayout.EAST; } // West (Base distance on height for now!) if (p.x < dockingSensitivity && !isBlocked(c, BorderLayout.WEST)) { return BorderLayout.WEST; } if (p.y >= c.getHeight() - dockingSensitivity && !isBlocked(c, BorderLayout.SOUTH)) { return BorderLayout.SOUTH; } } return null; } private boolean isBlocked(Component comp, Object constraint) { if (comp instanceof Container) { Container cont = (Container) comp; LayoutManager lm = cont.getLayout(); if (lm instanceof BorderLayout) { BorderLayout blm = (BorderLayout) lm; Component c = null; try { c = (Component) Methods.invoke(blm, "getLayoutComponent", new Class[]{Container.class, Object.class}, new Object[]{cont, constraint}); } catch (Throwable ex) { //ex.printStackTrace(); } return (c != null && c != toolBar); } } return false; } @Override protected void dragTo(Point position, Point origin) { if (toolBar.isFloatable() == true) { try { if (dragWindow0 == null) { dragWindow0 = createDragWindow0(toolBar); } Point offset = dragWindow0.getOffset(); if (offset == null) { Dimension size = toolBar.getPreferredSize(); offset = new Point(size.width / 2, size.height / 2); dragWindow0.setOffset(offset); } Point global = new Point(origin.x + position.x, origin.y + position.y); Point dragPoint = new Point(global.x - offset.x, global.y - offset.y); if (dockingSource == null) { dockingSource = toolBar.getParent(); } constraintBeforeFloating = calculateConstraint(); Point dockingPosition = dockingSource.getLocationOnScreen(); Point comparisonPoint = new Point(global.x - dockingPosition.x, global.y - dockingPosition.y); if (canDock(dockingSource, comparisonPoint)) { dragWindow0.setBackground(getDockingColor()); String constraint = getDockingConstraint(dockingSource, comparisonPoint); int orientation = mapConstraintToOrientation(constraint); dragWindow0.setOrientation(orientation); dragWindow0.setBorderColor(dockingBorderColor); } else { dragWindow0.setBackground(getFloatingColor()); dragWindow0.setBorderColor(floatingBorderColor); } dragWindow0.setLocation(dragPoint.x, dragPoint.y); if (dragWindow0.isVisible() == false) { Dimension size = toolBar.getPreferredSize(); dragWindow0.setSize(size.width, size.height); dragWindow0.setVisible(true); } } catch (IllegalComponentStateException e) { } } else if (isDragMovesWindow()) { // Dragging the unified toolbar drags the window Window ancestorWindow = SwingUtilities.getWindowAncestor(toolBar); if (ancestorWindow != null) { if (dragWindowOffset == null) { dragWindowOffset = new Point(position); } Point loc = ancestorWindow.getLocation(); ancestorWindow.setLocation(loc.x + position.x - dragWindowOffset.x, loc.y + position.y - dragWindowOffset.y); } } } @Override protected void floatAt(Point position, Point origin) { if (toolBar.isFloatable() == true) { try { Point offset = dragWindow0.getOffset(); if (offset == null) { offset = position; dragWindow0.setOffset(offset); } Point global = new Point(origin.x + position.x, origin.y + position.y); setFloatingLocation(global.x - offset.x, global.y - offset.y); if (dockingSource != null) { Point dockingPosition = dockingSource.getLocationOnScreen(); Point comparisonPoint = new Point(global.x - dockingPosition.x, global.y - dockingPosition.y); if (canDock(dockingSource, comparisonPoint)) { setFloating(false, comparisonPoint); } else { setFloating(true, null); } } else { setFloating(true, null); } dragWindow0.setOffset(null); } catch (IllegalComponentStateException e) { } } } private int mapConstraintToOrientation(String constraint) { int orientation = toolBar.getOrientation(); if (constraint != null) { if (constraint.equals(BorderLayout.EAST) || constraint.equals(BorderLayout.WEST)) { orientation = JToolBar.VERTICAL; } else if (constraint.equals(BorderLayout.NORTH) || constraint.equals(BorderLayout.SOUTH)) { orientation = JToolBar.HORIZONTAL; } } return orientation; } @Override public void setOrientation(int orientation) { toolBar.setOrientation(orientation); if (dragWindow0 != null) { dragWindow0.setOrientation(orientation); } } private String calculateConstraint() { String constraint = null; LayoutManager lm = dockingSource.getLayout(); if (lm instanceof BorderLayout) { BorderLayout bl = (BorderLayout) lm; try { constraint = (String) Methods.invoke(bl, "getConstraints", new Class[]{Component.class}, new Object[]{toolBar}); } catch (Throwable ex) { // Suppress silently //ex.printStackTrace(); } } return (constraint != null) ? constraint : constraintBeforeFloating; } /** Returns true, if the parent window shall be moved, when the mouse * is dragged over the toolbar. */ private boolean isDragMovesWindow() { Object toolBarStyle = toolBar.getClientProperty(TOOLBAR_STYLE_PROPERTY); if (toolBarStyle == null) { JRootPane rootPane = SwingUtilities.getRootPane(toolBar); int xOffset = 0, yOffset = 0; for (Component c = toolBar; c != rootPane; c = c.getParent()) { xOffset += c.getX(); yOffset += c.getY(); } toolBarStyle = (yOffset == 0) ? "title" : "plain"; } if (UIManager.getBoolean("ToolBar.textured.dragMovesWindow")) { boolean isTextured = QuaquaUtilities.isOnTexturedWindow(toolBar); return (isTextured && (toolBarStyle.equals("title")) || toolBarStyle.equals("bottom")); } else { return false; } } private class Handler implements ContainerListener, FocusListener, MouseInputListener, PropertyChangeListener { // // ContainerListener // public void componentAdded(ContainerEvent evt) { Component c = evt.getChild(); if (toolBarFocusListener != null) { c.addFocusListener(toolBarFocusListener); } if (isRolloverBorders()) { setBorderToRollover(c); } else { setBorderToNonRollover(c); } } public void componentRemoved(ContainerEvent evt) { Component c = evt.getChild(); if (toolBarFocusListener != null) { c.removeFocusListener(toolBarFocusListener); } // Revert the button border setBorderToNormal(c); } // // FocusListener // public void focusGained(FocusEvent evt) { Component c = evt.getComponent(); focusedCompIndex = toolBar.getComponentIndex(c); } public void focusLost(FocusEvent evt) { } // // MouseInputListener (DockingListener) // JToolBar tb; boolean isDragging = false; Point origin = null; public void mousePressed(MouseEvent evt) { if (!tb.isEnabled()) { return; } isDragging = false; dragWindowOffset = null; } public void mouseReleased(MouseEvent evt) { if (!tb.isEnabled()) { return; } if (isDragging == true) { Point position = evt.getPoint(); if (origin == null) { origin = evt.getComponent().getLocationOnScreen(); } floatAt(position, origin); } origin = null; isDragging = false; dragWindowOffset = null; } public void mouseDragged(MouseEvent evt) { if (!tb.isEnabled()) { return; } isDragging = true; Point position = evt.getPoint(); if (origin == null) { origin = evt.getComponent().getLocationOnScreen(); } dragTo(position, origin); } public void mouseClicked(MouseEvent evt) { } public void mouseEntered(MouseEvent evt) { } public void mouseExited(MouseEvent evt) { } public void mouseMoved(MouseEvent evt) { } // // PropertyChangeListener // public void propertyChange(PropertyChangeEvent evt) { String propertyName = evt.getPropertyName(); if (propertyName != null && propertyName.equals("Frame.active")) { toolBar.repaint(); } else if (propertyName != null && propertyName.equals("lookAndFeel")) { toolBar.updateUI(); } else if (propertyName != null && propertyName.equals("orientation")) { // Search for JSeparator components and change it's orientation // to match the toolbar and flip it's orientation. Component[] components = toolBar.getComponents(); int orientation = ((Integer) evt.getNewValue()).intValue(); JToolBar.Separator separator; for (int i = 0; i < components.length; ++i) { if (components[i] instanceof JToolBar.Separator) { separator = (JToolBar.Separator) components[i]; if ((orientation == JToolBar.HORIZONTAL)) { separator.setOrientation(JSeparator.VERTICAL); } else { separator.setOrientation(JSeparator.HORIZONTAL); } Dimension size = separator.getSeparatorSize(); if (size != null && size.width != size.height) { // Flip the orientation. Dimension newSize = new Dimension(size.height, size.width); separator.setSeparatorSize(newSize); } } } } else if (propertyName != null && propertyName.equals(IS_ROLLOVER)) { installNormalBorders(toolBar); setRolloverBorders(((Boolean) evt.getNewValue()).booleanValue()); } } } protected class FrameListener extends WindowAdapter { @Override public void windowClosing(WindowEvent w) { if (toolBar.isFloatable() == true) { if (dragWindow0 != null) { dragWindow0.setVisible(false); } floating = false; if (floatingToolBar == null) { floatingToolBar = createFloatingWindow(toolBar); } if (floatingToolBar instanceof Window) { ((Window) floatingToolBar).setVisible(false); } floatingToolBar.getContentPane().remove(toolBar); String constraint = constraintBeforeFloating; if (toolBar.getOrientation() == JToolBar.HORIZONTAL) { if (constraint == "West" || constraint == "East") { constraint = "North"; } } else { if (constraint == "North" || constraint == "South") { constraint = "West"; } } if (dockingSource == null) { dockingSource = toolBar.getParent(); } if (propertyListener != null) { UIManager.removePropertyChangeListener(propertyListener); } dockingSource.add(toolBar, constraint); dockingSource.invalidate(); Container dockingSourceParent = dockingSource.getParent(); if (dockingSourceParent != null) { dockingSourceParent.validate(); } dockingSource.repaint(); } } } protected class DragWindow0 extends JWindow { Color borderColor = Color.gray; int orientation = toolBar.getOrientation(); Point offset; // offset of the mouse cursor inside the DragWindow DragWindow0(Window w) { super(w); } public void setOrientation(int o) { if (isShowing()) { if (o == this.orientation) { return; } this.orientation = o; Dimension size = getSize(); setSize(new Dimension(size.height, size.width)); if (offset != null) { if (QuaquaUtilities.isLeftToRight(toolBar)) { setOffset(new Point(offset.y, offset.x)); } else if (o == JToolBar.HORIZONTAL) { setOffset(new Point(size.height - offset.y, offset.x)); } else { setOffset(new Point(offset.y, size.width - offset.x)); } } repaint(); } } public Point getOffset() { return offset; } public void setOffset(Point p) { this.offset = p; } public void setBorderColor(Color c) { if (this.borderColor == c) { return; } this.borderColor = c; repaint(); } public Color getBorderColor() { return this.borderColor; } @Override public void paint(Graphics g) { paintDragWindow(g); // Paint the children super.paint(g); } @Override public Insets getInsets() { return new Insets(1, 1, 1, 1); } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy