JTextArea 不可选择,但仍显示“幽灵”光标

2024-01-26

我将 JTextArea 放入 JPanel 中。这个JPanel的背景有一张图片,而JTextArea是半透明的(半透明的红色)以显示背景。我不希望用户能够编辑或选择文本,我希望它充当 JLabel(但具有多行并且易于自动换行和调整屏幕大小)。

我尝试了所有这些选项:

text.setEditable(false);
text.setFocusable(false);
text.setEnabled(false);
text.setHighlighter(null);

但当用户将鼠标拖动到 JTextArea 上时,颜色仍然会发生一些变化。有人知道发生了什么事吗?


您不能简单地将组件的背景颜色设置为“透明”并期望 Swing 处理它。您需要将组件标记为透明(setOpaque(false)),只有这样 Swing 的重绘管理器才会知道它必须更新其下的组件。

这就引出了如何绘制背景的问题(因为 Swing 只有完全不透明或完全透明的概念)。

为此,您需要提供自己的绘画例程(覆盖paintComponent,填充背景,更新组件)...这本质上就是罗布·卡米克的 http://tips4java.wordpress.com/2009/05/31/backgrounds-with-transparency/解决方案正在做,它只是为您提供了一个很好的包装组件......

下面是一个使用的示例JLabel使用 HTML 中的文本和JTextArea,两者都更新为支持“半透明”......

Using a JLabel

Using a JTextArea

现在,使用 Rob 的包装类来实现会容易得多,但这可以让您了解出了什么问题以及需要采取哪些措施来修复它。

public class MultiLineLabel {

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

    public MultiLineLabel() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new BackgroundPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TransclucentLabel extends JLabel {

        public TransclucentLabel(String text) {
            super(text);
            setVerticalAlignment(TOP);
        }

        @Override
        protected void paintComponent(Graphics g) {
            Graphics2D g2d = (Graphics2D) g;
            Insets insets = getInsets();
            int x = insets.left;
            int y = insets.top;
            int width = getWidth() - (insets.left + insets.right);
            int height = getHeight() - (insets.top + insets.bottom);
            g2d.setColor(new Color(255, 0, 0, 128));
            g2d.fillRect(x, y, width, height);
            super.paintComponent(g);
        }
    }

    public class TransclucentTextArea extends JTextArea {

        public TransclucentTextArea(String text) {
            super(text);
            setOpaque(false);
            setLineWrap(true);
            setWrapStyleWord(true);
        }

        @Override
        protected void paintComponent(Graphics g) {
            Graphics2D g2d = (Graphics2D) g;
            Insets insets = getInsets();
            int x = insets.left;
            int y = insets.top;
            int width = getWidth() - (insets.left + insets.right);
            int height = getHeight() - (insets.top + insets.bottom);
            g2d.setColor(new Color(255, 0, 0, 128));
            g2d.fillRect(x, y, width, height);
            super.paintComponent(g);
        }
    }

    public class BackgroundPane extends JPanel {

        private BufferedImage background;

