java - JTextField 添加在焦点上消失的灰色文本

标签 java swing

我希望我创建的窗口有 2 个文本字段,用于输入用户名和密码。如果我创建登录窗口,我希望这两个文本字段在这些文本字段中具有某种灰色文本,以指示在哪里放置用户名和密码。这可能吗?只是在网络上找不到任何好的答案,我不想以“糟糕”的方式处理 focusGained 和 focusLost 事件。

它应该看起来像这样供引用: Reference picture

代码在这里:

package com.sociuspugnae.login;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.SwingConstants;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import java.awt.Font;
import javax.swing.border.TitledBorder;
import javax.swing.JTextField;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class LoginWindow extends JFrame {

    private JPanel contentPane;
    private JTextField textFieldUsername;
    private JTextField textFieldPassword;

    /**
     * Create the frame.
     */
    public LoginWindow() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500, 250);
        setLocationRelativeTo(null);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);

        JLabel labelName = new JLabel(Main.name);
        labelName.setToolTipText("the program's name");
        labelName.setFont(new Font("Tahoma", Font.PLAIN, 20));
        labelName.setHorizontalAlignment(SwingConstants.CENTER);
        labelName.setBorder(new TitledBorder(null, "v " + Main.version, TitledBorder.LEADING, TitledBorder.TOP, null, null));

        textFieldUsername = new JTextField();
        textFieldUsername.addFocusListener(new FocusAdapter() {
            @Override
            public void focusLost(FocusEvent e) {
                if(textFieldUsername.getText().isEmpty()) {
                    textFieldUsername.setText("Username");
                }
            }
            @Override
            public void focusGained(FocusEvent e) {
                if(textFieldUsername.getText().equals("Username")) {
                    textFieldUsername.setText("");
                }
            }
        });
        textFieldPassword = new JTextField();
        textFieldPassword.setColumns(10);

        JButton buttonLogin = new JButton("Login");
        buttonLogin.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                if(textFieldUsername.getText().equals("Admin") && textFieldPassword.getText().equals("123")) {
                    JOptionPane.showMessageDialog(contentPane, "Login successful!");
                }


            }
        });
        GroupLayout gl_contentPane = new GroupLayout(contentPane);
        gl_contentPane.setHorizontalGroup(
            gl_contentPane.createParallelGroup(Alignment.TRAILING)
                .addGroup(gl_contentPane.createSequentialGroup()
                    .addGap(7)
                    .addComponent(labelName, GroupLayout.DEFAULT_SIZE, 462, Short.MAX_VALUE)
                    .addGap(7))
                .addGroup(gl_contentPane.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(textFieldUsername, GroupLayout.DEFAULT_SIZE, 203, Short.MAX_VALUE)
                    .addGap(50)
                    .addComponent(textFieldPassword, GroupLayout.DEFAULT_SIZE, 203, Short.MAX_VALUE)
                    .addContainerGap())
                .addGroup(gl_contentPane.createSequentialGroup()
                    .addGap(150)
                    .addComponent(buttonLogin, GroupLayout.DEFAULT_SIZE, 176, Short.MAX_VALUE)
                    .addGap(150))
        );
        gl_contentPane.setVerticalGroup(
            gl_contentPane.createParallelGroup(Alignment.LEADING)
                .addGroup(gl_contentPane.createSequentialGroup()
                    .addGap(7)
                    .addComponent(labelName, GroupLayout.PREFERRED_SIZE, 41, GroupLayout.PREFERRED_SIZE)
                    .addGap(18)
                    .addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
                        .addComponent(textFieldPassword, GroupLayout.DEFAULT_SIZE, 50, Short.MAX_VALUE)
                        .addComponent(textFieldUsername, GroupLayout.DEFAULT_SIZE, 50, Short.MAX_VALUE))
                    .addGap(29)
                    .addComponent(buttonLogin, GroupLayout.PREFERRED_SIZE, 59, GroupLayout.PREFERRED_SIZE))
        );
        contentPane.setLayout(gl_contentPane);
    }
}

最佳答案

您可以重写 JTextField 的 PaintComponent 方法,如下所示:

public class MyTextField extends JTextField {
.
.
@Override
public void paintComponent(Graphics g) {
  super.paintComponent(g);
  if (this.getText().equals("")){
     g drawString( ...);
  }
}

}

关于java - JTextField 添加在焦点上消失的灰色文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49688971/

相关文章:

java - 删除 JTable 中的所有行

java - 使用 itext 重新排序 PDF 页面

java - 无法解析为变量 - gui Controller 代码

java - txt 文件中存储的文件的资源管理器 View

java - 在二维数组中查找重复值

java - 如何关闭一个特定 JLabel 的抗锯齿功能?

java - 使用 JScrollPane 添加时 JTable 不可见

java - 与声音关联的应用程序飞出模拟器

java - 使用 ajax 将 javascript 变量传递给 servlet

java - ArrayList 检查同一索引处两个对象值的组合