【问题标题】:Draw line over multiple panels in Java在Java中的多个面板上画线
【发布时间】:2012-03-03 14:20:50
【问题描述】:

我正在尝试在多个面板上画一条线(图像中的红线),但我似乎无法使其工作。我怎样才能做到这一点?有什么建议?

【问题讨论】:

  • 顺便说一句 - 图片不错,但以后请把它们剪得更小。我用裁剪后的版本(430×375px)替换了原始版本。

标签: java swing graphics jpanel


【解决方案1】:

glass pane上画图。

【讨论】:

  • 就个人而言,我不太了解 glassPane 的裸指针:它是 rootPane 的(顺便说一句,难以处理)属性,它是顶级容器的直接子级。那么你(以及最近的其他人,你今天是不幸的 :-) 真正建议的是:在每帧的基础上管理玻璃状的重绘?在其他地方使用 rootPane?将管理 glassPane 的 rootPane 代码部分复制到另一个容器?真的很好奇……
  • 嗯.. 真的一无所知(关于这个)。请记住,在很多情况下都会提到它。我个人更喜欢你的建议。 +1
  • @kleopatra 你的问题是肯定的,并且有四种正确的方法(我真的不明白你的 cmets 以及为什么没有任何额外的代码、描述或其他任何东西),@ 987654323@ Rob 的@ 987654322@, 2) J(X)Layer, 3) JViewport 4) GlassPane,
【解决方案2】:

JDK 7 在任意组件之上添加了JLayer to support visual decorations。对于早期版本,有一个项目JXLayer at java.net,它实际上是它的前身,具有非常相似的 api

这是一个基本示例,使用自定义 LayerUI,它从容器中的一个组件到不同容器中的另一个组件绘制一条直线。两个容器的共同父级使用该 ui 装饰有 JLayer:

    JComponent comp = Box.createVerticalBox();
    final JComponent upper = new JPanel();
    final JButton upperChild = new JButton("happy in upper");
    upper.add(upperChild);
    final JComponent lower = new JPanel();
    final JButton lowerChild = new JButton("unhappy in lower");
    lower.add(lowerChild);
    comp.add(upper);
    comp.add(lower);
    LayerUI<JComponent> ui = new LayerUI<JComponent>() {

        @Override
        public void paint(Graphics g, JComponent c) {
            super.paint(g, c);
            Rectangle u = SwingUtilities.convertRectangle(upper, upperChild.getBounds(), c);
            Rectangle l = SwingUtilities.convertRectangle(lower, lowerChild.getBounds(), c);

            g.setColor(Color.RED);
            g.drawLine(u.x, u.y + u.height, l.x, l.y);
        }

    };
    JLayer<JComponent> layer = new JLayer<JComponent>(comp, ui);

【讨论】:

    猜你喜欢
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    相关资源
    最近更新 更多