<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FAdvanced_Graphics%2FLight</id>
		<title>Java/Advanced Graphics/Light - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FAdvanced_Graphics%2FLight"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Advanced_Graphics/Light&amp;action=history"/>
		<updated>2026-04-21T16:09:59Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Advanced_Graphics/Light&amp;diff=7553&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Advanced_Graphics/Light&amp;diff=7553&amp;oldid=prev"/>
				<updated>2010-06-01T06:47:59Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:47, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Advanced_Graphics/Light&amp;diff=7552&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Advanced_Graphics/Light&amp;diff=7552&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:45Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Shedding Light Demo ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * Copyright (c) 2007, Romain Guy&lt;br /&gt;
 * All rights reserved.&lt;br /&gt;
 *&lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions&lt;br /&gt;
 * are met:&lt;br /&gt;
 *&lt;br /&gt;
 *   * Redistributions of source code must retain the above copyright&lt;br /&gt;
 *     notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 *   * Redistributions in binary form must reproduce the above&lt;br /&gt;
 *     copyright notice, this list of conditions and the following&lt;br /&gt;
 *     disclaimer in the documentation and/or other materials provided&lt;br /&gt;
 *     with the distribution.&lt;br /&gt;
 *   * Neither the name of the TimingFramework project nor the names of its&lt;br /&gt;
 *     contributors may be used to endorse or promote products derived&lt;br /&gt;
 *     from this software without specific prior written permission.&lt;br /&gt;
 *&lt;br /&gt;
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS&lt;br /&gt;
 * &amp;quot;AS IS&amp;quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT&lt;br /&gt;
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR&lt;br /&gt;
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT&lt;br /&gt;
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,&lt;br /&gt;
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT&lt;br /&gt;
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,&lt;br /&gt;
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY&lt;br /&gt;
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT&lt;br /&gt;
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE&lt;br /&gt;
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 */&lt;br /&gt;
import java.awt.Color;&lt;br /&gt;
import java.awt.Dimension;&lt;br /&gt;
import java.awt.Font;&lt;br /&gt;
import java.awt.FontMetrics;&lt;br /&gt;
import java.awt.Graphics;&lt;br /&gt;
import java.awt.Graphics2D;&lt;br /&gt;
import java.awt.Image;&lt;br /&gt;
import java.awt.Insets;&lt;br /&gt;
import java.awt.RenderingHints;&lt;br /&gt;
import java.awt.font.TextLayout;&lt;br /&gt;
import java.awt.geom.Rectangle2D;&lt;br /&gt;
import java.awt.image.BufferedImage;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import javax.imageio.ImageIO;&lt;br /&gt;
import javax.swing.Action;&lt;br /&gt;
import javax.swing.BorderFactory;&lt;br /&gt;
import javax.swing.ButtonModel;&lt;br /&gt;
import javax.swing.JButton;&lt;br /&gt;
import javax.swing.JComponent;&lt;br /&gt;
import javax.swing.plaf.basic.BasicButtonUI;&lt;br /&gt;
import java.awt.Color;&lt;br /&gt;
import java.awt.FlowLayout;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
import javax.swing.SwingUtilities;&lt;br /&gt;
import javax.swing.UIManager;&lt;br /&gt;
import javax.swing.UnsupportedLookAndFeelException;&lt;br /&gt;
/**&lt;br /&gt;
 *&lt;br /&gt;
 * @author Romain Guy &amp;lt;romain.guy@mac.ru&amp;gt;&lt;br /&gt;
 */&lt;br /&gt;