        public BackgroundPane() {
            setLayout(new BorderLayout());
//            addLabel();
            addTextArea();
            setBorder(new EmptyBorder(24, 24, 24, 24));

            try {
                background = ImageIO.read(new File("/path/to/your/image"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        protected void addTextArea() {
            StringBuilder sb = new StringBuilder(128);
            sb.append("I put a JTextArea in a JPanel. This JPanel has a picture on the background, and the JTextArea is translucent (translucid red) to show the background through. I don't want the user to be able to edit or select the text, I want it to act just as a JLabel (but with multiple lines and easy to word wrap and adjust to screen resize).\n\n");
            sb.append("I tried all these options:\n\n");
            sb.append("text.setEditable(false);\n");
            sb.append("text.setFocusable(false);\n");
            sb.append("text.setEnabled(false);\n");
            sb.append("text.setHighlighter(null);\n\n");
            sb.append("but still some change of color happens as the user drags the mouse over the JTextArea. Anyone knows what is going on?\n");
            add(new TransclucentTextArea(sb.toString()));
        }

        protected void addLabel() {
            StringBuilder sb = new StringBuilder(128);
            sb.append("<html>");
            sb.append("<p>I put a JTextArea in a JPanel. This JPanel has a picture on the background, and the JTextArea is translucent (translucid red) to show the background through. I don't want the user to be able to edit or select the text, I want it to act just as a JLabel (but with multiple lines and easy to word wrap and adjust to screen resize).</p><br>");
            sb.append("<p>I tried all these options:</p><br>");
            sb.append("<p>text.setEditable(false);<br>");
            sb.append("text.setFocusable(false);<br>");
            sb.append("text.setEnabled(false);<br>");
            sb.append("text.setHighlighter(null);</p><br>");
            sb.append("<p>but still some change of color happens as the user drags the mouse over the JTextArea. Anyone knows what is going on?</p>");
            add(new TransclucentLabel(sb.toString()));

        }

        @Override
        public Dimension getPreferredSize() {
            return background == null ? super.getPreferredSize() : new Dimension(background.getWidth(), background.getHeight());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (background != null) {
                int x = (getWidth() - background.getWidth()) / 2;
                int y = (getHeight() - background.getHeight()) / 2;
                g.drawImage(background, x, y, this);
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JTextArea 不可选择,但仍显示“幽灵”光标 的相关文章

  • 如何获取枚举的子集

    大多数情况下 包含所有元素的枚举显示在用户界面的下拉列表中 我们只需要在用户界面中显示 5 个字段中的 2 个 通过某种方式利用可用于枚举的相同函数来获取此数据的更简单方法是什么 enum Color RED GREEN BLACK BLU
  • 如何将 .cer 证书导入 java 密钥库?

    在开发 Java Web 服务客户端期间 我遇到了一个问题 Web 服务的身份验证使用客户端证书 用户名和密码 我从网络服务背后的公司收到的客户端证书位于 cer格式 当我使用文本编辑器检查该文件时 它具有以下内容 BEGIN CERTIF
  • 在 MongoDB Java 驱动程序中如何使用 $filter

    我有一个适用于 MQL 的查询 我需要将其翻译成Java MQL 中的查询如下所示 db
  • 如何将列表转换为地图?

    最近我和一位同事讨论了转换的最佳方式是什么List to Map在 Java 中 这样做是否有任何具体的好处 我想知道最佳的转换方法 如果有人可以指导我 我将非常感激 这是个好方法吗 List
  • 使用 java 的 RAR 档案 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 Java 中填充布尔数组

    作为一名相当新手的 Java 程序员 我给自己设定了一个艰巨的挑战 尝试编写一个简单的文本冒险 不出所料 我已经遇到了困难 我试图为我的 Location 类提供一个属性来存储它包含的退出 我为此使用了一个布尔数组 本质上保存代表每个出口的
  • 适用于 Solaris 的 Java 8 中缺少 javaws

    看起来 Oracle 从 Java 8 for Solaris 中删除了 Java Web Start javaws 在 Java 8u51 中不再可用 来自兼容性指南 http www oracle com technetwork jav
  • DateTimeFormatter.parseLocalDate 抛出 UnsupportedOperationException

    该API用于解析本地日期 http joda time sourceforge net apidocs org joda time format DateTimeFormatter html parseLocalDate 28java la
  • 我需要显式关闭连接吗?

    我持有一个实例MongoClient and DB在我的应用程序中 每次我想执行某些操作时 我都会调用getCollection 我想知道是否需要显式关闭连接 就像connection close 在 JDBC 中 强调一下 我只有一个Mo
  • 确定代码是否在 App Engine 运行时 (Java) 上运行

    如何确定某些代码 Serv let 或简单的类 是否正在 Google App Engine 运行时 Java 上运行 以便决定是否使用 App Engine 的特定库 是否有一些可靠的运行时环境 ID 您可以检查com google ap
  • Ant 无法启动,给出主类错误

    我正在运行 Elementary OS 基于 Ubuntu 12 并且在运行 apache ant 时遇到问题 它在重新启动之前就可以正常工作 所以我不确定会发生什么变化 我在 etc environment 中定义了环境变量 如下所示 P
  • Java 反射:如何检索匿名内部类?

    我在另一个类中有一个匿名内部类 SomeClass Both SomeClass class getClasses and SomeClass class getDeclaredClasses 返回空数组 我在中找不到一些关于此的提示Cla
  • 在Java中使用BufferedWriter写入文件时监视文件大小?

    我正在将一个可能很长的项目列表写入文件 我正在写的项目的长度是可变的 如果生成的文件大小大于10M 则应将其分成多个文件 为了提高性能 我目前使用 BufferedWriter 如下所示 final FileOutputStream fos
  • java.lang.UnsupportedOperationException:无法解析索引 13 处的属性:TypedValue{t=0x2/d=0x7f010046 a=-1}

    我在 android attrs xml 文件中添加了一个用于不同色调的属性 在 styles xml 文件中 我为这些属性指定了颜色 因此每种样式的它们都不同 Attrs xml
  • 在java中是否可以使用反射创建没有无参数构造函数的“空白”类实例?

    我有一个没有默认构造函数的类 我需要一种方法来获取此类的 空白 实例 空白 意味着实例化后所有类字段都应具有默认值 如 null 0 等 我问这个问题是因为我需要能够序列化 反序列化大对象树 而且我无法访问该对象类的源 并且类既没有默认构造
  • Java 7 中 Object 和 int 的比较

    最近我偶然发现了一个问题 让我停下来思考 对我来说 下面的代码应该总是会触发错误 但是当我的一位同事问我为什么 Eclipse 没有显示错误时 我无法回答任何问题 class A public static void main String
  • 设置 JAVA_HOME 变量时出现问题

    所以我刚刚下载了 Android Studio 并尝试设置 JAVA HOME 变量以便我可以运行它 我使用的是 Windows 8 并按照我找到的所有说明进行操作 但无济于事 转到高级系统设置 gt 环境变量 然后使用包含我的 jre7
  • 我可以关闭并重新打开套接字吗?

    我学习了一个使用套接字的例子 在此示例中 客户端向服务器发送请求以打开套接字 然后服务器 侦听特定端口 打开套接字 一切都很好 套接字从双方 客户端和服务器 打开 但我仍然不清楚这个东西有多灵活 例如 客户端是否可以关闭一个打开的 从两端
  • Microsoft JDBC 中的 JTDS 属性相当于什么?

    我正在将 JTDS 连接更改为 Microsoft JDBC 并且我看到存在于http jtds sourceforge net faq html http jtds sourceforge net faq htmlMicrosoft JD
  • 线程“main”中出现异常 java.lang.UnsatisfiedLinkError: ... \jzmq.dll: 找不到依赖库

    我有一个使用 ZMQ 的 java 应用程序 我已经能够在我的 Win7 PC 上运行它 我将 jzmq dll 放在 jar 可执行文件所在的同一文件夹中 然后通过命令 java jar myapp jar 运行它 我的下一步是将其移至服

随机推荐

  • 如何在gridview适配器中回收位图?

    我的 android 应用程序中有一个网格视图 我正在从服务器将图像加载到网格视图 我正在使用延迟加载 我必须回收此处创建的所有位图 如何在适配器或网格视图中执行 Bitmap recycle 我失忆了 请帮助我 您将需要显示一些代码 至少
  • 从 EC2 实例内查找区域

    有没有办法从实例内部查找实例的区域 我正在寻找类似于方法的东西查找实例 ID https stackoverflow com questions 625644 find out the instance id from within an
  • Bash 参数扩展分隔符

    我想得到1 2 3 4 5 6 7 8 9 10使用参数扩展 1 10 和模式匹配 var echo 1 10 echo var 1 2 3 4 5 6 7 8 9 10 有没有一种更优雅的方式 单行 来做到这一点 优雅在于情人眼中 set
  • 是否有针对各种操作系统(和版本)的预处理器定义列表?

    例如的映射 Mac OS 10 6 3 又名 Snow Leopard gt APPLE LP64 Windows 7 Windows XP gt WIN32 Linux gt LINUX 干得好 http predef sourcefor
  • 重新排序 .strings 文件

    In my Localizable Strings我尝试按字母顺序排列所有对 是否可以按字母顺序重新排序我的Localizable strings文件不区分大小写 也许使用 genstring 或特殊的 bash 脚本 例如我有字符串 ap
  • 为什么 Objective-C 实例变量要在接口中声明?

    我刚刚开始接触 Objective C Java 是我的主要面向对象语言 在接口而不是类中定义对象的实例变量似乎很奇怪 我习惯了接口作为公共 API 定义 除了方法签名之外什么都没有 这里不包括常量 是否有某种原因导致状态在接口中定义 即使
  • QGraphicsLineItem::paint() 工件

    我有自己的类 它继承自QGraphicsLineItem并覆盖paint 绘制带箭头的粗线的方法 void MyGraphicsItem paint QPainter aPainter const QStyleOptionGraphicsI
  • 扩展 Swift 中的所有数字类型

    可以说我有这样的东西 extension NSNumber func toLocalCurrency fractDigits Int 2 gt String let formatter NSNumberFormatter formatter
  • Pycharm/IntelliJ IDEA:如何减少代码分隔符的宽度?

    如何让这个竖条变细呢 没有行号的它比有行号的要薄 但对于我的小屏幕来说仍然太胖了 转到文件 gt 设置 gt 编辑器 gt 常规 gt 装订线图标 取消选中该选项Show gutter icons Now the desired appea
  • 打印 WPF FlowDocument

    我正在 WPF 中构建一个演示应用程序 这对我来说是新的 我当前正在 FlowDocument 中显示文本 并且需要打印它 我正在使用的代码如下所示 PrintDialog pd new PrintDialog fd PageHeight
  • Angular 2 中的 ChangeDetectionStrategy.OnPush 和 Observable.subscribe

    我正在尝试结合使用 Observables 时的最佳实践ChangeDetectionStrategy OnPush 该示例演示了想要显示某种加载消息 或者可能是简单的旋转动画 的常见场景 点这里 http plnkr co edit Qh
  • 我们可以在我们的项目中部署 IWSHRUNTIMELIBRARY 吗?

    我在我的项目中使用了 IWSHRUNTIME dll 库 我的问题是我们如何在我们的项目中部署 IWSHRUNTIME dll 库以及使用该库是否安全 我读过了here http social msdn microsoft com Foru
  • Spring Boot 控制器 Jasper 报告空白 PDF

    GetMapping value report pdf id produces MediaType APPLICATION PDF VALUE public ResponseEntity
  • 如何根据defaultdict中的key累加值

    如果我有一个 defaultdict list from collections import defaultdict d defaultdict list such as 1 0 1 0 2 1 0 3 2 0 2 2 0 4 2 0 1
  • 在textView中设置Paint.STRIKE_THRU_TEXT_FLAG

    我在用户单击时遇到问题checkbox在 的里面listView the textView不会收取费用Paint STRIKE THRU TEXT FLAG 当用户单击checkbox 罢工线将显示在textView public void
  • 将“int”转换为“long”或使用“long”访问太长的数组

    假设我有一个足够长的数组 可以使用以下命令访问其任何索引int 有没有办法访问这样一个数组的索引long 那么Java是如何处理这种数组的呢 例子 int a new int 1 5 2 4 9 2 1 Assume in the abov
  • 为什么浮点数相乘没有错误?

    我需要一些关于浮点数学的澄清 为了学习目的 我写了一些代码 include stdio h int main int argc char const argv int i double a 1 0 10 0 double sum 0 for
  • 格式化数据库中的日期?

    当我从数据库中提取日期时 它会像这样返回 2009 10 14T19 00 00 我想用两种不同的方式格式化它 第一个 F d Y 第二个 h m 12 小时格式 我所做的一切都回到了 1969 年 12 月 救命 我感觉好迷茫 通常代码只
  • jq:错误:round/0 未在 定义

    jq 中的 round 函数不起作用 jq 10 01 round jq error round 0 is not defined at
  • JTextArea 不可选择,但仍显示“幽灵”光标

    我将 JTextArea 放入 JPanel 中 这个JPanel的背景有一张图片 而JTextArea是半透明的 半透明的红色 以显示背景 我不希望用户能够编辑或选择文本 我希望它充当 JLabel 但具有多行并且易于自动换行和调整屏幕大