java - 单击 JTextField 中的图标并清除其内容

标签 java click icons jtextfield

我正在尝试创建一个带有图像和提示的 JTextField。 textfield 的功能是搜索一些书籍的搜索字段。现在,我想更进一步。我想给图像一个功能。例如,如果我单击图像,文本字段中的文本应该被清除。

为实现此实现,我创建了一个新类并使用 JTextField 对其进行了扩展。

这是代码:

public class JSearchTextField extends JTextField implements FocusListener {

/**
 * 
 */
private static final long serialVersionUID = 1L;
private String textWhenNotFocused;
private Icon icon;
private Insets dummyInsets;
private JTextField dummy;

public JSearchTextField() {
    super();

    Border border = UIManager.getBorder("TextField.border");
    dummy = new JTextField("Suchen...");
    this.dummyInsets = border.getBorderInsets(dummy);

    icon = new ImageIcon(JSearchTextField.class.getResource("/images/clearsearch.png"));
    this.addFocusListener(this);

}

public JSearchTextField(String textWhenNotFocused) {
    this();
    this.textWhenNotFocused = textWhenNotFocused;
}

public void setIcon(ImageIcon newIcon){
    this.icon = newIcon;
}

public String getTextWhenNotFocused() {
    return this.textWhenNotFocused;
}

public void setTextWhenNotFocused(String newText) {
    this.textWhenNotFocused = newText;
}

public void paintComponent(Graphics g){
    super.paintComponent(g);

    int textX = 2;

    if(!this.hasFocus() && this.getText().equals("")) {
        int height = this.getHeight();
        Font prev = this.getFont();
        Font italic = prev.deriveFont(Font.ITALIC);
        Color prevColor = g.getColor();
        g.setFont(italic);
        g.setColor(UIManager.getColor("textInactiveText"));
        int h = g.getFontMetrics().getHeight();
        int textBottom = (height - h) / 2 + h - 4;
        int x = this.getInsets().left;
        Graphics2D g2d = (Graphics2D) g;
        RenderingHints hints = g2d.getRenderingHints();
        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
                             RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g2d.drawString(textWhenNotFocused, x, textBottom);
        g2d.setRenderingHints(hints);
        g.setFont(prev);
        g.setColor(prevColor);
    } else {
        int iconWidth = icon.getIconWidth();
        int iconHeight = icon.getIconHeight();
        int x = dummy.getWidth() + dummyInsets.right;
        textX = x - 420;
        int y = (this.getHeight() - iconHeight)/2;
        icon.paintIcon(this, g, x, y);
    }

    setMargin(new Insets(2, textX, 2, 2));

}
@Override
public void focusGained(FocusEvent arg0) {
    this.repaint();
}

@Override
public void focusLost(FocusEvent arg0) {
    this.repaint();
}

这是我创建字段的地方;

txtSearchBooks = new JSearchTextField("Buch suchen...");

现在回到我的问题。您知道如何为图像提供自动清除文本的功能吗?我试图实现一个 MouseListener 并将“txtSearchBooks”的文本设置为 null 但它没有用。

我希望我没有走错方向。

抱歉发了这么长的帖子,但我真的很感激能得到一些建议。

最佳答案

JTextField 是一个JComponent,这意味着它也是其他组件的容器。您可以使用 add(Component c) 方法向其中添加其他组件。但是 JTextField 不会显示其添加的组件,除非您向它提供 LayoutManager。然后它的行为就像一个普通的 JPanel

我举了一个小例子,说明您可以如何管理所需内容。标签显示在右侧,单击它会清除该字段。您也可以使用按钮代替标签。

请注意,您不需要像我一样从头开始创建 Image 对象,您可以从文件中加载它。我以这种方式创建它,以便该示例不依赖于其他文件。

public class TextFieldWithLabel {
    public static void main(String[] args) 
    {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JTextField textField = new JTextField("Search...");
        textField.setLayout(new BorderLayout());

        //creating dummy image...
        Image image = new BufferedImage(25, 25, BufferedImage.TYPE_INT_RGB);
        Graphics graphics = image.getGraphics();
        graphics.setColor(Color.WHITE);
        graphics.fillRect(0, 0, 25, 25);
        graphics.setColor(Color.RED);
        graphics.fillRect(2, 11, 21, 3);
        graphics.fillRect(11, 2, 3, 21);

        JLabel label = new JLabel(new ImageIcon(image));
        textField.add(label, BorderLayout.EAST);
        label.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                textField.setText("");
            }
        });
        frame.add(textField);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

关于java - 单击 JTextField 中的图标并清除其内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13767514/

相关文章:

angularjs - UI Bootstrap anchor 在 Accordion 标题中不起作用

jquery - 单击以显示,然后单击另一个时将其隐藏

html - 移动图标 - 像素

windows - 如何使用 Delphi 从文件扩展名中获取图标和描述?

java - 生命周期配置未涵盖的插件执行 : com. jayway.maven.plugins.android.generation2 :android-maven-plugin:3. 8.2:consume-aar

java - JSR-303 子类验证

java - JPA RollbackException 但不在单元测试中

java - 如何使用 junit 对 HttpClient 重试逻辑进行单元测试

javascript - 延迟 CSS 渲染,而 Javascript 可以正常工作

python - 带有图标的 py2exe setup.py