gpt4 book ai didi

java - 从 LayoutManager 中在组件上绘画

转载 作者:行者123 更新时间:2023-11-30 04:16:24 25 4
gpt4 key购买 nike

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

在我的自定义布局管理器中,这是我尝试过的:

@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 一样,您在 MigLayout 构造函数中指定 "debug" 并且您有虚线,并且不需要修改正在布局的组件中的任何内容。

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

最佳答案

假设要绘制的东西是 LayoutManager 的隐藏细节,即管理器本身确实是具有足够知识能够进行绘制的唯一协作者,你需要一个调试绘画钩子(Hook),它没有其他方法,只能使用 parent.getGraphics() 由于这样的绘画不能长期存在,使用代码必须重复调用它,例如在计时器中。

带有调试绘画钩子(Hook)的 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();

关于java - 从 LayoutManager 中在组件上绘画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18249967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com