<?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%2FSwing_Components%2FLayeredPane</id>
		<title>Java/Swing Components/LayeredPane - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FSwing_Components%2FLayeredPane"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Swing_Components/LayeredPane&amp;action=history"/>
		<updated>2026-04-23T12:21:52Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/Swing_Components/LayeredPane&amp;diff=8267&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/Swing_Components/LayeredPane&amp;diff=8267&amp;oldid=prev"/>
				<updated>2010-06-01T06:57:48Z</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:57, 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/Swing_Components/LayeredPane&amp;diff=8266&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/Swing_Components/LayeredPane&amp;diff=8266&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:46Z</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;== LayeredPane With Warning ==&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;
 * 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.Graphics;&lt;br /&gt;
import java.awt.Point;&lt;br /&gt;
import java.awt.image.BufferedImage;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.util.HashSet;&lt;br /&gt;
import java.util.Set;&lt;br /&gt;
import javax.imageio.ImageIO;&lt;br /&gt;
import javax.swing.JComponent;&lt;br /&gt;
import javax.swing.JViewport;&lt;br /&gt;
import javax.swing.SwingUtilities;&lt;br /&gt;
import java.awt.event.FocusEvent;&lt;br /&gt;
import java.awt.event.FocusListener;&lt;br /&gt;
import javax.swing.JLayeredPane;&lt;br /&gt;
import javax.swing.JTextField;&lt;br /&gt;
import javax.swing.OverlayLayout;&lt;br /&gt;
import javax.swing.text.JTextComponent;&lt;br /&gt;
/**&lt;br /&gt;
 *&lt;br /&gt;
 * @author Romain Guy&lt;br /&gt;
 */&lt;br /&gt;
