在JTextArea下插入图像

所以我试图在JTextArea下面插入一个图像,但我没有多少运气,有人可以帮忙吗? 基本上我要问的是,是否有人可以帮助创建另一个类或子类来执行此操作。 inheritance我的代码:

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

}

查看背景面板 。 向面板添加滚动窗格时,它将使滚动窗格,视口和文本区域全部不透明,以便您可以看到图像。

基本问题是JTextArea将在paintComponent绘制它的背景和文本。

最简单的解决方案是使JTextArea透明并接管绘制背景的控制。

此示例基本上用背景颜色填充背景,绘制图像,然后调用super.paintComponent以允许渲染文本。

在此处输入图像描述

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