展开全部

我们继承(扩展一个 JPanel / JFrame) 之类的e5a48de588b662616964757a686964616f31333335326261组件,覆盖它的 paintComponent(Graphics g) 方法,因为 Swing 为了支持 Look and Fee (皮肤效果),把这些绘图操作委托给了某某UI,基本上每个组件都有一个对应的UI 的不同版本,比如 Windows XP 和 Windows Classic 经典样式,还有 Linux 上经典金属质感的样式。我们如果只是替换背景图,不需要弄个UI,就直接用 paintComponent 方法来做。

例如:

下面是 ComponentUI 类的方法,

看下面这个代码,当不透明时先涂背景色,然后再来 paint 组件。所以你的操作类似于,先把背景图片缩放到100%,能铺满这个背景,然后先涂背景图,再来涂孩子控件。

至少具体细节,你可以写一个自己的某某UI 类,在 JPanel 上 myPanel.setUI 替换掉之后,我们在这个自己的 UI 类中的方法添加行断点,观察 Swing 在什么时候进来了,根据 Eclipse debug 视图提供的 Thread Stack 可以查看各级的方法名并自动跳到对应的JDK自带的源码中。

public void update(Graphics g, JComponent c) {
if (c.isOpaque()) {
g.setColor(c.getBackground());
g.fillRect(0, 0, c.getWidth(),c.getHeight());
}
paint(g, c);
}