public class Layers extends javax.swing.JFrame {&lt;br /&gt;
    &lt;br /&gt;
    /** Creates new form Layers */&lt;br /&gt;
    public Layers() {&lt;br /&gt;
        initComponents();&lt;br /&gt;
        &lt;br /&gt;
        addLayeredValidator();&lt;br /&gt;
        addValidations();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /** This method is called from within the constructor to&lt;br /&gt;
     * initialize the form.&lt;br /&gt;
     * WARNING: Do NOT modify this code. The content of this method is&lt;br /&gt;
     * always regenerated by the Form Editor.&lt;br /&gt;
     */&lt;br /&gt;
    // &amp;lt;editor-fold defaultstate=&amp;quot;collapsed&amp;quot; desc=&amp;quot; Generated Code &amp;quot;&amp;gt;//GEN-BEGIN:initComponents&lt;br /&gt;
    private void initComponents() {&lt;br /&gt;
        javax.swing.JLabel jLabel1;&lt;br /&gt;
        javax.swing.JLabel jLabel2;&lt;br /&gt;
        javax.swing.JLabel jLabel3;&lt;br /&gt;
        javax.swing.JLabel jLabel4;&lt;br /&gt;
        javax.swing.JLabel jLabel5;&lt;br /&gt;
        javax.swing.JList jList1;&lt;br /&gt;
        javax.swing.JScrollPane jScrollPane1;&lt;br /&gt;
        javax.swing.JScrollPane jScrollPane2;&lt;br /&gt;
        jScrollPane1 = new javax.swing.JScrollPane();&lt;br /&gt;
        jList1 = new javax.swing.JList();&lt;br /&gt;
        jLabel1 = new javax.swing.JLabel();&lt;br /&gt;
        jLabel2 = new javax.swing.JLabel();&lt;br /&gt;
        jLabel3 = new javax.swing.JLabel();&lt;br /&gt;
        jLabel4 = new javax.swing.JLabel();&lt;br /&gt;
        jLabel5 = new javax.swing.JLabel();&lt;br /&gt;
        firstName = new javax.swing.JTextField();&lt;br /&gt;
        lastName = new javax.swing.JTextField();&lt;br /&gt;
        phoneNumber = new javax.swing.JTextField();&lt;br /&gt;
        email = new javax.swing.JTextField();&lt;br /&gt;
        jScrollPane2 = new javax.swing.JScrollPane();&lt;br /&gt;
        address = new javax.swing.JTextArea();&lt;br /&gt;
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);&lt;br /&gt;
        setTitle(&amp;quot;Layered Panes&amp;quot;);&lt;br /&gt;
        jList1.setModel(new javax.swing.AbstractListModel() {&lt;br /&gt;
            String[] strings = { &amp;quot;Jeff Dinkins&amp;quot;, &amp;quot;Richard Bair&amp;quot;, &amp;quot;Amy Fowler&amp;quot;, &amp;quot;Scott Violet&amp;quot;, &amp;quot;Hans Muller&amp;quot;, &amp;quot;Chris Campbell&amp;quot;, &amp;quot;Chet Haase&amp;quot; };&lt;br /&gt;
            public int getSize() { return strings.length; }&lt;br /&gt;
            public Object getElementAt(int i) { return strings[i]; }&lt;br /&gt;
        });&lt;br /&gt;
        jScrollPane1.setViewportView(jList1);&lt;br /&gt;
        jLabel1.setText(&amp;quot;First Name&amp;quot;);&lt;br /&gt;
        jLabel2.setText(&amp;quot;Last Name&amp;quot;);&lt;br /&gt;
        jLabel3.setText(&amp;quot;Phone&amp;quot;);&lt;br /&gt;
        jLabel4.setText(&amp;quot;Email&amp;quot;);&lt;br /&gt;
        jLabel5.setText(&amp;quot;Address&amp;quot;);&lt;br /&gt;
        address.setColumns(15);&lt;br /&gt;
        address.setRows(5);&lt;br /&gt;
        jScrollPane2.setViewportView(address);&lt;br /&gt;
        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());&lt;br /&gt;
        getContentPane().setLayout(layout);&lt;br /&gt;
        layout.setHorizontalGroup(&lt;br /&gt;
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)&lt;br /&gt;
            .add(layout.createSequentialGroup()&lt;br /&gt;
                .addContainerGap()&lt;br /&gt;
                .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 152, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)&lt;br /&gt;
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)&lt;br /&gt;
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)&lt;br /&gt;
                    .add(org.jdesktop.layout.GroupLayout.TRAILING, jLabel5)&lt;br /&gt;
                    .add(org.jdesktop.layout.GroupLayout.TRAILING, jLabel4)&lt;br /&gt;
                    .add(org.jdesktop.layout.GroupLayout.TRAILING, jLabel3)&lt;br /&gt;
                    .add(org.jdesktop.layout.GroupLayout.TRAILING, jLabel2)&lt;br /&gt;
                    .add(org.jdesktop.layout.GroupLayout.TRAILING, jLabel1))&lt;br /&gt;
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)&lt;br /&gt;
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)&lt;br /&gt;
                    .add(firstName, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 209, Short.MAX_VALUE)&lt;br /&gt;
                    .add(lastName, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 209, Short.MAX_VALUE)&lt;br /&gt;
                    .add(phoneNumber, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 209, Short.MAX_VALUE)&lt;br /&gt;
                    .add(email, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 209, Short.MAX_VALUE)&lt;br /&gt;
                    .add(jScrollPane2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 209, Short.MAX_VALUE))&lt;br /&gt;
                .addContainerGap())&lt;br /&gt;
        );&lt;br /&gt;
        layout.setVerticalGroup(&lt;br /&gt;
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)&lt;br /&gt;
            .add(layout.createSequentialGroup()&lt;br /&gt;
                .addContainerGap()&lt;br /&gt;
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)&lt;br /&gt;
                    .add(layout.createSequentialGroup()&lt;br /&gt;
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)&lt;br /&gt;
                            .add(jLabel1)&lt;br /&gt;
                            .add(firstName, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))&lt;br /&gt;
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)&lt;br /&gt;
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)&lt;br /&gt;
                            .add(jLabel2)&lt;br /&gt;
                            .add(lastName, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))&lt;br /&gt;
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)&lt;br /&gt;
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)&lt;br /&gt;
                            .add(jLabel3)&lt;br /&gt;
                            .add(phoneNumber, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))&lt;br /&gt;
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)&lt;br /&gt;
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)&lt;br /&gt;
                            .add(jLabel4)&lt;br /&gt;
                            .add(email, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))&lt;br /&gt;
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)&lt;br /&gt;
                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)&lt;br /&gt;
                            .add(jLabel5)&lt;br /&gt;
                            .add(jScrollPane2))&lt;br /&gt;
                        .add(6, 6, 6))&lt;br /&gt;
                    .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 210, Short.MAX_VALUE))&lt;br /&gt;
                .addContainerGap())&lt;br /&gt;
        );&lt;br /&gt;
        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();&lt;br /&gt;
        setBounds((screenSize.width-489)/2, (screenSize.height-266)/2, 489, 266);&lt;br /&gt;
    }// &amp;lt;/editor-fold&amp;gt;//GEN-END:initComponents&lt;br /&gt;
    &lt;br /&gt;
    /**&lt;br /&gt;
     * @param args the command line arguments&lt;br /&gt;
     */&lt;br /&gt;
    public static void main(String args[]) {&lt;br /&gt;
        java.awt.EventQueue.invokeLater(new Runnable() {&lt;br /&gt;
            public void run() {&lt;br /&gt;
                new Layers().setVisible(true);&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    private void addLayeredValidator() {&lt;br /&gt;
        validator = new Validator();&lt;br /&gt;
        &lt;br /&gt;
        JLayeredPane layeredPane = getRootPane().getLayeredPane();&lt;br /&gt;
        layeredPane.setLayout(new OverlayLayout(layeredPane));&lt;br /&gt;
        layeredPane.add(validator, (Integer) (JLayeredPane.DEFAULT_LAYER + 50));&lt;br /&gt;
        //validator.setBounds(0, 0, getWidth(), getHeight());&lt;br /&gt;
    }&lt;br /&gt;
    private void addValidations() {&lt;br /&gt;
        addValidationForText(address);&lt;br /&gt;
        addValidationForText(firstName);&lt;br /&gt;
        addValidationForText(lastName);&lt;br /&gt;
        addValidationForNumber(phoneNumber);&lt;br /&gt;
        addValidationForEmail(email);&lt;br /&gt;
    }&lt;br /&gt;
    private void addValidationForText(JTextComponent field) {&lt;br /&gt;
        field.addFocusListener(new FocusListener() {&lt;br /&gt;
            public void focusGained(FocusEvent focusEvent) {&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            public void focusLost(FocusEvent focusEvent) {&lt;br /&gt;
                JTextComponent field = (JTextComponent) focusEvent.getComponent();&lt;br /&gt;
                String text = field.getText();&lt;br /&gt;
                &lt;br /&gt;
                if (text.matches(&amp;quot;[-A-Za-z ]*&amp;quot;)) {&lt;br /&gt;
                    validator.addWarning(field);&lt;br /&gt;
                } else {&lt;br /&gt;
                    validator.removeWarning(field);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    private void addValidationForNumber(JTextComponent field) {&lt;br /&gt;
        field.addFocusListener(new FocusListener() {&lt;br /&gt;
            public void focusGained(FocusEvent focusEvent) {&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            public void focusLost(FocusEvent focusEvent) {&lt;br /&gt;
                JTextField field = (JTextField) focusEvent.getComponent();&lt;br /&gt;
                String text = field.getText();&lt;br /&gt;
                &lt;br /&gt;
                if (text.matches(&amp;quot;[-()0-9 ]*&amp;quot;)) {&lt;br /&gt;
                    validator.addWarning(field);&lt;br /&gt;
                } else {&lt;br /&gt;
                    validator.removeWarning(field);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    private void addValidationForEmail(JTextComponent field) {&lt;br /&gt;
        field.addFocusListener(new FocusListener() {&lt;br /&gt;
            public void focusGained(FocusEvent focusEvent) {&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            public void focusLost(FocusEvent focusEvent) {&lt;br /&gt;
                JTextComponent field = (JTextComponent) focusEvent.getComponent();&lt;br /&gt;
                String text = field.getText();&lt;br /&gt;
                &lt;br /&gt;
                if (text.matches(&amp;quot;[^@]+@([^.]+\\.)+[^.]+&amp;quot;)) {&lt;br /&gt;
                    validator.addWarning(field);&lt;br /&gt;
                } else {&lt;br /&gt;
                    validator.removeWarning(field);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Variables declaration - do not modify//GEN-BEGIN:variables&lt;br /&gt;
    private javax.swing.JTextArea address;&lt;br /&gt;
    private javax.swing.JTextField email;&lt;br /&gt;
    private javax.swing.JTextField firstName;&lt;br /&gt;
    private javax.swing.JTextField lastName;&lt;br /&gt;
    private javax.swing.JTextField phoneNumber;&lt;br /&gt;
    // End of variables declaration//GEN-END:variables&lt;br /&gt;
    private Validator validator;&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;
/**&lt;br /&gt;
 *&lt;br /&gt;
 * @author Romain Guy &amp;lt;romain.guy@mac.ru&amp;gt;&lt;br /&gt;
 */&lt;br /&gt;
class Validator extends JComponent {&lt;br /&gt;
    private Set&amp;lt;JComponent&amp;gt; invalidFields = new HashSet&amp;lt;JComponent&amp;gt;();&lt;br /&gt;
    private BufferedImage warningIcon;&lt;br /&gt;
    &lt;br /&gt;
    /** Creates a new instance of Validator */&lt;br /&gt;
    public Validator() {&lt;br /&gt;
        loadImages();&lt;br /&gt;
    }&lt;br /&gt;
    public void addWarning(JComponent field) {&lt;br /&gt;
        if (invalidFields.contains(field)) {&lt;br /&gt;
            invalidFields.remove(field);&lt;br /&gt;
            repaintBadge(field);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public void removeWarning(JComponent field) {&lt;br /&gt;
        invalidFields.add(field);&lt;br /&gt;
        repaintBadge(field);&lt;br /&gt;
    }&lt;br /&gt;
    private void repaintBadge(JComponent field) {&lt;br /&gt;
        Point p = field.getLocationOnScreen();&lt;br /&gt;
        SwingUtilities.convertPointFromScreen(p, this);&lt;br /&gt;
        &lt;br /&gt;
        int x = p.x - warningIcon.getWidth() / 2;&lt;br /&gt;
        int y = (int) (p.y + field.getHeight() - warningIcon.getHeight() / 1.5);&lt;br /&gt;
        &lt;br /&gt;
        repaint(x, y, warningIcon.getWidth(), warningIcon.getHeight());&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private void loadImages() {&lt;br /&gt;
        try {&lt;br /&gt;
            warningIcon = ImageIO.read(getClass().getResource(&amp;quot;dialog-warning.png&amp;quot;));&lt;br /&gt;
        } catch (IOException ex) {&lt;br /&gt;
            ex.printStackTrace();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @Override&lt;br /&gt;
    protected void paintComponent(Graphics g) {&lt;br /&gt;
        for (JComponent invalid : invalidFields) {&lt;br /&gt;
            if (invalid.getParent() instanceof JViewport) {&lt;br /&gt;
                JViewport viewport = (JViewport) invalid.getParent();&lt;br /&gt;
                // the parent of the viewport is a JScrollPane&lt;br /&gt;
                invalid = (JComponent) viewport.getParent();&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            Point p = invalid.getLocationOnScreen();&lt;br /&gt;
            SwingUtilities.convertPointFromScreen(p, this);&lt;br /&gt;
            &lt;br /&gt;
            int x = p.x - warningIcon.getWidth() / 2;&lt;br /&gt;
            int y = (int) (p.y + invalid.getHeight() - warningIcon.getHeight() / 1.5);&lt;br /&gt;
            &lt;br /&gt;
            if (g.getClipBounds().intersects(x, y,&lt;br /&gt;
                    warningIcon.getWidth(), warningIcon.getHeight())) {&lt;br /&gt;
                g.drawImage(warningIcon, x, y, null);&lt;br /&gt;
            }&lt;br /&gt;
        }&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>