我有一个Java代码,我在其中实现了一个半透明的JPanel,其上使用Graphics 2D绘制了图像。此图像是一个PNG,包含一个白色矩形,80%不透明,遍布JFrame。现在我需要添加一个JTextPane来显示数据(我将它设置为使用应用程序包BTW中的自定义字体),但我无法使其变得半透明:它的白色背景是不透明的(即使使用{{1}设置)并使我的JFrame的透明度有点无用......这并不酷。
所以我正在寻找一种方法来消除这种让我烦恼的白色背景。
我推出了许多Google搜索,但我找到的所有内容都是布尔值来设置JTextPane的不透明度。我还发现使用Graphics 2D我可以创建一个自定义的JTextPane并覆盖它的背景,但它没有用......我已经尝试了所有这些。
textPane.setOpaque(false);
(使用JFrame半透明的Oracle解释,就在这里HERE)谢谢!
答案 0 :(得分:4)
这就是我如何处理这种想法......
public class OverlayTextArea {
public static void main(String[] args) {
new OverlayTextArea();
}
public OverlayTextArea() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(new ImagePane());
frame.setLayout(new BorderLayout());
frame.add(new TransparentTextArea());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TransparentTextArea extends JTextArea {
public TransparentTextArea() {
setOpaque(false);
setBorder(new CompoundBorder(new EmptyBorder(10, 10, 10, 10), new LineBorder(Color.LIGHT_GRAY)));
}
@Override
protected void paintComponent(Graphics g) {
g.setColor(new Color(255, 255, 255, 128));
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);
g.fillRect(x, y, width, height);
super.paintComponent(g);
}
}
public class ImagePane extends JPanel {
private BufferedImage background;
public ImagePane() {
try {
background = ImageIO.read(new File("/path/to/background.img"));
} catch (IOException ex) {
ex.printStackTrace();
}
}
@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);
}
}
}
}
<强>反馈强>
super.paintComponent
,如果不这样做会导致一些严重的麻烦,特别是当你处理透明组件时。paintXxx
方法中执行任何长时间运行的任务,例如加载图像。这些方法旨在快速返回,并可在连续中多次调用... 答案 1 :(得分:1)
使其适用于Nimbus L&amp; F:
jta.setOpaque(false);
jta.setBorder(BorderFactory.createEmptyBorder());
jta.setBackground(new Color(0,0,0,0));