【问题标题】:How can I set an image background in JTextArea which text shows over top of?如何在 JTextArea 中设置文本显示在顶部的图像背景?
【发布时间】:2015-05-13 16:41:01
【问题描述】:

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

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

【问题讨论】:

  • 请出示相关代码
  • @Sybren 代码将如何提供帮助,因为如果我们按照 OP 所描述的那样去做,结果将只是他们所描述的那样?您将从检查代码中学到什么? (根据他们的描述,代码显然运行正常,尽管它并没有按照他们的意愿行事。)

标签: java swing jtextarea


【解决方案1】:

我们可以通过设置自定义 UI 来做到这一点:

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

(图片来自here。)

【讨论】:

    【解决方案2】:

    尝试在扩展 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();
           }
       }
    
    }
    

    【讨论】:

    • 那么您是说他们可以在文本区域后面的面板上绘制图像吗? (或者也许在文本区域绘制图像,然后调用super.paintComponent?)
    • 我添加了一些代码,并且可以使用 super.paintComponent。
    猜你喜欢
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    相关资源
    最近更新 更多