我有一个带有背景图像的JTextPane。
prevWords = new JTextPane()
{
public void paint(Graphics g)
{
BufferedImage img;
try
{
img = ImageIO.read(new File("Images/logo.png"));
img.getGraphics().setColor(new Color(Color.TRANSLUCENT));
g.drawImage(img, 0, 0, null);
}
catch (IOException e)
{
System.out.println("Failed to load logo.");
}
super.paintComponents(g);
}
};
当我将文字写入窗格时,我看不到它。我已将窗格中的文本设置为白色。
答案 0 :(得分:1)
这是一个完整的黑客攻击。
问题在于,用户界面正在绘制背景两次 ...
您需要以这样的方式规避UI,以便您可以将图像绘制到背景中,同时仍然可以将文本渲染到顶部。
最后,我必须使文本窗格透明,这样我才能强制UI不要绘制背景。
public class TextPaneBackground {
public static void main(String[] args) {
new TextPaneBackground();
}
public TextPaneBackground() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(new TextPaneWithBackground()));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TextPaneWithBackground extends JTextPane {
private BufferedImage background;
public TextPaneWithBackground() {
try {
background = ImageIO.read(new File("C:/Users/shane/Dropbox/MegaTokyo/Evil_Small.jpg"));
} catch (IOException ex) {
ex.printStackTrace();
}
setForeground(Color.WHITE);
setOpaque(false);
}
@Override
public Dimension getPreferredScrollableViewportSize() {
return background == null ? super.getPreferredScrollableViewportSize() : new Dimension(background.getWidth(), background.getHeight());
}
@Override
public Dimension getPreferredSize() {
return background == null ? super.getPreferredSize() : new Dimension(background.getWidth(), background.getHeight());
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
if (isOpaque()) {
g2d.setColor(getBackground());
g2d.fillRect(0, 0, getWidth(), getHeight());
}
if (background != null) {
int x = (getWidth() - background.getWidth()) / 2;
int y = (getHeight()- background.getHeight()) / 2;
g2d.drawImage(background, x, y, this);
}
getUI().paint(g2d, this);
g2d.dispose();
}
}
}
Reimeus暗示能够直接将图像插入Document
,这可能是一个更好的长期解决方案。