Java – заполнитель в текстовом поле

Я пытаюсь создать графический интерфейс с Swing. Моя проблема в том, что у меня есть текстовое поле, но я хочу, чтобы у него был «placeholder» (например, в html). Я читал здесь и там, что это можно сделать, переопределив paint () текстового поля.

Поскольку мой код сгенерирован, я обнаружил, что мне нужно использовать «код пользовательского создания», чтобы переопределить созданный код.

Вот что я добавил в поле «Код пользовательского создания»

new javax.swing.JTextField() { String test = super.getText(); String hint = "Username"; public void paint(Graphics g) { if ( test == null || test.length() < 1 ) { g.setColor( Color.red ); g.drawString(hint, 0, 0); } g.setColor(Color.BLACK); super.paint(g); } } 

Это генерирует следующий вывод

 javax.swing.JTextField username = new javax.swing.JTextField() { String test = super.getText(); String hint = "Username"; public void paint(Graphics g) { if ( test == null || test.length() < 1 ) { g.setColor( Color.red ); g.drawString(hint, 0, 0); } g.setColor(Color.BLACK); super.paint(g); } }; 

На данный момент я вижу textField, но в нем ничего нет, может быть, мне нужно добавить некоторую функцию на какое-то событие, но я не уверен.

Буду признателен, если кто-нибудь сможет протянуть руку.

EDIT: Вот демонстрация того, что я хочу сделать: http://davidwalsh.name/demo/html5-placeholder.php

Я нашел это на форумах oracleа.

 public class TextFieldWithPrompt extends JTextField{ @Override protected void paintComponent(java.awt.Graphics g) { super.paintComponent(g); if(getText().isEmpty() && ! (FocusManager.getCurrentKeyboardFocusManager().getFocusOwner() == this)){ Graphics2D g2 = (Graphics2D)g.create(); g2.setBackground(Color.gray); g2.setFont(getFont().deriveFont(Font.ITALIC)); g2.drawString("zip", 5, 10); //figure out x, y from font's FontMetrics and size of component. g2.dispose(); } } 

https://forums.oracle.com/forums/thread.jspa?threadID=1349874

Я использую, чтобы переопределить метод рисования текстовых полей, пока у меня не появилось больше пользовательских текстовых полей, тогда я действительно хотел …

Затем я нашел этот API подсказок, который прост в использовании и не требует, чтобы вы расширили любые компоненты. Он также имеет приятный API-интерфейс «приятель»

Это теперь включено в SwingLabs, SwingX-библиотеку, которая позволяет даже использовать eaiser …

Попробуй это.

 private void txtUserNameFocusGained(java.awt.event.FocusEvent evt) { String username = txtUserName.getText(); if(username.equals("User Name")){ txtUserName.setCaretPosition(0); } } private void txtUserNameFocusLost(java.awt.event.FocusEvent evt) { String username = txtUserName.getText(); if(username.equals("")){ txtUserName.setForeground(new java.awt.Color(86, 86, 86)); txtUserName.setCaretPosition(0); txtUserName.setText("User Name"); } } private void txtUserNameKeyPressed(java.awt.event.KeyEvent evt) { String username = txtUserName.getText(); if(username.equals("User Name")){ txtUserName.setForeground(new java.awt.Color(0, 0, 0)); txtUserName.setText(null); txtUserName.setCaretPosition(0); } } 

Будьте внимательны, имя текстового поля – «txtUserName». Вы можете видеть вывод таким образом.

описание изображения здесь

Давайте будем гением компьютера.