假设要绘制的东西是 LayoutManager 的隐藏细节,即管理器本身确实是唯一具有足够知识能够进行绘制的协作者,您需要一个调试绘制钩子,它没有其他方法,只能使用parent.getGraphics()
因为这样的绘制没有'活不了多久,使用代码必须反复调用它,fi in a Timer。
一个带有调试绘画钩子的 LayoutManager(注意:这只是一个例子,没有隐藏状态可以证明这个技巧:)
public static class MyBorderLayout extends BorderLayout {
Color[] colors = new Color[] {Color.RED, Color.BLUE, Color.GREEN, Color.CYAN, Color.MAGENTA};
public void paintDebug(Container parent) {
Graphics g = parent.getGraphics();
for (int i = 0; i < parent.getComponentCount(); i++) {
Component child = parent.getComponents()[i];
g.setColor(colors[i % colors.length]);
Rectangle r = child.getBounds();
g.drawRect(r.x, r.y, r.width, r.height);
}
}
}
// 用法:
final JComponent comp = new JPanel(new MyBorderLayout());
comp.add(new JTable(10, 3));
comp.add(new JLabel("east"), BorderLayout.EAST);
comp.add(new JLabel("west"), BorderLayout.WEST);
comp.add(new JLabel("north"), BorderLayout.NORTH);
comp.add(new JLabel("south"), BorderLayout.SOUTH);
ActionListener l = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
((MyBorderLayout) comp.getLayout()).paintDebug(comp);
}
};
showInFrame(comp, "debug");
new Timer(400, l).start();