使用 Nimbus Look And Feel 时无法在 JTextArea 背景上绘制图像

2023-12-14

我正在绘制图像JTextArea背景,它是使用其他外观和感觉(金属、Windows 等)绘制的,但是当我使用Nimbus外观和感觉它不绘制图像可能是什么问题以及如何解决该问题? 这是我正在使用的代码

图片文本区域类

public class ImageTextArea extends JTextArea{
    File image;
    public ImageTextArea(File image)
    {
        setOpaque(false);
        this.image=image;
    }

    @Override
    public void paintComponent(final Graphics g)
    {
        try
        {
            // Scale the image to fit by specifying width,height
            g.drawImage(new ImageIcon(image.getAbsolutePath()).getImage(),0,0,getWidth(),getHeight(),this);
            super.paintComponent(g);
        }catch(Exception e){}
    }
}

和测试类

public class TestImageTextArea extends javax.swing.JFrame {

    private ImageTextArea tx;

    public TestImageTextArea() {
        tx = new ImageTextArea(new File("img.jpg"));
        setTitle("this is a jtextarea with image");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JPanel mainp = new JPanel(new BorderLayout());
        add(mainp);
        mainp.add(new JScrollPane(tx), BorderLayout.CENTER);
        setSize(400, 400);
    }

    public static void main(String args[]) {
/*
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (Exception ex) {
            System.out.println("Unable to use Nimbus LnF: "+ex);
        }
*/
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new TestImageTextArea().setVisible(true);
            }
        });
    }

}

当我删除评论时,它不会绘制图像。


基本上,当你打电话时super.paintComponent,它将调用 UI delgate 的update方法。这就是奇迹发生的地方。

下面是 Nimbus 的SynthTextAreaUI执行

public void update(Graphics g, JComponent c) {
    SynthContext context = getContext(c);

    SynthLookAndFeel.update(context, g);
    context.getPainter().paintTextAreaBackground(context,
                      g, 0, 0, c.getWidth(), c.getHeight());
    paint(context, g);
    context.dispose();
}

正如您所看到的,它实际上绘制了背景,而不考虑组件的不透明状态,然后调用paint,这将调用BasicTextUI.paint方法(通过super.paint)

这很重要,因为BasicTextUI.paint实际上绘制了文本。

那么,这对我们有什么帮助呢?通常情况下,我会把不打电话的人钉在十字架上super.paintComponent,但这正是我们要做的,但我们会提前知道我们要承担的责任。

首先,我们要承担以下责任update,填充背景,绘制我们的背景然后调用paint在 UI 委托上。

enter image description here