public class SheddingLightDemo extends JFrame {&lt;br /&gt;
    public SheddingLightDemo() {&lt;br /&gt;
        super(&amp;quot;Shedding Light&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        JPanel panel = new JPanel(new FlowLayout());&lt;br /&gt;
        panel.setBackground(new Color(0x8B93A3));&lt;br /&gt;
        &lt;br /&gt;
        panel.add(new LightButton(&amp;quot;Shed&amp;quot;));&lt;br /&gt;
        panel.add(new LightButton(&amp;quot;The&amp;quot;));&lt;br /&gt;
        panel.add(new LightButton(&amp;quot;Light&amp;quot;));&lt;br /&gt;
        &lt;br /&gt;
        add(panel);&lt;br /&gt;
        &lt;br /&gt;
        pack();&lt;br /&gt;
        setLocationRelativeTo(null);&lt;br /&gt;
        setDefaultCloseOperation(EXIT_ON_CLOSE);&lt;br /&gt;
    }&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        try {&lt;br /&gt;
            UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());&lt;br /&gt;
        } catch (ClassNotFoundException ex) {&lt;br /&gt;
            ex.printStackTrace();&lt;br /&gt;
        } catch (IllegalAccessException ex) {&lt;br /&gt;
            ex.printStackTrace();&lt;br /&gt;
        } catch (InstantiationException ex) {&lt;br /&gt;
            ex.printStackTrace();&lt;br /&gt;
        } catch (UnsupportedLookAndFeelException ex) {&lt;br /&gt;
            ex.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        SwingUtilities.invokeLater(new Runnable() {&lt;br /&gt;
            public void run() {&lt;br /&gt;
                new SheddingLightDemo().setVisible(true);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
 * Copyright (c) 2007, Romain Guy&lt;br /&gt;
 * All rights reserved.&lt;br /&gt;
 *&lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions&lt;br /&gt;
 * are met:&lt;br /&gt;
 *&lt;br /&gt;
 *   * Redistributions of source code must retain the above copyright&lt;br /&gt;
 *     notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 *   * Redistributions in binary form must reproduce the above&lt;br /&gt;
 *     copyright notice, this list of conditions and the following&lt;br /&gt;
 *     disclaimer in the documentation and/or other materials provided&lt;br /&gt;
 *     with the distribution.&lt;br /&gt;
 *   * Neither the name of the TimingFramework project nor the names of its&lt;br /&gt;
 *     contributors may be used to endorse or promote products derived&lt;br /&gt;
 *     from this software without specific prior written permission.&lt;br /&gt;
 *&lt;br /&gt;
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS&lt;br /&gt;
 * &amp;quot;AS IS&amp;quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT&lt;br /&gt;
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR&lt;br /&gt;
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT&lt;br /&gt;
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,&lt;br /&gt;
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT&lt;br /&gt;
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,&lt;br /&gt;
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY&lt;br /&gt;
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT&lt;br /&gt;
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE&lt;br /&gt;
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
class LightButton extends JButton {&lt;br /&gt;
    private float shadowOffsetX;&lt;br /&gt;
    private float shadowOffsetY;&lt;br /&gt;
    &lt;br /&gt;
    private Color shadowColor = Color.BLACK;&lt;br /&gt;
    private int shadowDirection = 60;&lt;br /&gt;
    &lt;br /&gt;
    private Image normalButton, normalButtonPressed, buttonHighlight;&lt;br /&gt;
    private int shadowDistance = 1;&lt;br /&gt;
    private Insets sourceInsets = new Insets(6, 7, 6, 8);&lt;br /&gt;
    private Dimension buttonDimension = new Dimension(116, 35);&lt;br /&gt;
    private Color buttonForeground = Color.WHITE;&lt;br /&gt;
    private Font buttonFont = new Font(&amp;quot;Arial&amp;quot;, Font.BOLD, 22);&lt;br /&gt;
    &lt;br /&gt;
    private float ghostValue;&lt;br /&gt;
    &lt;br /&gt;
    private boolean main = false;&lt;br /&gt;
    public LightButton(String text) {&lt;br /&gt;
        this();&lt;br /&gt;
        setText(text);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public LightButton(Action a) {&lt;br /&gt;
        this();&lt;br /&gt;
        setAction(a);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public LightButton() {&lt;br /&gt;
        computeShadow();&lt;br /&gt;
        setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));&lt;br /&gt;
        setForeground(buttonForeground);&lt;br /&gt;
        setFont(buttonFont);&lt;br /&gt;
        setContentAreaFilled(false);&lt;br /&gt;
        setBorderPainted(false);&lt;br /&gt;
        setFocusable(false);&lt;br /&gt;
        &lt;br /&gt;
        normalButton = loadImage(&amp;quot;button-normal.png&amp;quot;);&lt;br /&gt;
        normalButtonPressed = loadImage(&amp;quot;button-normal-pressed.png&amp;quot;);&lt;br /&gt;
        buttonHighlight = loadImage(&amp;quot;header-halo.png&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        // Hacky? Hacky!&lt;br /&gt;
        setUI(new BasicButtonUI() {&lt;br /&gt;
            @Override&lt;br /&gt;
            public Dimension getMinimumSize(JComponent c) {&lt;br /&gt;
                return getPreferredSize(c);&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            @Override&lt;br /&gt;
            public Dimension getMaximumSize(JComponent c) {&lt;br /&gt;
                return getPreferredSize(c);&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            @Override&lt;br /&gt;
            public Dimension getPreferredSize(JComponent c) {&lt;br /&gt;
                Insets insets = c.getInsets();&lt;br /&gt;
                Dimension d = new Dimension(buttonDimension);&lt;br /&gt;
                d.width += insets.left + insets.right;&lt;br /&gt;
                d.height += insets.top + insets.bottom;&lt;br /&gt;
                return d;&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private static Image loadImage(String fileName) {&lt;br /&gt;
        try {&lt;br /&gt;
            return ImageIO.read(LightButton.class.getResource(fileName));&lt;br /&gt;
        } catch (IOException ex) {&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private void computeShadow() {&lt;br /&gt;
        double rads = Math.toRadians(shadowDirection);&lt;br /&gt;
        shadowOffsetX = (float) Math.cos(rads) * shadowDistance;&lt;br /&gt;
        shadowOffsetY = (float) Math.sin(rads) * shadowDistance;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private Image getImage(boolean armed) {&lt;br /&gt;
        return armed ? normalButtonPressed : normalButton;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @Override&lt;br /&gt;
    protected void paintComponent(Graphics g) {&lt;br /&gt;
        Graphics2D g2 = (Graphics2D) g;&lt;br /&gt;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,&lt;br /&gt;
                RenderingHints.VALUE_ANTIALIAS_ON);&lt;br /&gt;
        &lt;br /&gt;
        ButtonModel m = getModel();&lt;br /&gt;
        Insets insets = getInsets();&lt;br /&gt;
        &lt;br /&gt;
        int width = getWidth() - insets.left - insets.right;&lt;br /&gt;
        int height = getHeight() - insets.top - insets.bottom;&lt;br /&gt;
        &lt;br /&gt;
        tileStretchPaint(g2,this,(BufferedImage) getImage(m.isArmed()), sourceInsets);&lt;br /&gt;
        &lt;br /&gt;
        if (getModel().isRollover()) {&lt;br /&gt;
            g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,&lt;br /&gt;
                    RenderingHints.VALUE_INTERPOLATION_BILINEAR);&lt;br /&gt;
            g2.drawImage(buttonHighlight,&lt;br /&gt;
                    insets.left + 2, insets.top + 2,&lt;br /&gt;
                    width - 4, height - 4, null);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        FontMetrics fm = getFontMetrics(getFont());&lt;br /&gt;
        TextLayout layout = new TextLayout(getText(),&lt;br /&gt;
                getFont(),&lt;br /&gt;
                g2.getFontRenderContext());&lt;br /&gt;
        Rectangle2D bounds = layout.getBounds();&lt;br /&gt;
        &lt;br /&gt;
        int x = (int) (getWidth() - insets.left - insets.right -&lt;br /&gt;
                bounds.getWidth()) / 2;&lt;br /&gt;
        //x -= 2;&lt;br /&gt;
        int y = (getHeight() - insets.top - insets.bottom -&lt;br /&gt;
                 fm.getMaxAscent() - fm.getMaxDescent()) / 2;&lt;br /&gt;
        y += fm.getAscent() - 1;&lt;br /&gt;
        &lt;br /&gt;
        if (m.isArmed()) {&lt;br /&gt;
            x += 1;&lt;br /&gt;
            y += 1;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        g2.setColor(shadowColor);&lt;br /&gt;
        layout.draw(g2,&lt;br /&gt;
                x + (int) Math.ceil(shadowOffsetX),&lt;br /&gt;
                y + (int) Math.ceil(shadowOffsetY));&lt;br /&gt;
        g2.setColor(getForeground());&lt;br /&gt;
        layout.draw(g2, x, y);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /**&lt;br /&gt;
     * Draws an image on top of a component by doing a 3x3 grid stretch of the image&lt;br /&gt;
     * using the specified insets.&lt;br /&gt;
     *&lt;br /&gt;
     * From SwingLabs, licensed under LGPL&lt;br /&gt;
     */&lt;br /&gt;
    public static void tileStretchPaint(Graphics g, &lt;br /&gt;
                JComponent comp,&lt;br /&gt;
                BufferedImage img,&lt;br /&gt;
                Insets ins) {&lt;br /&gt;
        &lt;br /&gt;
        int left = ins.left;&lt;br /&gt;
        int right = ins.right;&lt;br /&gt;
        int top = ins.top;&lt;br /&gt;
        int bottom = ins.bottom;&lt;br /&gt;
        &lt;br /&gt;
        // top&lt;br /&gt;
        g.drawImage(img,&lt;br /&gt;
                    0,0,left,top,&lt;br /&gt;
                    0,0,left,top,&lt;br /&gt;
                    null);&lt;br /&gt;
        g.drawImage(img,&lt;br /&gt;
                    left,                 0, &lt;br /&gt;
                    comp.getWidth() - right, top, &lt;br /&gt;
                    left,                 0, &lt;br /&gt;
                    img.getWidth()  - right, top, &lt;br /&gt;
                    null);&lt;br /&gt;
        g.drawImage(img,&lt;br /&gt;
                    comp.getWidth() - right, 0, &lt;br /&gt;
                    comp.getWidth(),         top, &lt;br /&gt;
                    img.getWidth()  - right, 0, &lt;br /&gt;
                    img.getWidth(),          top, &lt;br /&gt;
                    null);&lt;br /&gt;
        // middle&lt;br /&gt;
        g.drawImage(img,&lt;br /&gt;
                    0,    top, &lt;br /&gt;
                    left, comp.getHeight()-bottom,&lt;br /&gt;
                    0,    top,   &lt;br /&gt;
                    left, img.getHeight()-bottom,&lt;br /&gt;
                    null);&lt;br /&gt;
        &lt;br /&gt;
        g.drawImage(img,&lt;br /&gt;
                    left,                  top, &lt;br /&gt;
                    comp.getWidth()-right,      comp.getHeight()-bottom,&lt;br /&gt;
                    left,                  top,   &lt;br /&gt;
                    img.getWidth()-right,  img.getHeight()-bottom,&lt;br /&gt;
                    null);&lt;br /&gt;
         &lt;br /&gt;
        g.drawImage(img,&lt;br /&gt;
                    comp.getWidth()-right,     top, &lt;br /&gt;
                    comp.getWidth(),           comp.getHeight()-bottom,&lt;br /&gt;
                    img.getWidth()-right, top,   &lt;br /&gt;
                    img.getWidth(),       img.getHeight()-bottom,&lt;br /&gt;
                    null);&lt;br /&gt;
        &lt;br /&gt;
        // bottom&lt;br /&gt;
        g.drawImage(img,&lt;br /&gt;
                    0,comp.getHeight()-bottom, &lt;br /&gt;
                    left, comp.getHeight(),&lt;br /&gt;
                    0,img.getHeight()-bottom,   &lt;br /&gt;
                    left,img.getHeight(),&lt;br /&gt;
                    null);&lt;br /&gt;
        g.drawImage(img,&lt;br /&gt;
                    left,                    comp.getHeight()-bottom, &lt;br /&gt;
                    comp.getWidth()-right,        comp.getHeight(),&lt;br /&gt;
                    left,                    img.getHeight()-bottom,   &lt;br /&gt;
                    img.getWidth()-right,    img.getHeight(),&lt;br /&gt;
                    null);&lt;br /&gt;
        g.drawImage(img,&lt;br /&gt;
                    comp.getWidth()-right,     comp.getHeight()-bottom, &lt;br /&gt;
                    comp.getWidth(),           comp.getHeight(),&lt;br /&gt;
                    img.getWidth()-right, img.getHeight()-bottom,   &lt;br /&gt;
                    img.getWidth(),       img.getHeight(),&lt;br /&gt;
                    null);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>