Java JLayer decorate a password field

Description

Java JLayer decorate a password field

import java.awt.AWTEvent;
import java.awt.AlphaComposite;
import java.awt.BorderLayout;
import java.awt.Composite;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayer;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.plaf.LayerUI;

class PasswordLayerUI extends LayerUI<JPanel> {

   private String errorMessage = "Password too short";

   @Override//from  ww w . ja  v a  2  s  .co m
   public void paint(Graphics g, JComponent c) {
      FontMetrics fontMetrics;
      Font font;
      int height;
      int width;

      super.paint(g, c);
      Graphics2D g2d = (Graphics2D) g.create();
      int componentWidth = c.getWidth();
      int componentHeight = c.getHeight();

      // Display error message
      g2d.setFont(c.getFont());
      fontMetrics = g2d.getFontMetrics(c.getFont());
      height = fontMetrics.getHeight();
      g2d.drawString(errorMessage, componentWidth / 2 + 10, componentHeight / 2 + height);

      // Display watermark
      String displayText = "Beta Version";
      font = new Font("Castellar", Font.PLAIN, 16);
      fontMetrics = g2d.getFontMetrics(font);
      g2d.setFont(font);
      width = fontMetrics.stringWidth(displayText);
      height = fontMetrics.getHeight();

      Composite com = g2d.getComposite();
      AlphaComposite ac = AlphaComposite.getInstance(((AlphaComposite) com).getRule(), 0.25f);
      g2d.setComposite(ac);
      g2d.drawString(displayText, (componentWidth - width) / 2, (componentHeight - height) / 2);

      g2d.dispose();
   }

   @Override
   public void installUI(JComponent component) {
      super.installUI(component);
      ((JLayer) component).setLayerEventMask(AWTEvent.KEY_EVENT_MASK);
   }

   @Override
   public void uninstallUI(JComponent component) {
      super.uninstallUI(component);
      ((JLayer) component).setLayerEventMask(0);
   }

   protected void processKeyEvent(KeyEvent event, JLayer layer) {
      JTextField f = (JTextField) event.getSource();
      if (f.getText().length() < 6) {
         errorMessage = "Password too short";
      } else {
         errorMessage = "";
      }
      layer.repaint();
   }
}
public class Main extends JFrame {
   public Main() {
      this.setTitle("Example");
      this.setSize(300, 100);
      this.setLocationRelativeTo(null);
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      LayerUI<JPanel> layerUI = new PasswordLayerUI();
      JLayer<JPanel> jlayer = new JLayer<JPanel>(getPanel(), layerUI);
      this.add(jlayer);
   }
   private JPanel getPanel() {
      JPanel panel = new JPanel(new BorderLayout());

      JPanel gridPanel = new JPanel(new GridLayout(1, 2));
      JLabel quantityLabel = new JLabel("Password");
      gridPanel.add(quantityLabel);
      JPasswordField passwordField = new JPasswordField();
      gridPanel.add(passwordField);
      panel.add(gridPanel, BorderLayout.CENTER);

      JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
      JButton okButton = new JButton("OK");
      buttonPanel.add(okButton);
      JButton cancelButton = new JButton("Cancel");
      buttonPanel.add(cancelButton);
      panel.add(buttonPanel, BorderLayout.SOUTH);

      return panel;
   }

   public static void main(String[] args) {
//        JFrame.setDefaultLookAndFeelDecorated(true);

      SwingUtilities.invokeLater(new Runnable() {

         @Override
         public void run() {
            Main window = new Main();
            window.setVisible(true);
         }
      });

   }
}



PreviousNext

Related