【问题标题】:Java - swing listen an action in a text field of a formJava - 在表单的文本字段中监听动作
【发布时间】:2013-12-14 01:11:31
【问题描述】:

我想开发一个带有一些文本字段的表单。
示例:

Name
SecondName

想法是每个文本字段都包含如下文本:

Insert your name
Insert your second name

当您单击第一个文本字段以写入您的姓名时,必须删除文本“插入您的姓名”......第二个文本字段(SecondName)也必须这样做。
效果应该是这样的:

我认为我只需要在文本字段上执行一个操作,当用户在文本字段上按下鼠标时必须唤醒它,这可能吗?
谢谢

【问题讨论】:

    标签: java forms swing


    【解决方案1】:

    看看PromptSupport中的SwingLabs SwingX Library

    举例

    当字段获得焦点时,“提示”将被隐藏,但您可以控制它,使其显示直到用户键入内容或获得焦点时突出显示。

    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 的一部分,它允许您将另一个组件与文本组件“结成伙伴”。这里我做了经典的“文件浏览器”组合,但我一直在做这样的“搜索”样式字段……

    【讨论】:

    • +1 我只是想发表一个例子:D 好答案 :)。其实他也可能对BuddySupport感兴趣
    • @nachokk 天哪!我爱BuddySupport
    • 谢谢,但我不知道如何下载和设置库 PromptSupport。我的意思是:我必须下载哪个 jar 文件?我必须把这个文件放在哪里?谢谢
    • swingx-all-1.6.3.jar 开头...我可能还会获取JavaDocs 的副本。放在哪里取决于您使用的 IDE。在 Netbeans 中,我保留了一个不错的“公共库”文件夹,用于存储我经常重复使用的库,然后简单地将其添加到项目“库”中
    • @MadProgrammer 谢谢它完美运行,请帮我向墨尔本问好;)
    【解决方案2】:

    查看Text Prompt 以获得一个简单的解决方案,让您可以控制文本何时显示/隐藏以及文本的字体/颜色。

    它将与常规文本组件一起使用。在最简单的形式中,您只需要一行额外的代码:

    JTextField firstName = new JTextField(10);
    TextPrompt tp = new TextPrompt("First Name", firstName);
    

    【讨论】:

      【解决方案3】:

      看这个例子

      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);  
               }  
             }  
           });  
      
         }  
       }  
      

      【讨论】:

      • 如果您以编程方式调用setText 会发生什么?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多