Inserting an image under a JTextArea

前端 未结 2 1877
梦谈多话
梦谈多话 2020-12-04 04:31

so I\'m trying to insert an image underneath a JTextArea, but I havent had much luck, could anyone please help? Basically what I\'m asking is if anybody could help make anot

2条回答
  •  有刺的猬
    2020-12-04 05:06

    The basic issue is that JTextArea will paint it's background and it's text within the paintComponent.

    The simplest solution is to make the JTextArea transparent and take over the control of painting the background.

    This example basically fills the background with the background color, paints the image and then calls super.paintComponent to allow the text to be rendered.

    enter image description here

    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    public class TransparentTextArea {
    
        public static void main(String[] args) {
            new TransparentTextArea();
        }
    
        public TransparentTextArea() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    JFrame frame = new JFrame("Test");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(new JScrollPane(new CustomTextArea()));
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
    
            });
        }
    
        public class CustomTextArea extends JTextArea {
    
            private BufferedImage image;
    
            public CustomTextArea() {
                super(20, 20);
                try {
                    image = ImageIO.read(new File("/Users/swhitehead/Dropbox/MegaTokyo/Miho_Small_02.png"));
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
    
            @Override
            public boolean isOpaque() {
                return false;
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                Graphics2D g2d = (Graphics2D) g.create();
                g2d.setColor(getBackground());
                g2d.fillRect(0, 0, getWidth(), getHeight());
                if (image != null) {
                    int x = getWidth() - image.getWidth();
                    int y = getHeight() - image.getHeight();
                    g2d.drawImage(image, x, y, this);    
                }
                super.paintComponent(g2d);
                g2d.dispose();
            }
    
        }
    
    }
    

提交回复
热议问题