我在 JFrame 中有一个 JTextField。插入符号在看起来正常的插入符号和半绘制的插入符号之间闪烁。

插入符号仅显示在顶部和底部。我曾尝试使用自定义插入符号,但它们都只显示图形的一部分。密码字段的错误也是相同的。我不知道它是否相关,但我使用的是 mac,我没有 Windows 机器来测试该错误是否也发生在 Windows 上。
这是我的窗口的 MCVE(尽可能短):

public class Login1 extends JFrame implements Serializable {
private static final long serialVersionUID = 1L;

private JPanel pnl_mainPanel;
private JButton btn_login_main, btn_newAccount, btn_seeAccounts, btn_login_login, btn_cancel_login, btn_next, btn_cancel_new;
private JTextField tf_username_login, tf_username_new;
private JPasswordField pf_password, pf_password_new, pf_password_confirm;
private JLabel lbl_username_login, lbl_password_login, lbl_username_new, lbl_password_new, lbl_password_confirm;

private static final String TITLE = "Login";
private final int WINDOW_WIDTH = 400;
private final int WINDOW_HEIGHT = 300;
private final Dimension WINDOW_DIM = new Dimension(WINDOW_WIDTH, WINDOW_HEIGHT);

public Login1() {
    super(TITLE);
    setSize(WINDOW_DIM);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new BorderLayout());
    buildPanel();
    add(pnl_mainPanel);
    setVisible(true);
    setResizable(false);
}

