下面的示例演示如何创建JTextPane具有背景图像的自定义组件。
package org.nhooo.example.swing;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
public class TextPaneWithBackgroundImage extends JFrame {
public TextPaneWithBackgroundImage() {
initUI();
}
private void initUI() {
setSize(400, 400);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setLayout(new FlowLayout(FlowLayout.LEFT));
String imageFile = "/logo.png";
CustomTextPane textPane = new CustomTextPane(imageFile);
JScrollPane scrollPane = new JScrollPane(textPane);
scrollPane.setPreferredSize(new Dimension(getWidth(), getHeight()));
getContentPane().add(scrollPane);
pack();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new TextPaneWithBackgroundImage().setVisible(true);
}
});
}
}
/**
* A custom text pane that have a background image. To customize the
* JTextPane we override the paintComponent(Graphics g) method. We have
* to draw an image before we call the super class paintComponent method.
*/
class CustomTextPane extends JTextPane {
private String imageFile;
/**
* Constructor of custom text pane.
* @param imageFile image file name for the text pane background.
*/
CustomTextPane(String imageFile) {
super();
// 为了能够绘制背景图像,组件必须
// 不透明。
setOpaque(false);
setForeground(Color.BLUE);
this.imageFile = imageFile;
}
@Override
protected void paintComponent(Graphics g) {
try {
// 为out JTextPane的背景图像加载图像。
BufferedImage image = ImageIO.read(getClass().getResourceAsStream(imageFile));
g.drawImage(image, 0, 0, (int) getSize().getWidth(),
(int) getSize().getHeight(), this);
} catch (IOException e) {
e.printStackTrace();
}
super.paintComponent(g);
}
}