【问题标题】:Replacing the password character to dot in JPasswordField将密码字符替换为 JPasswordField 中的点
【发布时间】:2017-03-14 13:51:50
【问题描述】:

JPasswordField 的默认密码符号是一个点。

但这将被 Java Look and Feel 替换为星号。

有没有办法可以在加载外观后再次将此符号替换为点?

我已经知道在加载 Look and Feel 代码之前初始化或创建 JFrame 对象会执行此操作,所以请提出其他建议,例如 setEchoChar(char c)

【问题讨论】:

  • setEchoChar('·')...?
  • @Reimeus 实际的点 (.) 太小了……原来的那个更大了,看起来不错……还是谢谢……

标签: java swing character look-and-feel jpasswordfield


【解决方案1】:

import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.basic.*;
import javax.swing.text.*;

public class PasswordCharacterTest {
  public JComponent makeUI() {
    //@see com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java
    //"PasswordField.echoChar", new XPValue(new Character((char)0x25CF), new Character('*')),
    JPasswordField pf1 = new JPasswordField(24);
    pf1.setEchoChar('\u25CF');
    JPasswordField pf2 = new JPasswordField(24) {
      @Override public void updateUI() {
        super.updateUI();
        setUI(MyPasswordFieldUI.createUI(this));
      }
    };
    JPanel p = new JPanel();
    p.add(pf1);
    p.add(pf2);
    p.setBorder(BorderFactory.createEmptyBorder(20, 5, 10, 5));
    return p;
  }
  public static void main(String... args) {
    EventQueue.invokeLater(() -> {
      JFrame f = new JFrame();
      f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      f.getContentPane().add(new PasswordCharacterTest().makeUI());
      f.setSize(320, 240);
      f.setResizable(false);
      f.setLocationRelativeTo(null);
      f.setVisible(true);
    });
  }
}

class MyPasswordFieldUI extends BasicPasswordFieldUI {
  public static MyPasswordFieldUI createUI(JPasswordField c) {
    //TEST: c.setEchoChar('W');
    c.setEchoChar('O');
    return new MyPasswordFieldUI();
  }
  @Override public View create(Element elem) {
    return new MyPasswordView(elem);
  }
  private static class MyPasswordView extends PasswordView {
    @Override protected int drawEchoCharacter(Graphics g, int x, int y, char c) {
      Graphics2D g2 = (Graphics2D) g.create();
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                          RenderingHints.VALUE_ANTIALIAS_ON);
      FontMetrics fm = g2.getFontMetrics();
      int r = fm.charWidth(c) - 2;
      g2.setPaint(Color.RED);
      g2.fillOval(x + 1, y + 3 - fm.getAscent(), r, r);
      g2.dispose();
      return x + fm.charWidth(c);
    }
    protected MyPasswordView(Element element) {
      super(element);
    }
  }
}

【讨论】:

    【解决方案2】:

    这是 Unicode 格式的黑点列表。

    • ● - 黑圈
    • ⏺ - 记录黑圈
    • ⚫ - 中等黑圈
    • ⬤ - 黑色大圆圈
    • ⧭ - 带有向下箭头的黑色圆圈
    • 🞄 - 黑色小圆圈
    • • - 子弹
    • ∙ - 子弹运算符
    • ⋅ - 点运算符
    • 🌑 - 新月符号

    另见,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      相关资源
      最近更新 更多