【问题标题】:Replace JTextField with an Image?用图像替换 JTextField?
【发布时间】:2013-11-30 03:24:26
【问题描述】:

我一直在寻找用图像替换 JTextField 的方法,但没有任何结果。是否可以在图像上添加 jtextfield 或用图像替换?

我正在使用 JPanel,我正在尝试将 JtextField 放入下图中:

【问题讨论】:

    标签: java image swing jpanel jtextfield


    【解决方案1】:

    有几种方法可以实现...

    最简单的可能是使用JLabel,将其布局管理器设置为BorderLayout,然后将文本字段添加到其中...

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

    例如...

    这将产生...

    如果您希望文本字段透明,可以添加field.setBackground(new Color(0, 0, 0, 0));,它会生成...

    如果你不想要边框,添加field.setBorder(null);,它会生成...

    更新了另一个示例...

    或者您可能更喜欢自包含类...

    这有点棘手,因为paintComponent 不仅画了背景,还画了文字,你需要一些方法在文字下面插入背景。为此,我实际上并没有打电话给super.paintComponent,而是我们作弊,直接打电话给getUI().paint。这确保了该字段的文本被绘制,但允许我们在它之前绘制我们自己的背景......

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

    这是有限制的,字段永远不能大于图像,因为图像不会重复,但我相信你可以使用for-loop将一堆图像拼接在一起......

    【讨论】:

    • 这不是我想要的。 :/ 我试图能够输入数据并且没有 JTextField 的边框。只是闪烁的“|”事情。
    • 所以,你需要使用最后三个选项,setOpaque(false)setBackground(new Color(0, 0, 0, 0))setBorder(null),我以为我填写了...
    猜你喜欢
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多