Java/2D Graphics GUI/Icon
Содержание
- 1 An empty icon with arbitrary width and height.
- 2 An icon for painting a square swatch of a specified Color.
- 3 Arrow Icon
- 4 A simple application to test the functionality of the OvalIcon class
- 5 Calendar Page icons with Weekday, Day and Month
- 6 Color Icon
- 7 Create a dynamic icon
- 8 Create Image Icon from PNG file
- 9 Creates a transparent icon.
- 10 Custom Icon Demo
- 11 Draw an Icon object
- 12 Example of an icon that changes form
- 13 Icon Codec
- 14 Icon Displayer
- 15 Icon Line
- 16 Implement the Icon interface
- 17 Layered Icon
- 18 MemImage is an in-memory icon showing a Color gradient
- 19 Plain Color Icon
- 20 Reading an Image or Icon from a File
- 21 Return a filled oval as an Icon
- 22 Transparent icon with no content
An empty icon with arbitrary width and height.
<source lang="java"> /**
* @PROJECT.FULLNAME@ @VERSION@ License. * * Copyright @YEAR@ L2FProd.ru * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */
import java.awt.ruponent; import java.awt.Graphics; import javax.swing.Icon; /**
* An empty icon with arbitrary width and height. */
public final class EmptyIcon implements Icon {
private int width; private int height; public EmptyIcon() { this(0, 0); } public EmptyIcon(int width, int height) { this.width = width; this.height = height; } public int getIconHeight() { return height; } public int getIconWidth() { return width; } public void paintIcon(Component c, Graphics g, int x, int y) { }
}
</source>
An icon for painting a square swatch of a specified Color.
<source lang="java"> /*
* ColorSwatch.java * 2007-03-03 */
//cb.aloe.decor; import java.awt.Color; import java.awt.ruponent; import java.awt.Graphics; import javax.swing.Icon; /**
* An icon for painting a square swatch of a specified Color. * * @author Christopher Bach */
public class ColorSwatch implements Icon {
private Color ourSwatchColor = Color.white; private Color ourBorderColor = Color.black; private boolean ourBorderPainted = true; private boolean ourSwatchIsMultiColor = false; private boolean ourSwatchIsVoid = false; private int ourSwatchSize = 14; /** * Creates a standard 14 x 14 swatch with a black border and white background. */ public ColorSwatch() { } /** * Creates a swatch of the specified size with a black border and white * background. */ public ColorSwatch(int size) { setSwatchSize(size); } /** * Creates a swatch of the specified size with a black border and white * background and determines whether or n not the border should be painted. */ public ColorSwatch(int size, boolean borderPainted) { setSwatchSize(size); setBorderPainted(borderPainted); } /** * */ public ColorSwatch(Color color) { setColor(color); } /** * */ public ColorSwatch(int size, Color color) { setSwatchSize(size); setColor(color); } /** * */ public ColorSwatch(int size, Color color, Color borderColor) { setSwatchSize(size); setColor(color); setBorderColor(borderColor); setBorderPainted(true); } /** * Sets the size of this swatch. */ public void setSwatchSize(int size) { if (size > 0) ourSwatchSize = size; else ourSwatchSize = 14; } /** * Returns the size of this swatch. */ public int getSwatchSize() { return ourSwatchSize; } /** * Determines whether or not this swatch"s border should be painted. */ public void setBorderPainted(boolean borderPainted) { ourBorderPainted = borderPainted; } /** * Returns whether or not this swatch"s border is painted. */ public boolean isBorderPainted() { return ourBorderPainted; } /** * Sets the color of this swatch"s border. */ public void setBorderColor(Color color) { ourBorderColor = color; } /** * Returns the color of this swatch"s border. */ public Color getBorderColor() { return ourBorderColor; } /** * Sets the color that this swatch represents. */ public void setColor(Color color) { ourSwatchIsMultiColor = false; ourSwatchColor = color; } /** * Returns the color that this swatch represents. */ public Color getColor() { return ourSwatchColor; } /** * Sets this swatch to represent more than one color. */ public void setMultiColor() { ourSwatchIsMultiColor = true; } /** * Returns whether or not this swatch represents more than one color. */ public boolean isMultiColor() { return ourSwatchIsMultiColor; } /** * Determines whether or not this swatch is void. If the swatch is void, it * will not be painted at all. */ public void setVoid(boolean isVoid) { // When true, this icon will not be painted at all. ourSwatchIsVoid = isVoid; } /** * Returns whether this swatch is void. If the swatch is void, it will not be * painted at all. */ public boolean isVoid() { return ourSwatchIsVoid; } // // Icon implementation //// /** * Returns the width of this Icon. */ public int getIconWidth() { return ourSwatchSize; } /** * Returns the height of this Icon. */ public int getIconHeight() { return ourSwatchSize; } /** * Paints this Icon into the provided graphics context. */ public void paintIcon(Component c, Graphics g, int x, int y) { if (ourSwatchIsVoid) return; Color oldColor = g.getColor(); if (ourSwatchIsMultiColor) { g.setColor(Color.white); g.fillRect(x, y, ourSwatchSize, ourSwatchSize); g.setColor(ourBorderColor); for (int i = 0; i < ourSwatchSize; i += 2) { g.drawLine(x + i, y, x + i, y + ourSwatchSize); } } else if (ourSwatchColor != null) { g.setColor(ourSwatchColor); g.fillRect(x, y, ourSwatchSize, ourSwatchSize); } else { g.setColor(Color.white); g.fillRect(x, y, ourSwatchSize, ourSwatchSize); g.setColor(ourBorderColor); g.drawLine(x, y, x + ourSwatchSize, y + ourSwatchSize); g.drawLine(x, y + ourSwatchSize, x + ourSwatchSize, y); } if (ourBorderPainted) { g.setColor(ourBorderColor); g.drawRect(x, y, ourSwatchSize, ourSwatchSize); } g.setColor(oldColor); }
}
</source>
Arrow Icon
<source lang="java"> /*
* jMemorize - Learning made easy (and fun) - A Leitner flashcards tool * Copyright(C) 2004-2008 Riad Djemili and contributors * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 1, or (at your option) * any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
import java.awt.Color; import java.awt.ruponent; import java.awt.Graphics; import javax.swing.Icon; /**
* @author djemili */
public class Arrow implements Icon {
private boolean descending; private int size; public Arrow(boolean descending, int size) { this.descending = descending; this.size = size; } public void paintIcon(Component c, Graphics g, int x, int y) { Color color = c == null ? Color.GRAY : c.getBackground(); int dx = (int)(size / 2); int dy = descending ? dx : -dx; // Align icon (roughly) with font baseline. y = y + 5 * size / 6 + (descending ? -dy : 0); g.translate(x, y); g.setColor(Color.GRAY); g.fillPolygon(new int[]{dx/2, dx, 0}, new int[]{dy, 0, 0}, 3); g.translate(-x, -y); g.setColor(color); } public int getIconWidth() { return size; } public int getIconHeight() { return size; }
}
</source>
A simple application to test the functionality of the OvalIcon class
<source lang="java"> import java.awt.ruponent; import java.awt.Container; import java.awt.FlowLayout; import java.awt.Graphics; import javax.swing.Icon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.SwingConstants; public class TestOval {
public static void main(String[] args) { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel label1 = new JLabel(new OvalIcon(20, 50)); JLabel label2 = new JLabel(new OvalIcon(50, 20)); JLabel label3 = new JLabel("Round!", new OvalIcon(60, 60), SwingConstants.CENTER); label3.setHorizontalTextPosition(SwingConstants.CENTER); Container c = f.getContentPane(); c.setLayout(new FlowLayout()); c.add(label1); c.add(label2); c.add(label3); f.pack(); f.setVisible(true); }
} class OvalIcon implements Icon {
private int width, height; public OvalIcon(int w, int h) { width = w; height = h; } public void paintIcon(Component c, Graphics g, int x, int y) { g.drawOval(x, y, width - 1, height - 1); } public int getIconWidth() { return width; } public int getIconHeight() { return height; }
}
</source>
Calendar Page icons with Weekday, Day and Month
<source lang="java"> /*
* Copyright (c) Ian F. Darwin, http://www.darwinsys.ru/, 1996-2002. * All rights reserved. Software written by Ian F. Darwin and others. * $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $ * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS"" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Java, the Duke mascot, and all variants of Sun"s Java "steaming coffee * cup" logo are trademarks of Sun Microsystems. Sun"s, and James Gosling"s, * pioneering role in inventing and promulgating (and standardizing) the Java * language and environment is gratefully acknowledged. * * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&T, for * inventing predecessor languages C and C++ is also gratefully acknowledged. */
import java.awt.Color; import java.awt.ruponent; import java.awt.Container; import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.GridLayout; import java.text.DecimalFormat; import java.util.Calendar; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; /**
* Display one of those standard Calendar Page icons with Weekday, Day and * Month. Can be used as the Icon in a JButton. Can include or exclude an * updating Clock at the top (invoke constructor with value of true to include). * However, it should be excluded when using as an Icon, and true when using as * a Component. * * @author Ian Darwin, http://www.darwinsys.ru * @version $Id: CalIcon.java,v 1.3 2003/05/29 18:06:31 ian Exp $ */
public class CalIcon extends JComponent implements Icon {
/** The size shalle be 64x64. */ protected final int SIZE = 64; protected final Dimension d = new Dimension(SIZE, SIZE); /** The size of the inner white box */ protected final int RBW = 40, RBH = 40; /** The x location of the inner box */ protected final int RBX; /** The y location of the inner box */ protected final int RBY; /** Our Calendar */ protected Calendar myCal; /** True if user wants the time shown */ protected boolean showTime = true; /** The Clock to show the time, if showTime */ protected Clock clock; /** Font for displaying the time */ protected Font dayNumbFont; /** FontMetrics for displaying the time */ protected FontMetrics dayNumbFM; /** Font for displaying the time */ protected Font dayNameFont; /** FontMetrics for displaying the time */ protected FontMetrics dayNameFM; /** Font for displaying the time */ protected Font monNameFont; /** FontMetrics for displaying the time */ protected FontMetrics monNameFM; /** Construct the object with default arguments */ public CalIcon(boolean showT) { this(Calendar.getInstance(), showT); } /** Construct the object with a Calendar object */ public CalIcon(Calendar c, boolean showT) { super(); showTime = showT; myCal = c; setLayout(null); // we don"t need another layout, ... if (showTime) { // System.err.println("Constructing and adding Clock"); clock = new Clock(); add(clock); clock.setBounds(0, 2, SIZE, 10); // clock.setBackground(Color.black); // clock.setForeground(Color.green); RBY = d.height - (RBH + (showTime ? 12 : 0) / 2); } else { RBY = 6; } RBX = 12; // raised box x offset // System.err.println("RBX, RBY = " + RBX + "," + RBY); dayNumbFont = new Font("Serif", Font.BOLD, 20); dayNumbFM = getFontMetrics(dayNumbFont); dayNameFont = new Font("SansSerif", Font.PLAIN, 10); dayNameFM = getFontMetrics(dayNameFont); monNameFont = new Font("SansSerif", Font.ITALIC, 10); monNameFM = getFontMetrics(monNameFont); } /** Days of the week */ public String[] days = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" }; public String[] mons = { "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC", }; /** * Paint: draw the calendar page in the JComponent. Delegates most work to * paintIcon(). */ public void paint(Graphics g) { paintIcon(this, g, 0, 0); } /** paintIcon: draw the calendar page. */ public void paintIcon(Component c, Graphics g, int x, int y) { // Allow clock to get painted (voodoo magic) if (showTime) super.paint(g); // Outline it. g.setColor(Color.black); g.draw3DRect(x, y, d.width - 2, d.height - 2, true); // Show the date: First, a white page with a drop shadow. g.setColor(Color.gray); g.fillRect(x + RBX + 3, y + RBY + 3, RBW, RBH); g.setColor(Color.white); g.fillRect(x + RBX, y + RBY, RBW, RBH); // g.setColor(getForeground()); g.setColor(Color.black); String s = days[myCal.get(Calendar.DAY_OF_WEEK) - 1]; g.setFont(dayNameFont); int w = dayNameFM.stringWidth(s); g.drawString(s, x + RBX + ((RBW - w) / 2), y + RBY + 10); s = Integer.toString(myCal.get(Calendar.DAY_OF_MONTH)); g.setFont(dayNumbFont); w = dayNumbFM.stringWidth(s); g.drawString(s, x + RBX + ((RBW - w) / 2), y + RBY + 25); s = mons[myCal.get(Calendar.MONTH)]; g.setFont(monNameFont); w = monNameFM.stringWidth(s); g.drawString(s, x + RBX + ((RBW - w) / 2), y + RBY + 35); } public int getIconWidth() { return SIZE; } public int getIconHeight() { return SIZE; } public Dimension getPreferredSize() { return d; } public Dimension getMinimumSize() { return d; } public static void main(String[] args) { JFrame jf = new JFrame("Calendar"); Container cp = jf.getContentPane(); cp.setLayout(new GridLayout(0, 1, 5, 5)); CalIcon c = new CalIcon(true); cp.add(c); JButton j = new JButton("As Icon", new CalIcon(false)); cp.add(j); jf.pack(); jf.setVisible(true); }
} class Clock extends javax.swing.JComponent {
protected DecimalFormat tflz, tf; protected boolean done = false; public Clock() { new Thread(new Runnable() { public void run() { while (!done) { Clock.this.repaint(); // request a redraw try { Thread.sleep(1000); } catch (InterruptedException e){ /* do nothing*/ } } } }).start(); tf = new DecimalFormat("#0"); tflz = new DecimalFormat("00"); } public void stop() { done = true; } /* paint() - get current time and draw (centered) in Component. */ public void paint(Graphics g) { Calendar myCal = Calendar.getInstance(); StringBuffer sb = new StringBuffer(); sb.append(tf.format(myCal.get(Calendar.HOUR))); sb.append(":"); sb.append(tflz.format(myCal.get(Calendar.MINUTE))); sb.append(":"); sb.append(tflz.format(myCal.get(Calendar.SECOND))); String s = sb.toString(); FontMetrics fm = getFontMetrics(getFont()); int x = (getSize().width - fm.stringWidth(s))/2; // System.out.println("Size is " + getSize()); g.drawString(s, x, 10); } public Dimension getPreferredSize() { return new Dimension(100, 30); } public Dimension getMinimumSize() { return new Dimension(50, 10); }
}
</source>
Color Icon
<source lang="java"> // // // ColorIcon // // Copyright (C) by Andrea Carboni. // This file may be distributed under the terms of the LGPL license. //
import java.awt.Color; import java.awt.ruponent; import java.awt.Graphics; import java.awt.Insets; import javax.swing.Icon; // public class ColorIcon implements Icon {
private int iWidth; private int iHeight; private Color color; private Color border; private Insets insets; //--------------------------------------------------------------------------- public ColorIcon() { this(32, 16); } //--------------------------------------------------------------------------- public ColorIcon(int width, int height) { this(width, height, Color.black); } //--------------------------------------------------------------------------- public ColorIcon(int width, int height, Color c) { iWidth = width; iHeight = height; color = c; border = Color.black; insets = new Insets(1,1,1,1); } //--------------------------------------------------------------------------- public void setColor(Color c) { color = c; } //--------------------------------------------------------------------------- public Color getColor() { return color; } //--------------------------------------------------------------------------- public void setBorderColor(Color c) { border = c; } //--------------------------------------------------------------------------- //--- //--- Icon interface methods //--- //--------------------------------------------------------------------------- public int getIconWidth() { return iWidth; } //--------------------------------------------------------------------------- public int getIconHeight() { return iHeight; } //--------------------------------------------------------------------------- public void paintIcon(Component c, Graphics g, int x, int y) { g.setColor(border); g.drawRect(x,y,iWidth-1, iHeight-2); x += insets.left; y += insets.top; int w = iWidth - insets.left - insets.right; int h = iHeight - insets.top - insets.bottom -1; g.setColor(color); g.fillRect(x,y, w,h); }
}
</source>
Create a dynamic icon
<source lang="java"> import java.awt.BorderLayout; import java.awt.ruponent; import java.awt.Graphics; import javax.swing.Icon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JSlider; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener;
public class Main{
Icon icon = new DynamicIcon(); final JSlider width = new JSlider(JSlider.HORIZONTAL, 1, 150, 75); final JSlider height = new JSlider(JSlider.VERTICAL, 1, 150, 75); final JLabel dynamicLabel = new JLabel(icon); Main(){ Updater updater = new Updater(); width.addChangeListener(updater); height.addChangeListener(updater); JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(width, BorderLayout.NORTH); f.add(height, BorderLayout.WEST); f.add(dynamicLabel, BorderLayout.CENTER); f.setSize(210, 210); f.setVisible(true); } public static void main(String[] args) { new Main(); } class Updater implements ChangeListener { public void stateChanged(ChangeEvent ev) { dynamicLabel.repaint(); } } class DynamicIcon implements Icon { public int getIconWidth() { return width.getValue(); } public int getIconHeight() { return height.getValue(); } public void paintIcon(Component c, Graphics g, int x, int y) { g.fill3DRect(x, y, getIconWidth(), getIconHeight(), true); } }
}
</source>
Create Image Icon from PNG file
<source lang="java"> import java.awt.BorderLayout; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; public class PngIcon{
public PngIcon(){ JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JButton bt = new JButton(new ImageIcon("dtmail.png")); JLabel lab = new JLabel(new ImageIcon("dtterm.png")); bt.setFocusPainted(false); frame.add(bt, BorderLayout.NORTH); frame.add(lab, BorderLayout.SOUTH); frame.setBounds(50, 50, 200, 200); frame.setVisible(true); } public static void main(String[] args){ new PngIcon(); }
}
</source>
Creates a transparent icon.
<source lang="java">
import java.awt.image.BufferedImage; import java.util.Arrays; import javax.swing.Icon; import javax.swing.ImageIcon;
public final class ImageUtils {
/** * Creates a transparent image. These can be used for aligning menu items. * * @param width the width. * @param height the height. * @return the created transparent image. */ public static BufferedImage createTransparentImage (final int width, final int height) { return new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); } /** * Creates a transparent icon. The Icon can be used for aligning menu items. * * @param width the width of the new icon * @param height the height of the new icon * @return the created transparent icon. */ public static Icon createTransparentIcon (final int width, final int height) { return new ImageIcon(createTransparentImage(width, height)); }
}
</source>
Custom Icon Demo
<source lang="java"> /*
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * -Redistribution of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * -Redistribution in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Sun Microsystems, Inc. or the names of contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * * You acknowledge that this software is not designed, licensed or intended * for use in the design, construction, operation or maintenance of any * nuclear facility. */
import java.awt.BorderLayout; import java.awt.Color; import java.awt.ruponent; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.AbstractButton; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingConstants; public class CustomIconDemo extends JPanel implements ActionListener {
protected JButton b1, b2, b3; public CustomIconDemo() { Icon leftButtonIcon = new ArrowIcon(SwingConstants.RIGHT); Icon middleButtonIcon = new ImageIcon("images/middle.gif"); Icon rightButtonIcon = new ArrowIcon(SwingConstants.LEFT); b1 = new JButton("Disable middle button", leftButtonIcon); b1.setVerticalTextPosition(AbstractButton.CENTER); b1.setHorizontalTextPosition(AbstractButton.LEFT); b1.setMnemonic(KeyEvent.VK_D); b1.setActionCommand("disable"); b2 = new JButton("Middle button", middleButtonIcon); b2.setVerticalTextPosition(AbstractButton.BOTTOM); b2.setHorizontalTextPosition(AbstractButton.CENTER); b2.setMnemonic(KeyEvent.VK_M); b3 = new JButton("Enable middle button", rightButtonIcon); //Use the default text position of CENTER, RIGHT. b3.setMnemonic(KeyEvent.VK_E); b3.setActionCommand("enable"); b3.setEnabled(false); //Listen for actions on buttons 1 and 3. b1.addActionListener(this); b3.addActionListener(this); b1.setToolTipText("Click this button to disable the middle button."); b2.setToolTipText("This middle button does nothing when you click it."); b3.setToolTipText("Click this button to enable the middle button."); //Add Components to this container, using the default FlowLayout. add(b1); add(b2); add(b3); } public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("disable")) { b2.setEnabled(false); b1.setEnabled(false); b3.setEnabled(true); } else { b2.setEnabled(true); b1.setEnabled(true); b3.setEnabled(false); } } public static void main(String[] args) { JFrame frame = new JFrame("CustomIconDemo"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.getContentPane().add(new CustomIconDemo(), BorderLayout.CENTER); frame.pack(); frame.setVisible(true); }
} class ArrowIcon implements Icon, SwingConstants {
private int width = 9; private int height = 18; private int[] xPoints = new int[4]; private int[] yPoints = new int[4]; public ArrowIcon(int direction) { if (direction == LEFT) { xPoints[0] = width; yPoints[0] = -1; xPoints[1] = width; yPoints[1] = height; xPoints[2] = 0; yPoints[2] = height / 2; xPoints[3] = 0; yPoints[3] = height / 2 - 1; } else /* direction == RIGHT */{ xPoints[0] = 0; yPoints[0] = -1; xPoints[1] = 0; yPoints[1] = height; xPoints[2] = width; yPoints[2] = height / 2; xPoints[3] = width; yPoints[3] = height / 2 - 1; } } public int getIconHeight() { return height; } public int getIconWidth() { return width; } public void paintIcon(Component c, Graphics g, int x, int y) { int length = xPoints.length; int adjustedXPoints[] = new int[length]; int adjustedYPoints[] = new int[length]; for (int i = 0; i < length; i++) { adjustedXPoints[i] = xPoints[i] + x; adjustedYPoints[i] = yPoints[i] + y; } if (c.isEnabled()) { g.setColor(Color.black); } else { g.setColor(Color.gray); } g.fillPolygon(adjustedXPoints, adjustedYPoints, length); }
}
</source>
Draw an Icon object
<source lang="java"> import java.awt.Graphics; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JFrame; public class BasicDraw {
public static void main(String[] args) { JFrame frame = new JFrame(); frame.add(new MyComponent()); frame.setSize(300, 300); frame.setVisible(true); }
} class MyComponent extends JComponent {
public void paint(Graphics g) { ImageIcon icon = new ImageIcon("a.png"); int x = 0; int y = 100; icon.paintIcon(this, g, x, y); }
}
</source>
Example of an icon that changes form
<source lang="java"> import java.awt.BorderLayout; import java.awt.ruponent; import java.awt.Container; import java.awt.Graphics; import javax.swing.Icon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JSlider; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; public class DynamicIconExample {
public static void main(String[] args) { final JSlider width = new JSlider(JSlider.HORIZONTAL, 1, 150, 75); final JSlider height = new JSlider(JSlider.VERTICAL, 1, 150, 75); class DynamicIcon implements Icon { public int getIconWidth() { return width.getValue(); } public int getIconHeight() { return height.getValue(); } public void paintIcon(Component c, Graphics g, int x, int y) { g.fill3DRect(x, y, getIconWidth(), getIconHeight(), true); } } Icon icon = new DynamicIcon(); final JLabel dynamicLabel = new JLabel(icon); class Updater implements ChangeListener { public void stateChanged(ChangeEvent ev) { dynamicLabel.repaint(); } } Updater updater = new Updater(); width.addChangeListener(updater); height.addChangeListener(updater); JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = f.getContentPane(); c.setLayout(new BorderLayout()); c.add(width, BorderLayout.NORTH); c.add(height, BorderLayout.WEST); c.add(dynamicLabel, BorderLayout.CENTER); f.setSize(210, 210); f.setVisible(true); }
}
</source>
Icon Codec
<source lang="java"> /*
JSmooth: a VM wrapper toolkit for Windows Copyright (C) 2003 Rodrigo Reyes <reyes@charabia.net> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
import java.io.*; import java.awt.image.*; import java.awt.*; /**
* * @author Rodrigo Reyes */
public class IcoCodec {
static public class IconDir { int idType; int idCount; public IconDir(BinaryInputStream in) throws IOException { in.readUShortLE(); idType = in.readUShortLE(); idCount = in.readUShortLE(); } public String toString() { return "{ idType=" + idType + ", " + idCount + " }"; } } static public class IconEntry { short bWidth; short bHeight; short bColorCount; short bReserved; int wPlanes; int wBitCount; long dwBytesInRes; long dwImageOffset; public IconEntry(BinaryInputStream in) throws IOException { bWidth = in.readUByte(); bHeight = in.readUByte(); bColorCount = in.readUByte(); bReserved = in.readUByte(); wPlanes = in.readUShortLE(); wBitCount = in.readUShortLE(); dwBytesInRes = in.readUIntLE(); dwImageOffset = in.readUIntLE(); } public String toString() { StringBuffer buffer = new StringBuffer(); buffer.append("{ bWidth="+bWidth+"\n"); buffer.append(" bHeight="+bHeight+"\n"); buffer.append(" bColorCount="+bColorCount+"\n"); buffer.append(" wPlanes="+wPlanes+"\n"); buffer.append(" wBitCount="+wBitCount+"\n"); buffer.append(" dwBytesInRes="+dwBytesInRes+"\n"); buffer.append(" dwImageOffset="+dwImageOffset+"\n"); buffer.append("}"); return buffer.toString(); } } static public class IconHeader { public long Size; /* Size of this header in bytes DWORD 0*/ public long Width; /* Image width in pixels LONG 4*/ public long Height; /* Image height in pixels LONG 8*/ public int Planes; /* Number of color planes WORD 12 */ public int BitsPerPixel; /* Number of bits per pixel WORD 14 */ /* Fields added for Windows 3.x follow this line */ public long Compression; /* Compression methods used DWORD 16 */ public long SizeOfBitmap; /* Size of bitmap in bytes DWORD 20 */ public long HorzResolution; /* Horizontal resolution in pixels per meter LONG 24 */ public long VertResolution; /* Vertical resolution in pixels per meter LONG 28*/ public long ColorsUsed; /* Number of colors in the image DWORD 32 */ public long ColorsImportant; /* Minimum number of important colors DWORD 36 */ public IconHeader(BinaryInputStream in) throws IOException { Size = in.readUIntLE(); Width = in.readUIntLE(); Height = in.readUIntLE(); Planes = in.readUShortLE(); BitsPerPixel = in.readUShortLE(); Compression = in.readUIntLE(); SizeOfBitmap = in.readUIntLE(); HorzResolution = in.readUIntLE(); VertResolution = in.readUIntLE(); ColorsUsed = in.readUIntLE(); ColorsImportant = in.readUIntLE(); } public String toString() { StringBuffer buffer = new StringBuffer(); buffer.append("Size="); buffer.append(Size); buffer.append("\nWidth="); buffer.append(Width); buffer.append("\nHeight="); buffer.append(Height); buffer.append("\nPlanes="); buffer.append(Planes); buffer.append("\nBitsPerPixel="); buffer.append(BitsPerPixel); buffer.append("\nCompression="); buffer.append(Compression); buffer.append("\nSizeOfBitmap="); buffer.append(SizeOfBitmap); buffer.append("\nHorzResolution="); buffer.append(HorzResolution); buffer.append("\nVertResolution="); buffer.append(VertResolution); buffer.append("\nColorsUsed="); buffer.append(ColorsUsed); buffer.append("\nColorsImportant="); buffer.append(ColorsImportant); return buffer.toString(); } } static public BufferedImage[] loadImages(File f) throws IOException { InputStream istream = new FileInputStream(f); BufferedInputStream buffin = new BufferedInputStream(istream); BinaryInputStream in = new BinaryInputStream(buffin); try { in.mark(32000); IconDir dir = new IconDir(in); // System.out.println("DIR = " + dir); IconEntry[] entries = new IconEntry[dir.idCount]; BufferedImage[] images = new BufferedImage[dir.idCount]; for (int i=0; i<dir.idCount; i++) { entries[i] = new IconEntry(in); // System.out.println("ENTRY " + i + " = " + entries[i]); } IconEntry entry = entries[0]; // System.out.println("ENTRYx = " + entry); for (int i=0; i<dir.idCount; i++) { in.reset(); in.skip(entries[i].dwImageOffset); IconHeader header = new IconHeader(in); // System.out.println("Header: " + header); long toskip = header.Size - 40; if (toskip>0) in.skip((int)toskip); // System.out.println("skipped data"); BufferedImage image = new BufferedImage((int)header.Width, (int)header.Height/2, BufferedImage.TYPE_INT_ARGB); switch(header.BitsPerPixel) { case 4: case 8: loadPalettedImage(in, entries[i], header, image); break; default: throw new Exception("Unsupported ICO color depth: " + header.BitsPerPixel); } images[i] = image; } return images; } catch (Exception exc) { exc.printStackTrace(); } return null; } static private void loadPalettedImage(BinaryInputStream in, IconEntry entry, IconHeader header, BufferedImage image) throws Exception { // System.out.println("Loading image..."); // System.out.println("Loading palette..."); // // First, load the palette // int cols = (int)header.ColorsUsed; if (cols == 0) { if (entry.bColorCount != 0) cols = entry.bColorCount; else cols = 1 << header.BitsPerPixel; } int[] redp = new int[cols]; int[] greenp = new int[cols]; int[] bluep = new int[cols]; for (int i=0; i<cols; i++) { bluep[i] = in.readUByte(); greenp[i] = in.readUByte(); redp[i] = in.readUByte(); in.readUByte(); } // System.out.println("Palette read!"); // // Set the image int xorbytes = (((int)header.Height/2) * (int)header.Width); int readbytes = 0; for (int y=(int)(header.Height/2)-1; y>=0; y--) { for (int x=0; x<header.Width; x++) { switch(header.BitsPerPixel) { case 4: { int pix = in.readUByte(); readbytes++; int col1 = (pix>>4) & 0x0F; int col2 = pix & 0x0F; image.setRGB(x, y, (0xFF<<24) | (redp[col1]<<16) | (greenp[col1]<<8) | bluep[col1]); image.setRGB(++x, y, (0xFF<<24) | (redp[col2]<<16) | (greenp[col2]<<8) | bluep[col2]); } break; case 8: { int col1 = in.readUByte(); readbytes++; image.setRGB(x, y, (0xFF<<24) | (redp[col1]<<16) | (greenp[col1]<<8) | bluep[col1]); } break; } } } // System.out.println("XOR data read (" + readbytes + " bytes)"); int height = (int)(header.Height/2); int rowsize = (int)header.Width / 8; if ((rowsize%4)>0) { rowsize += 4 - (rowsize%4); } // System.out.println("rowsize = " + rowsize); int[] andbytes = new int[rowsize * height ]; for (int i=0; i<andbytes.length; i++) andbytes[i] = in.readUByte();
for (int y=height-1; y>=0; y--) { for (int x=0; x<header.Width; x++) { int offset = ((height - (y+1))*rowsize) + (x/8); if ( (andbytes[offset] & (1<<(7-x%8))) != 0) { image.setRGB(x, y, 0); } } } // for (int i=0; i<andbytes; i++) // { // int pix = in.readUByte(); // readbytes++; // int xb = (i*8) % (int)header.Width; // int yb = ((int)header.Height/2) - (((i*8) / (int)header.Width)+1); // for (int offset=7; offset>=0; offset--) // { // // // // Modify the transparency only if necessary // // // System.out.println("SET AND (" + xb + "," + yb + ")-" + (7-offset)); // if (((1<<offset) & pix)!=0) // { // int argb = image.getRGB(xb+(7-offset), yb); // image.setRGB(xb+(7-offset), yb, argb & 0xFFFFFF); // } // } // } // System.out.println("AND data read (" + readbytes + " bytes total)"); } static public void main(String[]args) throws Exception { File f = new File(args[0]); Image img = IcoCodec.loadImages(f)[0]; // System.out.println("img = " + img); javax.swing.JFrame jf = new javax.swing.JFrame("Test"); javax.swing.JButton button = new javax.swing.JButton(new javax.swing.ImageIcon(img)); jf.getContentPane().add(button); jf.pack(); jf.setVisible(true); }
} /* JSmooth: a VM wrapper toolkit for Windows Copyright (C) 2003 Rodrigo Reyes <reyes@charabia.net> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- /
class BinaryInputStream extends FilterInputStream {
public BinaryInputStream(InputStream in) {
super(in);
} public void skip(int toskip) throws IOException {
for (int skipped = 0; skipped >= toskip; skipped += in.skip(toskip - skipped))
; } public byte readByte() throws IOException {
return (byte)read();
} public short readUByte() throws IOException {
return (short)read();
} public short readShortBE() throws IOException {
int a = read(); int b = read(); return (short) (((a&0xff)<<8) | (b&0xff));
} public int readUShortBE() throws IOException {
int a = read(); int b = read(); return ((a&0xff)<<8) | (b&0xff);
} public short readShortLE() throws IOException {
int a = read(); int b = read(); return (short) (((b&0xff)<<8) | (a&0xff));
} public int readUShortLE() throws IOException {
int a = read(); int b = read(); return ((b&0xff)<<8) | (a&0xff);
} public int readIntBE() throws IOException {
int a = read(); int b = read(); int c = read(); int d = read(); return ((a&0xff)<<24) | ((b&0xff)<<16) | ((c&0xff)<<8) | (d&0xff);
} public long readUIntBE() throws IOException {
int a = read(); int b = read(); int c = read(); int d = read(); return (long)((a&0xff)<<24) | (long)((b&0xff)<<16) | (long)((c&0xff)<<8) | (long)(d&0xff);
} public int readIntLE() throws IOException {
int a = readByte(); int b = readByte(); int c = readByte(); int d = readByte(); return ((d&0xff)<<24) | ((c&0xff)<<16) | ((b&0xff)<<8) | (a&0xff);
} public long readUIntLE() throws IOException {
int a = readByte(); int b = readByte(); int c = readByte(); int d = readByte(); return (long)((d&0xff)<<24) | (long)((c&0xff)<<16) | (long)((b&0xff)<<8) | (long)(a&0xff);
}
}
</source>
Icon Displayer
<source lang="java"> /*
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * -Redistribution of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * -Redistribution in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Sun Microsystems, Inc. or the names of contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * * You acknowledge that this software is not designed, licensed or intended * for use in the design, construction, operation or maintenance of any * nuclear facility. */
/*
* IconDisplayer.java is a 1.4 application that requires the following files: * images/rocketship.gif */
import java.awt.AlphaComposite; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Insets; import java.awt.Rectangle; import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JFrame; /*
* This component displays a single icon one or more times in a row. The images * are right-aligned, with 5 pixels padding in between. All but the rightmost * image are mostly transparent. */
public class IconDisplayer extends JComponent {
private Icon icon; private int preferredNumImages = 2; private int pad = 5; //space between images private Rectangle iconRect = new Rectangle(); private Rectangle clipRect = new Rectangle(); public IconDisplayer(Icon icon, int preferredNumImages, int pad) { this.icon = icon; if (preferredNumImages > 0) { this.preferredNumImages = preferredNumImages; } if (pad >= 0) { this.pad = pad; } //Set a reasonable default border. if (this.pad > 0) { setBorder(BorderFactory.createEmptyBorder(this.pad, this.pad, this.pad, this.pad)); } } public Dimension getPreferredSize() { if (icon != null) { Insets insets = getInsets(); return new Dimension(icon.getIconWidth() * preferredNumImages + pad * (preferredNumImages - 1) + insets.left + insets.right, icon.getIconHeight() + insets.top + insets.bottom); } else { return new Dimension(100, 100); } } public Dimension getMinimumSize() { if (icon != null) { Insets insets = getInsets(); //Return enough space for one icon. return new Dimension(icon.getIconWidth() + insets.left + insets.right, icon.getIconHeight() + insets.top + insets.bottom); } else { return new Dimension(0, 0); } } protected void paintComponent(Graphics g) { if (isOpaque()) { //paint background g.setColor(getBackground()); g.fillRect(0, 0, getWidth(), getHeight()); } if (icon != null) { //Draw the icon over and over, right aligned. Insets insets = getInsets(); int iconWidth = icon.getIconWidth(); int iconX = getWidth() - insets.right - iconWidth; int iconY = insets.top; boolean faded = false; //Copy the Graphics object, which is actually //a Graphics2D object. Cast it so we can //set alpha composite. Graphics2D g2d = (Graphics2D) g.create(); //Draw the icons, starting from the right. //After the first one, the rest are faded. //We won"t bother painting icons that are clipped. g.getClipBounds(clipRect); while (iconX >= insets.left) { iconRect.setBounds(iconX, iconY, iconWidth, icon .getIconHeight()); if (iconRect.intersects(clipRect)) { icon.paintIcon(this, g2d, iconX, iconY); } iconX -= (iconWidth + pad); if (!faded) { g2d.setComposite(AlphaComposite.getInstance( AlphaComposite.SRC_OVER, 0.1f)); faded = true; } } g2d.dispose(); //clean up } } /** Returns an ImageIcon, or null if the path was invalid. */ protected static ImageIcon createImageIcon(String path) { java.net.URL imgURL = IconDisplayer.class.getResource(path); if (imgURL != null) { return new ImageIcon(imgURL); } else { System.err.println("Couldn"t find file: " + path); return null; } } /** * Create the GUI and show it. For thread safety, this method should be * invoked from the event-dispatching thread. */ private static void createAndShowGUI() { //Make sure we have nice window decorations. JFrame.setDefaultLookAndFeelDecorated(true); //Create and set up the window. JFrame frame = new JFrame("IconDisplayer"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Create and set up the content pane. ImageIcon ship = createImageIcon("rocketship.gif"); IconDisplayer id = new IconDisplayer(ship, 5, -1); frame.getContentPane().add(id, BorderLayout.CENTER); //Display the window. frame.pack(); frame.setVisible(true); } public static void main(String[] args) { //Schedule a job for the event-dispatching thread: //creating and showing this application"s GUI. javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); }
}
</source>
Icon Line
<source lang="java"> // IconLine // Copyright (C) by Andrea Carboni. // This file may be distributed under the terms of the LGPL license. //
import java.awt.ruponent; import java.awt.Graphics; import java.awt.Image; import java.util.Vector; import javax.swing.Icon; // public class IconLine implements Icon {
private int iWidth = 0; private int iHeight = 0; private int iSpace = 1; private Vector vImages = new Vector(); //--------------------------------------------------------------------------- //--- //--- Constructor //--- //--------------------------------------------------------------------------- public IconLine() {} //--------------------------------------------------------------------------- public IconLine(int space) { iSpace = space; } //--------------------------------------------------------------------------- //--- //--- Constructor //--- //--------------------------------------------------------------------------- public void addImage(Image image) { vImages.add(image); iWidth = iWidth + image.getWidth(null); iHeight = image.getHeight(null); } //--------------------------------------------------------------------------- public void setImage(int index, Image image) { vImages.set(index, image); iHeight = image.getHeight(null); } //--------------------------------------------------------------------------- //--- //--- Icon interface methods //--- //--------------------------------------------------------------------------- public int getIconWidth() { return iWidth; } //--------------------------------------------------------------------------- public int getIconHeight() { return iHeight; } //--------------------------------------------------------------------------- public void paintIcon(Component c, Graphics g, int x, int y) { int dx = 0; for(int i=0; i<vImages.size(); i++) { Image image = (Image) vImages.get(i); g.drawImage(image, x +dx, y, c); dx += image.getWidth(c) +iSpace; } }
} //
</source>
Implement the Icon interface
<source lang="java"> import java.awt.Color; import java.awt.ruponent; import java.awt.Graphics; import javax.swing.Icon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class IconInterfaceDemo extends JPanel {
public IconInterfaceDemo() { } public static void main(String[] a) { JFrame mainFrame = new JFrame(); JLabel label = new JLabel("label"); label.setIcon(new ColoredSquare(Color.green)); label.setDisabledIcon(new ColoredSquare(Color.red)); mainFrame.getContentPane().add(label); mainFrame.setSize(100, 100); mainFrame.setVisible(true); }
} class ColoredSquare implements Icon {
Color color; public ColoredSquare(Color color) { this.color = color; } public void paintIcon(Component c, Graphics g, int x, int y) { Color oldColor = g.getColor(); g.setColor(color); g.fill3DRect(x, y, getIconWidth(), getIconHeight(), true); g.setColor(oldColor); } public int getIconWidth() { return 12; } public int getIconHeight() { return 12; }
}
</source>
Layered Icon
<source lang="java"> /*
* LayeredIcon.java * 2006-08-09 */
import java.awt.ruponent; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Insets; import java.util.ArrayList; import javax.swing.Icon; import javax.swing.SwingConstants; /**
* @author Christopher Bach */
public class LayeredIcon implements Icon {
public static final int TOP = SwingConstants.TOP, LEFT = SwingConstants.LEFT, BOTTOM = SwingConstants.BOTTOM, RIGHT = SwingConstants.RIGHT, CENTER = SwingConstants.CENTER; private Dimension ourPrefSize = new Dimension(0, 0); private ArrayList ourLayers = new ArrayList(); private Insets ourPadding = new Insets(0, 0, 0, 0); /** * */ public LayeredIcon() { } /** * */ public LayeredIcon(int padding) { setPadding(padding, padding, padding, padding); } /** * Creates a new instance of LayeredIcon with the specified width and height, * but no graphic. */ public LayeredIcon(int width, int height) { setIconSize(width, height); } /** * */ public LayeredIcon(int width, int height, int padding) { setIconSize(width, height); setPadding(padding, padding, padding, padding); } /** * */ public LayeredIcon(int topPadding, int leftPadding, int bottomPadding, int rightPadding) { setPadding(topPadding, leftPadding, bottomPadding, rightPadding); } /** * */ public LayeredIcon(int width, int height, int topPadding, int leftPadding, int bottomPadding, int rightPadding) { setIconSize(width, height); setPadding(topPadding, leftPadding, bottomPadding, rightPadding); } /** * If any client Icons have been added and painting is enabled, paints the * client Icons at the specified coordinates into the provided graphics * context for the indicated Component. */ public void paintIcon(Component c, Graphics g, int x, int y) { Dimension iconSize = getIconSize(); for (int i = 0, size = ourLayers.size(); i < size; i++) { Layer layer = (Layer) ourLayers.get(i); if (layer.painted) { int w = layer.icon.getIconWidth(); int h = layer.icon.getIconHeight(); int dx = (layer.halign == LEFT ? 0 : iconSize.width - w); if (layer.halign != RIGHT) dx = dx / 2; dx += ourPadding.left; int dy = (layer.valign == TOP ? 0 : iconSize.height - h); if (layer.valign != BOTTOM) dy = dy / 2; dy += ourPadding.top; layer.icon.paintIcon(c, g, x + dx, y + dy); } } } /** * Returns the width of the LayeredIcon. If any client Icons have been added, * returns the max width of all client Icons. Otherwise, returns the * LayeredIcon"s explicit width. */ public int getIconWidth() { return getIconSize().width + ourPadding.left + ourPadding.right; } /** * Returns the height of the LayeredIcon. If any client Icons have been added, * returns the max height of all client Icons. Otherwise, returns the * LayeredIcon"s explicit height. */ public int getIconHeight() { return getIconSize().height + ourPadding.top + ourPadding.bottom; } /** * Sets the explicit size of the LayeredIcon to be used when no client Icons * have been added. */ public void setIconSize(int width, int height) { ourPrefSize.width = width; ourPrefSize.height = height; } /** * */ public void setPadding(int padding) { ourPadding.top = padding; ourPadding.left = padding; ourPadding.bottom = padding; ourPadding.right = padding; } /** * */ public void setPadding(int topPadding, int leftPadding, int bottomPadding, int rightPadding) { ourPadding.top = topPadding; ourPadding.left = leftPadding; ourPadding.bottom = bottomPadding; ourPadding.right = rightPadding; } /** * */ public Insets getPadding() { return new Insets(ourPadding.top, ourPadding.left, ourPadding.bottom, ourPadding.right); } /** * */ public void addIcon(Icon icon) { if (icon != null) { ourLayers.add(new Layer(icon)); } } /** * */ public void addIcon(Icon icon, int index) { if (icon != null && index >= 0 && index <= ourLayers.size()) { ourLayers.add(index, new Layer(icon)); } } /** * */ public void addIcon(Icon icon, int halign, int valign) { if (icon != null) { ourLayers.add(new Layer(icon, checkHAlign(halign), checkVAlign(valign))); } } /** * */ public void addIcon(Icon icon, int index, int halign, int valign) { if (icon != null && index >= 0 && index <= ourLayers.size()) { ourLayers.add(index, new Layer(icon, checkHAlign(halign), checkVAlign(valign))); } } /** * */ public void removeIcon(Icon icon) { Layer layer = getLayer(icon); if (layer != null) { ourLayers.remove(layer); } } /** * */ public void clear() { ourLayers.clear(); } /** * */ public Icon getIcon(int index) { Layer layer = (Layer) ourLayers.get(index); if (layer != null) return layer.icon; else return null; } /** * */ public int indexOf(Icon icon) { for (int i = 0, size = ourLayers.size(); i < size; i++) { Layer layer = (Layer) ourLayers.get(i); if (layer.icon == icon) return i; } return -1; } /** * */ public int iconCount() { return ourLayers.size(); } /** * */ public boolean isIconPainted(int iconIndex) { Layer layer = (Layer) ourLayers.get(iconIndex); if (layer != null) return layer.painted; else return false; } /** * */ public void setIconPainted(int iconIndex, boolean painted) { Layer layer = (Layer) ourLayers.get(iconIndex); if (layer != null) layer.painted = painted; } /** * */ public boolean isIconPainted(Icon icon) { Layer layer = getLayer(icon); if (layer != null) return layer.painted; else return false; } /** * */ public void setIconPainted(Icon icon, boolean painted) { Layer layer = getLayer(icon); if (layer != null) layer.painted = painted; } /** * */ public void setIconAlignment(Icon icon, int halign, int valign) { Layer layer = getLayer(icon); if (layer != null) { layer.halign = checkHAlign(halign); layer.valign = checkVAlign(valign); } } /** * */ public void setIconAlignment(int iconIndex, int halign, int valign) { Layer layer = (Layer) ourLayers.get(iconIndex); if (layer != null) { layer.halign = checkHAlign(halign); layer.valign = checkVAlign(valign); } } /** * */ public int getIconHAlignment(Icon icon) { Layer layer = getLayer(icon); if (layer != null) return layer.halign; else return CENTER; } /** * */ public int getIconVAlignment(Icon icon) { Layer layer = getLayer(icon); if (layer != null) return layer.valign; else return CENTER; } /** * */ public int getIconHAlignment(int iconIndex) { Layer layer = (Layer) ourLayers.get(iconIndex); if (layer != null) return layer.halign; else return CENTER; } /** * */ public int getIconVAlignment(int iconIndex) { Layer layer = (Layer) ourLayers.get(iconIndex); if (layer != null) return layer.valign; else return CENTER; } /** * */ private int checkHAlign(int halign) { if (halign != LEFT && halign != RIGHT && halign != CENTER) return CENTER; else return halign; } /** * */ private int checkVAlign(int valign) { if (valign != TOP && valign != BOTTOM && valign != CENTER) return CENTER; else return valign; } /** * */ private Layer getLayer(Icon icon) { for (int i = 0, size = ourLayers.size(); i < size; i++) { Layer layer = (Layer) ourLayers.get(i); if (layer.icon == icon) return layer; } return null; } /** * */ private Dimension getIconSize() { if (ourLayers.size() == 0) return ourPrefSize; Dimension d = new Dimension(0, 0); for (int i = 0, size = ourLayers.size(); i < size; i++) { Layer layer = (Layer) ourLayers.get(i); d.height = Math.max(d.height, layer.icon.getIconHeight()); d.width = Math.max(d.width, layer.icon.getIconWidth()); } return d; } /** * */ private class Layer { public Icon icon = null; public boolean painted = true; public int halign = CENTER; public int valign = CENTER; public Layer() { } public Layer(Icon icon) { this.icon = icon; } public Layer(Icon icon, int halign, int valign) { this.icon = icon; this.halign = halign; this.valign = valign; } }
}
</source>
MemImage is an in-memory icon showing a Color gradient
<source lang="java"> /*
* Copyright (c) Ian F. Darwin, http://www.darwinsys.ru/, 1996-2002. * All rights reserved. Software written by Ian F. Darwin and others. * $Id: LICENSE,v 1.8 2004/02/09 03:33:38 ian Exp $ * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS"" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * Java, the Duke mascot, and all variants of Sun"s Java "steaming coffee * cup" logo are trademarks of Sun Microsystems. Sun"s, and James Gosling"s, * pioneering role in inventing and promulgating (and standardizing) the Java * language and environment is gratefully acknowledged. * * The pioneering role of Dennis Ritchie and Bjarne Stroustrup, of AT&T, for * inventing predecessor languages C and C++ is also gratefully acknowledged. */
/// import java.awt.ruponent; import java.awt.Dimension; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.awt.image.MemoryImageSource; /** MemImage is an in-memory icon showing a Color gradient. */ public class MemImage extends Component {
/** * Demo main program, showing two ways to use it. Create a small MemImage * and set it as this Frame"s iconImage. Also display a larger version of * the same image in the Frame. */ public static void main(String[] av) { Frame f = new Frame("MemImage.java"); f.add(new MemImage()); f.setIconImage(new MemImage(16, 16).getImage()); f.pack(); f.setVisible(true); } /** The image */ private Image img; /** The image width */ private int w; /** The image height */ private int h; /** Construct a MemImage with a default size */ public MemImage() { this(100, 100); } /** Construct a MemImage with a specified width and height */ public MemImage(int w, int h) { this.w = w; this.h = h; int pix[] = new int[w * h]; int index = 0; for (int y = 0; y < h; y++) { int red = (y * 255) / (h - 1); for (int x = 0; x < w; x++) { int blue = (x * 255) / (w - 1); pix[index++] = (255 << 24) | (red << 16) | blue; } } img = createImage(new MemoryImageSource(w, h, pix, 0, w)); setSize(getPreferredSize()); } /** Getter for the Image */ public Image getImage() { return img; } public Dimension getPreferredSize() { return new Dimension(w, h); } public void paint(Graphics g) { g.drawImage(img, 0, 0, getSize().width, getSize().height, this); }
}
</source>
Plain Color Icon
<source lang="java"> // The UMLet source code is distributed under the terms of the GPL; see license.txt
import java.awt.Color; import java.awt.ruponent; import java.awt.Graphics; import javax.swing.Icon; public class PlainColorIcon implements Icon {
private Color color; public PlainColorIcon(Color color) { this.color = color; } public void paintIcon(Component c, Graphics g, int x, int y) { Color old_color = g.getColor(); g.setColor(color); g.fillRect(x,y,10,10); g.setColor(old_color); } public int getIconWidth() { return 10; } public int getIconHeight() { return 10; }
}
</source>
Reading an Image or Icon from a File
<source lang="java"> import java.awt.Image; import java.awt.Toolkit; public class BasicDraw {
public static void main(String[] args) { Image image = Toolkit.getDefaultToolkit().getImage("image.gif"); int width = image.getWidth(null); int height = image.getHeight(null); if (width >= 0) { // The image has been fully loaded } else { // The image has not been fully loaded } }
}
</source>
Return a filled oval as an Icon
<source lang="java"> /*
This file is part of the BlueJ program. Copyright (C) 1999-2009 Michael K�lling and John Rosenberg This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is subject to the Classpath exception as provided in the LICENSE.txt file that accompanied this code. */
import javax.swing.*; import java.awt.*; /**
* Return a filled oval as an Icon * * @author Andrew Patterson * @cvs $Id: OvalIcon.java 6164 2009-02-19 18:11:32Z polle $ */
public class OvalIcon implements Icon {
private static OvalIcon redIcon = new OvalIcon(Color.red); private static OvalIcon blankIcon = new OvalIcon(null); public static OvalIcon getRedOvalIcon() { return redIcon; } public static OvalIcon getBlankOvalIcon() { return blankIcon; } private Color color; public OvalIcon (Color c) { color = c; } public void paintIcon (Component c, Graphics g, int x, int y) { if(color != null) { int width = getIconWidth(); int height = getIconHeight(); g.setColor (color); g.fillOval (x, y, width, height); }
} public int getIconWidth() {
return 10;
} public int getIconHeight() {
return 10;
} }
</source>
Transparent icon with no content
<source lang="java"> /*
This library is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the license, or (at your option) any later version.
- /
import javax.swing.*; import java.awt.*; /**
Transparent icon with no content. @author @version $Revision: 1.1 $ $Date: 2003/08/18 07:46:43 $
- /
public class EmptyIcon implements Icon {
private int width; private int height; /** * Constructor. * @param width the width of the icon. * @param height the height of the icon. */ public EmptyIcon(int width, int height) { this.width = width; this.height = height; } public void paintIcon(Component c, Graphics g, int x, int y) { } public int getIconWidth() { return width; } public int getIconHeight() { return height; }
}
</source>