单击JTextField中的图标并清除其内容(Click on icon in a JTextField and clear its content)

编程入门 行业动态 更新时间:2024-10-23 14:20:19
单击JTextField中的图标并清除其内容(Click on icon in a JTextField and clear its content)

我正在尝试使用图像和提示创建一个JTextField。 文本字段的功能是搜索某些书籍的搜索字段。 现在,我想再往前走一点。 我想给图像一个功能。 例如,如果我单击图像,则应清除文本字段中的文本。

为了实现这个实现,我创建了一个新类并使用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但它没有工作。

我希望我没有走错方向。

对不起,很长的帖子,但我真的很感激,得到一些建议。

I am trying to create a JTextField with an image and a hint. The function of the textfield is a search field to search some books. Now, I like to go a little bit further. I would like to give the image a function. For example, if I click on the image the text in the textfield should be cleared.

To achieve this implementation I created a new class and extended it with JTextField.

This is the code:

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

}

And this is where I create the fields;

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

Now back to my question. Do you have any idea how I can give the image a function where the text will be automatically cleared? I tried to implement a MouseListener and set the text of "txtSearchBooks" to null but it hasn't worked.

I hope I didn't go off in the wrong direction.

Sorry for the long post but I would really appreciate to get some advice.

最满意答案

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

A JTextField is a JComponent, meaning it is also a container for other components. You can use the add(Component c) method to add other components to it. BUT A JTextField won't show its added components unless you provide a LayoutManager to it. Then it behaves just like a normal JPanel.

I made a small example how you can manage what you need. The label is showed to the right, and clicking it will clear the field. You can use a button as well, instead of label.

Please note you don't need to create the Image object from scratch as I do, you can load it from a file. I create it this way so that the example doesn't rely on other files.

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

更多推荐

本文发布于:2023-07-04 16:57:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1026890.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:单击   图标   内容   JTextField   content

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!