如何在JTextArea中设置图像背景哪个文本显示在顶部?

时间:2015-05-13 16:41:01

标签: java swing jtextarea

我有问题。我需要使用JTextArea创建一个GUI,在其中我想设置一个背景图像。我创建了一个扩展JTextArea的类,并重写了paintComponent方法以插入图像。

图像现在可见但是当我调用setText方法时,文本隐藏在图像后面。怎么解决呢?

2 个答案:

答案 0 :(得分:1)

我们可以通过设置自定义用户界面来完成此操作:

static void decorate(JTextArea a, final BufferedImage img) {
    a.setUI(new javax.swing.plaf.basic.BasicTextAreaUI() {
        @Override
        protected void paintBackground(Graphics g) {
            g.drawImage(img, 0, 0, null);
        }
    });

    a.setPreferredSize(new Dimension(img.getWidth(), img.getHeight()));
    a.setForeground(Color.white);
    a.setCaretColor(Color.lightGray);
}

请参阅BasicTextUI#paintBackground

img area

(来自here的图片。)

答案 1 :(得分:0)

尝试在扩展JTextArea的类的构造函数中调用setOpaque(false)。将opaque设置为true会导致显示JTextArea的颜色背景和文本。

package demo;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JTextArea;

public class BackgroundDemo extends JFrame{

    public BackgroundDemo() {
        initUI();
    }

    public void initUI() {
        MyTextArea area = new MyTextArea();
        add(area);
        area.setText("Demo Text");

        pack();
        setSize(400, 400);
    }

    public static void main(String[] args) {
        BackgroundDemo demo = new BackgroundDemo();
        demo.setVisible(true);
    }
}

class MyTextArea extends JTextArea {

    public MyTextArea() {
        setOpaque(false);
        setVisible(true);
        setPreferredSize(new Dimension(400, 400));
    }

   @Override
   public void paintComponent(Graphics g) {
       super.paintComponent(g);

       try {
           BufferedImage image =    ImageIO.read(BackgroundDemo.class.getResource("/demo/background.png"));
           g.drawImage(image, 0, 0, this);
       } catch(IOException ioe) {
           ioe.printStackTrace();
       }
   }

}