Java – swing在窗体的文本字段中动作
我想用一些文本字段来开发一个表单。
例:
Name SecondName
这个想法是,每个文本字段内都有一个文本,如:
Insert your name Insert your second name
当你点击第一个文本字段来写你的名字,文本“插入你的名字”必须被删除…相同的必须发生的第二个文本字段(SecondName)。
效果必须是这样的:
我认为我只需要在文本字段上需要一个Action,当用户在文本字段上按下鼠标时,必须唤醒它,这有可能吗?
谢谢
看看SwingLabs SwingX库中的 PromptSupport
例如
当字段具有焦点时,“提示”将被隐藏,但是您可以控制此显示,直到用户键入内容或获得焦点时突出显示。
import java.awt.Dimension; import java.awt.EventQueue; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import org.jdesktop.swingx.prompt.BuddySupport; import org.jdesktop.swingx.prompt.PromptSupport; public class PromptSupportTest { public static void main(String[] args) { new PromptSupportTest(); } public PromptSupportTest() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { public TestPane() { JTextField firstName = new JTextField(10); PromptSupport.setPrompt("First Name", firstName); PromptSupport.setFocusBehavior(PromptSupport.FocusBehavior.HIDE_PROMPT, firstName); JTextField lastName = new JTextField(10); PromptSupport.setPrompt("Last Name", lastName); PromptSupport.setFocusBehavior(PromptSupport.FocusBehavior.HIDE_PROMPT, lastName); JTextField picture = new JTextField(10); PromptSupport.setPrompt("Picture", picture); PromptSupport.setFocusBehavior(PromptSupport.FocusBehavior.HIDE_PROMPT, picture); JButton browse = new JButton("..."); browse.setMargin(new Insets(0, 0, 0, 0)); browse.setContentAreaFilled(false); browse.setFocusPainted(false); browse.setFocusable(false); browse.setOpaque(false); // Add action listener to brose button to show JFileChooser... BuddySupport.addRight(browse, picture); setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.weightx = 1; add(firstName, gbc); add(lastName, gbc); add(picture, gbc); gbc.anchor = GridBagConstraints.CENTER; add(new JButton("Ok"), gbc); } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } } }
我还添加了一个BuddySupport
的例子,它是同一个API的一部分,它允许你与另一个文本组件“伙伴”。 在这里,我已经完成了经典的“文件浏览器”组合,但是我一直在“search”这样的字段。
看看文本提示一个简单的解决scheme,可以让您控制何时显示/隐藏文本以及文本的字体/颜色。
它将使用常规的文本组件。 以最简单的forms,您只需要一行额外的代码:
JTextField firstName = new JTextField(10); TextPrompt tp = new TextPrompt("First Name", firstName);
看到这个例子
import java.awt.Color; import java.awt.Font; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import javax.swing.JTextField; public class HintTextField extends JTextField { Font gainFont = new Font("Tahoma", Font.PLAIN, 11); Font lostFont = new Font("Tahoma", Font.ITALIC, 11); public HintTextField(final String hint) { setText(hint); setFont(lostFont); setForeground(Color.GRAY); this.addFocusListener(new FocusAdapter() { @Override public void focusGained(FocusEvent e) { if (getText().equals(hint)) { setText(""); setFont(gainFont); } else { setText(getText()); setFont(gainFont); } } @Override public void focusLost(FocusEvent e) { if (getText().equals(hint)|| getText().length()==0) { setText(hint); setFont(lostFont); setForeground(Color.GRAY); } else { setText(getText()); setFont(gainFont); setForeground(Color.BLACK); } } }); } }