gpt4 book ai didi

java - JTextArea 不可选择,但仍显示 "ghost"光标

转载 作者:搜寻专家 更新时间:2023-11-01 03:08:58 26 4
gpt4 key购买 nike

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

我尝试了所有这些选项:

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

但是当用户将鼠标拖到 JTextArea 上时颜色仍然会发生一些变化。有谁知道这是怎么回事吗?

最佳答案

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

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

为此,您需要提供自己的绘制例程(覆盖 paintComponent、填充背景、更新组件)...这本质上就是 Rob Camick's解决方案正在做,它只是为您提供了一个很好的包装器组件......

下面是使用 JLabelJTextArea 的示例,这两个示例都更新为支持“半透明”...

使用JLabel

enter image description here

使用JTextArea

enter image description here

现在,使用 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);
}
}
}
}

关于java - JTextArea 不可选择,但仍显示 "ghost"光标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14329310/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com