Java: JTextPane 加载不透明?
Java: JTextPane isn't loading transparent?
我有一个 class UITextPane
扩展 JTextPane
并覆盖 paintComponent(g)
方法,如下所示:
package com.ritcat14.GotYourSix.graphics.UI;
import com.ritcat14.GotYourSix.util.ImageUtil;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JTextPane;
public class UITextPane extends JTextPane {
private BufferedImage img;
public UITextPane() {
img = ImageUtil.getImage("/ui/panels/helpBackground.png");
}
@Override
public void paintComponent(Graphics g) {
g.drawImage(img,0,0,null);
super.paintComponent(g);
}
}
然后在我的 Game.java
class 中,我使用 GridBagConstraints
创建组件并将其添加到 JFrame:
game.textPane = new UITextPane();
game.textPane.setEditable(false);
game.textPane.setForeground(new Color(0xffC20F1B));
game.textPane.setBackground(new Color(1,1,1, (float) 0.01)); //Set transparent so we can see the text
//create and set font
....
JScrollPane sp = new JScrollPane(game.textPane);
sp.setPreferredSize(new Dimension(400,400));
c.anchor = GridBagConstraints.LINE_END;
game.frame.add(sp, c);
每次调用游戏的渲染方法时都会调用textPane.paintComponent(g)
。
我的问题:我存储的图像只是一个 400x400
透明图像,我在 UITextPane
class 中绘制到 JTextPane
。但是,结果如下所示:
而且唱完后,背景变黑了,像这样:
知道我做错了什么/没做什么吗?谢谢
有些 LaF 不尊重背景 属性。无论如何,你应该使用 setOpaque 来实现你想要的。
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame mainFrame = new JFrame("test");
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Opaque (default behaviour)
Container pane = mainFrame.getContentPane();
JTextPane jtp1 = new JTextPane();
jtp1.setOpaque(true);
jtp1.setText("this JTextPane is not transparent");
jtp1.setEditable(false);
//Not opaque (ie transparent)
JTextPane jtp2 = new JTextPane();
jtp2.setOpaque(false);
jtp2.setText("this JTextPane is transparent");
jtp2.setEditable(false);
pane.setLayout(new FlowLayout());
pane.setBackground(Color.LIGHT_GRAY);
pane.add(jtp1);
pane.add(jtp2);
mainFrame.pack();
mainFrame.setVisible(true);
}
});
}
我有一个 class UITextPane
扩展 JTextPane
并覆盖 paintComponent(g)
方法,如下所示:
package com.ritcat14.GotYourSix.graphics.UI;
import com.ritcat14.GotYourSix.util.ImageUtil;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JTextPane;
public class UITextPane extends JTextPane {
private BufferedImage img;
public UITextPane() {
img = ImageUtil.getImage("/ui/panels/helpBackground.png");
}
@Override
public void paintComponent(Graphics g) {
g.drawImage(img,0,0,null);
super.paintComponent(g);
}
}
然后在我的 Game.java
class 中,我使用 GridBagConstraints
创建组件并将其添加到 JFrame:
game.textPane = new UITextPane();
game.textPane.setEditable(false);
game.textPane.setForeground(new Color(0xffC20F1B));
game.textPane.setBackground(new Color(1,1,1, (float) 0.01)); //Set transparent so we can see the text
//create and set font
....
JScrollPane sp = new JScrollPane(game.textPane);
sp.setPreferredSize(new Dimension(400,400));
c.anchor = GridBagConstraints.LINE_END;
game.frame.add(sp, c);
每次调用游戏的渲染方法时都会调用textPane.paintComponent(g)
。
我的问题:我存储的图像只是一个 400x400
透明图像,我在 UITextPane
class 中绘制到 JTextPane
。但是,结果如下所示:
而且唱完后,背景变黑了,像这样:
知道我做错了什么/没做什么吗?谢谢
有些 LaF 不尊重背景 属性。无论如何,你应该使用 setOpaque 来实现你想要的。
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame mainFrame = new JFrame("test");
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Opaque (default behaviour)
Container pane = mainFrame.getContentPane();
JTextPane jtp1 = new JTextPane();
jtp1.setOpaque(true);
jtp1.setText("this JTextPane is not transparent");
jtp1.setEditable(false);
//Not opaque (ie transparent)
JTextPane jtp2 = new JTextPane();
jtp2.setOpaque(false);
jtp2.setText("this JTextPane is transparent");
jtp2.setEditable(false);
pane.setLayout(new FlowLayout());
pane.setBackground(Color.LIGHT_GRAY);
pane.add(jtp1);
pane.add(jtp2);
mainFrame.pack();
mainFrame.setVisible(true);
}
});
}