JTextArea不可选,但仍显示“ghost”光标

我把一个JTextArea放在JPanel中。 这张JPanel背景上有一张图片,而JTextArea是半透明的(透明的红色)来显示背景。 我不希望用户能够编辑或选择文本,我希望它只是作为一个JLabel(但有多行,易于自动换行并调整到屏幕resize)。

我尝试了所有这些选项:

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

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

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

这会引导您解决如何绘制背景的问题(因为Swing只有完全不透明或完全透明的概念)。

要做到这一点,你需要提供自己的绘图例程(覆盖paintComponent ,填充背景,更新组件)……这实际上是Rob Camick的解决方案正在做的事情,它只是为你提供了一个很好的包装器组件……

下面是使用包含在HTML和JTextArea文本的JLabel的示例,两者都更新为支持“半透明”…

使用JLabel

在此处输入图像描述

使用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(""); 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).


"); sb.append("

I tried all these options:


"); sb.append("

text.setEditable(false);
"); sb.append("text.setFocusable(false);
"); sb.append("text.setEnabled(false);
"); sb.append("text.setHighlighter(null);


"); sb.append("

but still some change of color happens as the user drags the mouse over the JTextArea. Anyone knows what is going on?

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