Inserting an image under JTextArea

so I am trying to insert an image under the JTextArea but I have no luck, can anyone help? Basically, I'm asking if anyone can help make another class or subclass that does this. Here is my code:

import java.awt.*;
import javax.swing.*;


public class t{
    private JFrame f; //Main frame
    private JTextArea t; // Text area   private JScrollPane sbrText; // Scroll pane for text area
    private JButton btnQuit; // Quit Program

    public t(){ //Constructor
        // Create Frame
        f = new JFrame("Test");         
        f.getContentPane().setLayout(new FlowLayout());         
        String essay = "Test"; 
        // Create Scrolling Text Area in Swing
        t = new JTextArea(essay, 25, 35);
        t.setEditable(false); 
        Font f = new Font("Verdana", Font.BOLD, 12 );
        t.setFont( f );         
        t.setLineWrap(true);        
        sbrText = new JScrollPane(t);
        sbrText.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
                // Create Quit Button
        btnQuit = new JButton("Quit");
        btnQuit.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    System.exit(0);         
                }           }       );
    }


    public void launchFrame(){ // Create Layout
        // Add text area and button to frame 
       f.getContentPane().add(sbrText);
        f.getContentPane().add(btnQuit);
                 // Close when the close button is clicked
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Display Frame
        f.pack(); // Adjusts frame to size of components
        f.setSize(450,480);
        f.setResizable(false);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String args[]){
        t gui = new t();     
        gui.launchFrame();
    } 

      

}

0


source to share


2 answers


Review the Background Panel . When you add a scrollpane to the panel, it will make the scrollpane, viewport and text area all opaque so you can see the image.



+1


source


The main problem is what JTextArea

will draw its background and text in paintComponent

.

The simplest solution is to make the transparency JTextArea

transparent and take control of the background painting.

This example basically fills the background with the background color, draws the image, and then calls super.paintComponent

for the text to be displayed.



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

    }

}

      

+1


source







All Articles