1

我正在开发一个应用程序,并且我有一个需要自定义 LayoutManager 的面板。为了测试我的 LayoutManager 实现,我想内置一些调试模式,非常类似于 MigLayout 的调试模式,它在调试模式打开时绘制虚线矩形。

在我的自定义 LayoutManager 中,这是我尝试过的:

@Override
public void layoutContainer(Container parent) {
    // compX.setBounds(...); // calculate for all components and set bounds

    parent.getGraphics().drawRect(0,0,parent.getWidth(), parent.getHeight());
}

它不像你预期的那样工作。

我不想修改正在布局的面板 - 就像 MigLayout 一样,您"debug"在 MigLayout 构造函数中指定并且您有虚线,并且您不需要修改正在布局的组件中的任何内容。

我如何parent在不修改其内部结构的情况下进行绘制?

4

1 回答 1

2

假设要绘制的东西是 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();
于 2013-08-15T10:27:42.213 回答