我正在尝试使用图像和提示创建一个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); } }更多推荐
发布评论