Replace JTextField with an Image?

泪湿孤枕 提交于 2019-12-13 04:53:28

问题


I've been searching on way's to replace a JTextField with an Image & nothing comes up. Is it possible to add a jtextfield onto an image or replace on with an image?

I'm using a JPanel & I am trying to put the JtextField inside the image below:


回答1:


There are several ways this might be achieved...

The simplest might be to use a JLabel, set it's layout manager to something BorderLayout and simply add the text field to it...

JTextField field = new JTextField();
field.setOpaque(false);
JLabel label = new JLabel();
label.setIcon(...);
label.setLayout(new BorderLayout());
label.add(field);

For example...

This will generate...

If you prefer the text field to be transparent, you could add field.setBackground(new Color(0, 0, 0, 0));, which generates...

And if you don't want the border, add field.setBorder(null);, which generates...

Updated with another example...

Or perhaps you'd prefer a self contained class...

This is a little tricky, because paintComponent not only paints the background, but the text, you need some way to insert the background under the text. To this end, I don't actually call super.paintComponent, but instead, we cheat, and call getUI().paint directly. This ensures that the text of the field is painted, but allows us to paint our own background before it...

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;

public class BackgroundTextField {

    public static void main(String[] args) {
        new BackgroundTextField();
    }

    public BackgroundTextField() {
        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 TextFieldBackground());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TextFieldBackground extends JTextField {

        private BufferedImage img;

        public TextFieldBackground() {
            setColumns(10);
            setOpaque(false);
            setBorder(new EmptyBorder(2, 2, 2, 2));
            setBackground(new Color(0, 0, 0, 0));
            try {
                img = ImageIO.read(getClass().getResource("/y9yBe.jpg"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return img == null ? super.getPreferredSize() : new Dimension(img.getWidth(), img.getHeight());
        }

        @Override
        protected void paintComponent(Graphics g) {
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.drawImage(img, 0, 0, this);
            getUI().paint(g2d, this);
            g2d.dispose();
        }

    }

}

There are limitations to this, the field should never be bigger then the image, as the image is not repeated, but I'm sure you could use a for-loop to stitch a bunch of images together...



来源:https://stackoverflow.com/questions/20296131/replace-jtextfield-with-an-image

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!