private void buildPanel() {
    pnl_mainPanel = new JPanel();
    btn_login_main = new JButton("Login");
    btn_newAccount = new JButton("New Account");
    btn_seeAccounts = new JButton("ℹ");

    // login page
    btn_login_login = new JButton("Login");
    btn_cancel_login = new JButton("Cancel");
    tf_username_login = new JTextField();
    pf_password = new JPasswordField();
    lbl_username_login = new JLabel("Username:");
    lbl_password_login = new JLabel("Password:");

    // new account page
    btn_next = new JButton("Next");
    btn_cancel_new = new JButton("Cancel");
    tf_username_new = new JTextField();
    pf_password_new = new JPasswordField();
    pf_password_confirm = new JPasswordField();
    lbl_username_new = new JLabel("Username:");
    lbl_password_new = new JLabel("Password:");
    lbl_password_confirm = new JLabel("<html>Confirm<br>Password:</html>");

    pnl_mainPanel.setLayout(null);
    pnl_mainPanel.add(btn_login_main);
    pnl_mainPanel.add(btn_newAccount);
    pnl_mainPanel.add(btn_seeAccounts);

    btn_login_login.setSize(75, 30);
    btn_login_login.setLocation(new Point(310, 175));
    btn_cancel_login.setSize(75, 30);
    btn_cancel_login.setLocation(new Point(310, 215));
    tf_username_login.setSize(200, 25);
    tf_username_login.setLocation(new Point(100, 178));
    pf_password.setSize(200, 25);
    pf_password.setLocation(new Point(100, 218));
    lbl_username_login.setSize(100, 25);
    lbl_username_login.setLocation(new Point(15, 178));
    lbl_password_login.setSize(100, 25);
    lbl_password_login.setLocation(new Point(15, 218));

    btn_next.setSize(75, 30);
    btn_next.setLocation(new Point(310, 160));
    btn_cancel_new.setSize(75, 30);
    btn_cancel_new.setLocation(new Point(310, 200));
    tf_username_new.setSize(200, 25);
    tf_username_new.setLocation(new Point(100, 163));
    pf_password_new.setSize(200, 25);
    pf_password_new.setLocation(new Point(100, 203));
    pf_password_confirm.setSize(200, 25);
    pf_password_confirm.setLocation(new Point(100, 243));
    lbl_username_new.setSize(100, 25);
    lbl_username_new.setLocation(new Point(15, 163));
    lbl_password_new.setSize(100, 25);
    lbl_password_new.setLocation(new Point(15, 203));
    lbl_password_confirm.setSize(100, 30);
    lbl_password_confirm.setLocation(new Point(15, 238));

    btn_login_main.setSize(163, 100);
    btn_login_main.setLocation(new Point(25, 150));
    btn_newAccount.setSize(162, 100);
    btn_newAccount.setLocation(new Point(213, 150));
    btn_seeAccounts.setSize(20, 20);
    btn_seeAccounts.setLocation(new Point(375, 255));

    btn_login_main.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            pnl_mainPanel.remove(btn_login_main);
            pnl_mainPanel.remove(btn_newAccount);

            pnl_mainPanel.remove(btn_next);
            pnl_mainPanel.remove(btn_cancel_new);
            pnl_mainPanel.remove(tf_username_new);
            pnl_mainPanel.remove(pf_password_new);
            pnl_mainPanel.remove(pf_password_confirm);
            pnl_mainPanel.remove(lbl_username_new);
            pnl_mainPanel.remove(lbl_password_new);
            pnl_mainPanel.remove(lbl_password_confirm);

            pnl_mainPanel.add(btn_login_login);
            pnl_mainPanel.add(btn_cancel_login);
            pnl_mainPanel.add(tf_username_login);
            pnl_mainPanel.add(pf_password);
            pnl_mainPanel.add(lbl_username_login);
            pnl_mainPanel.add(lbl_password_login);
            repaint();
            tf_username_login.requestFocus();
        }
    });
    btn_cancel_login.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            pnl_mainPanel.remove(btn_login_login);
            pnl_mainPanel.remove(tf_username_login);
            pnl_mainPanel.remove(pf_password);
            pnl_mainPanel.remove(btn_cancel_login);
            pnl_mainPanel.remove(lbl_username_login);
            pnl_mainPanel.remove(lbl_password_login);
            pnl_mainPanel.add(btn_login_main);
            pnl_mainPanel.add(btn_newAccount);
            repaint();
        }
    });
    btn_newAccount.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            pnl_mainPanel.remove(btn_login_main);
            pnl_mainPanel.remove(btn_newAccount);
            pnl_mainPanel.add(btn_next);
            pnl_mainPanel.add(btn_cancel_new);
            pnl_mainPanel.add(tf_username_new);
            pnl_mainPanel.add(pf_password_new);
            pnl_mainPanel.add(pf_password_confirm);
            pnl_mainPanel.add(lbl_username_new);
            pnl_mainPanel.add(lbl_password_new);
            pnl_mainPanel.add(lbl_password_confirm);
            repaint();
            tf_username_new.requestFocus();
        }
    });
    btn_cancel_new.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            pnl_mainPanel.remove(btn_next);
            pnl_mainPanel.remove(btn_cancel_new);
            pnl_mainPanel.remove(tf_username_new);
            pnl_mainPanel.remove(pf_password_new);
            pnl_mainPanel.remove(pf_password_confirm);
            pnl_mainPanel.remove(lbl_username_new);
            pnl_mainPanel.remove(lbl_password_new);
            pnl_mainPanel.remove(lbl_password_confirm);
            pnl_mainPanel.add(btn_login_main);
            pnl_mainPanel.add(btn_newAccount);
            repaint();
        }
    });

}

public static void main(String[] args){
    Login1 l = new Login1();
}
}

提前致谢!

最佳答案

我可以确认这会发生在我的 Mac 上,而不会发生在我的 Linux 上。

通过将字段的高度更改为至少 28,可以轻松解决该问题。

tf_username_login.setSize(200, 28);

我的猜测是 Mac OS X 无法创建高度小于 28 像素的字段(尽管这可能是字体选择等问题,但我还没有测试过)。出于某种原因,它会以全高(28 像素)绘制完整的插入符号,但会以用户指定的大小 (25) 删除它,这会导致您注意到的现象。

关于java - JTextField 插入符号未正确显示,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28030898/

10-14 15:47