import java.awt.BorderLayout;
import java.awt.Color;
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 java.util.logging.Level;
import java.util.logging.Logger;
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 NimbusTest {

    public static void main(String[] args) {
        new NimbusTest();
    }

    public NimbusTest() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new JScrollPane(new TestTextArea()));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestTextArea extends JTextArea {

        private BufferedImage bg;

        public TestTextArea() {
            try {
                bg = ImageIO.read(new File("C:\\Users\\swhitehead\\Documents\\My Dropbox\\Ponies\\Rainbow_Dash_flying_past_3_S2E16.png"));
            } catch (IOException ex) {
                Logger.getLogger(NimbusTest.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        @Override
        protected void paintComponent(Graphics g) {
            Graphics2D g2d = (Graphics2D) g.create();
            // Fill the background, this is VERY important
            // fail to do this and you will have major problems
            g2d.setColor(getBackground());
            g2d.fillRect(0, 0, getWidth(), getHeight());
            // Draw the background
            g2d.drawImage(bg, 0, 0, this);
            // Paint the component content, ie the text
            getUI().paint(g2d, this);
            g2d.dispose();
        }

    }
}

不犯错误。如果您没有正确执行此操作,它不仅会损坏该组件,而且可能会损坏屏幕上的大多数其他组件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Nimbus Look And Feel 时无法在 JTextArea 背景上绘制图像 的相关文章

随机推荐

  • 在java程序中创建暂停或等待效果

    我正在用 Java 编写一个简单的钓鱼模拟器游戏 我希望每次施法后都有一个随机生成的等待时间 当等待结束时 会发生随机事件 一条鱼会被捕获 一条鱼会咬住你的鱼饵 等等 我听说过很多关于 Thread sleep 的坏事 并且想知道在这种情况
  • JAXB - 将动态生成的名称空间移动到文档根目录

    我有这个 POJO 封装了 Atom 条目的动态非嵌套元素 public class SimpleElement private Namespace namespace private String tagName private Stri
  • 如何在 Eclipse Swing 项目中使用 JavaFX

    我想在 Swing 应用程序中使用一些 JavaFX 组件 尤其是 JFXPanel 因为它支持 HTML 5 渲染 我的应用程序当前在 Eclipse 4 3 Kepler 中设置 并且我的计算机上安装了最新的 Java 7 JDK 本教
  • 在 Google Chrome 扩展程序中使用 Stripe 信用卡表单 - 无法避免“付款不安全?”

    我正在尝试在浏览器弹出窗口中获取一个简单的 Stripe 信用卡表单 以用于 google chrome 扩展 然而 在最新版本的 Chrome 中 信用卡表单始终附有 付款不安全 的消息 付款不安全 我已经在这里阅读了 google ch
  • Python 中的统计累加器

    统计累加器允许执行增量计算 例如 为了计算在任意时间给出的数字流的算术平均值 可以创建一个对象来跟踪当前给出的项目数 n以及它们的总和 sum 当一个人请求平均值时 该对象只是返回sum n 像这样的累加器允许您增量计算 即当给定新数字时
  • 可扩展字符串错误

    我试图在警报对话框中显示一些文本作为超链接 该过程的一部分要求我使用 SpannableString 来格式化一些文本 问题是我的应用程序在代码的 SpannableString 部分遇到运行时错误 TextView Tv TextView
  • 返回承诺时自定义异步验证不起作用

    我正在调用 Web api 来检查 urlalias 是否可用 对于此任务 我在异步验证器中使用 httpservice 问题是 当调用验证器时 将执行所有正确的代码路径 所有console log 运行并按预期运行 验证的承诺是否返回 解
  • 将 calendar_date_select 与 Rails 3 结合使用

    我一直在尝试在注册过程中创建用户出生日期选择字段 代码如下所示 div h3 Register h3 div style width 374px margin 0 auto div div div div div div
  • 在处理传入请求之前,如何在“TISAPIApplication”中建立 ADO 数据库连接?

    TADOConnectionDelphi ISAPI 应用程序的应用程序初始化部分无法连接 TISAPIApplication 应用程序是使用 Delphi XE SPI 构建的 运行 Win 7 64 IIS 7 5 和 WinServe
  • Excel VBA:具有不同文件扩展名的 SaveCopyAs

    我有一个扩展名为 xlsb 的 Excel 文件 并使用其宏根据内容生成其他几个 Excel 工作表 宏的工作方式是更改原始 Excel 文件 然后使用SaveCopyAs方法保存生成的 Excel 工作表 生成的 Excel 工作表应以
  • 发布时如何设置ASPNETCORE_ENVIRONMENT?

    我有几个 WebDeploy 发布配置文件 可将我的 NET Core Web 项目部署到各个位置 开发 QA IIS 上的阶段 为了让应用程序知道它在哪里运行 我需要设置 ASPNETCORE ENVIRONMENT 环境变量 是否可以在
  • 来自特定麦克风的 Web Audio Api 输入

    我正在使用 Web Audio Api navigator getUserMedia audio true function function 进行音频录制 如果用户有多个麦克风设备 我可以选择所需的录音设备吗 我遇到过一个有问题的情况 一
  • 在 sed 中使用美元符号进行变量替换和字符

    我尝试使用 sed 更改名为 fusion gnu 的文件中的一行 我有一个名为lafila 这是一个文件名 目前 我可以这样做 lafila nGas060 dat sed i 6s plot lafila using 1 2 with
  • 即时应用程序模块在另一个非基本模块中搜索资源

    我正在开发一个即时应用程序 它有base模块和 2 个功能模块 feature1 and feature2 当我尝试启动时遇到奇怪的崩溃feature2活动 java lang RuntimeException Unable to star
  • x86除法异常-返回地址

    当尝试在 x86 程序集中为引导加载程序编写一些例程时 我遇到了一个错误 当发生除法错误时 程序将陷入无限循环 通过调查 我发现调用 int 0 会正常通过异常处理程序 然后继续执行程序的其余部分 我自己为 x86 编写了异常处理程序 发生
  • 如何访问 GroupPrincipal 对象上的注释字段

    我使用查询特定域中的所有安全组 PrincipalSearchResult
  • 在批处理文件的参数中转义“、<、>、>> 或 | 等字符

    尝试做 fake command bat ping n 4 w 1 127 0 0 1 gt NUL and fake command bat ping n 4 w 1 127 0 0 1 批处理文件可能如下所示 echo 它应该返回 pi
  • T-SQL BETWEEN 问题最大值优先

    为什么这两个表达式返回不同的结果 这实在是太愚蠢了 SELECT FROM Table WHERE ID BETWEEN 3 AND 1 SELECT FROM Table WHERE ID BETWEEN 1 AND 3 As the 文
  • OpenCV检测人脸特征点(耳朵-下巴-耳朵线)

    我正在寻找一个opencv函数 在python中 检测人脸上的左耳 下巴 右耳线 看起来像抛物线 有没有某种 haarcascade 来做这项工作 我已经知道正面或眼睛的轮廓 但我正在寻找更精确的东西 您正在寻找的称为面部标志检测 您可以尝
  • 使用 Nimbus Look And Feel 时无法在 JTextArea 背景上绘制图像

    我正在绘制图像JTextArea背景 它是使用其他外观和感觉 金属 Windows 等 绘制的 但是当我使用Nimbus外观和感觉它不绘制图像可能是什么问题以及如何解决该问题 这是我正在使用的代码 图片文本区域类 public class