【问题标题】:JFrame + custom LayoutManeger + work with Graphisc2D (rotation)JFrame + 自定义 LayoutManeger + 使用 Graphisc2D(旋转)
【发布时间】:2015-12-09 13:41:01
【问题描述】:


我正在开发使用自定义布局管理器的项目。我的目标是将所有组件旋转 180°。
我有一些由 JFrame 组成的屏幕。我也有一些 LayoutHandler,它定义了一些布局层。每层都是 LayerLayout 的实例,它从 java.awt 实现 LayerManager2
流程可能是这样的: 我有 JFrame,它代表显示。这个 JFrame 有一些默认的内容窗格。应用程序设置到这个由 LayerHandler 表示的内容窗格布局:

graphicalDisplayJFrame.getContentPane().setLayout(new LayerLayout(layerHandler));//graphicalDisplayJFrame is JFrame which represents the display

layerHandler 只是以某种方式管理层,这些层是从 java.awt 实现 LayerLayout2 的 LayerLayouts。所以它看起来像布局的布局或其他任何东西。我对创建自定义布局没有太多经验。

我有一种情况显示创建了 JFrame。

 graphicalDisplayJPanel = new JPanel() {
                @Override
                protected void paintComponent(Graphics g) {

                    super.paintComponent(g);

                    g2d = (Graphics2D) g;
                    g2d.rotate(Math.PI, anchorx, anchory); //rotation 180°
                }

                  @Override
                  public void paintChildren(Graphics g) {
                       super.paintChildren(g);
                       Graphics2D g2d2 = (Graphics2D) g;
                    g2d2.rotate(Math.PI, anchorx, anchory);

                  }


            };






      graphicalDisplayJFrame = new JFrame(); //creation of JFrame

 graphicalDisplayJFrame.setContentPane(graphicalDisplayJPanel); //setting JFrame to apply rotation

第一部分应该使旋转 180°,但它没有,即使我在 graphicsDisplayJFrame 上调用 repaint。但是当我添加这个时:

JLabel hwLabel = new JLabel("Hello world.");
    hwLabel.setVisible(true);
    graphicalDisplayJFrame.add(hwLabel);

我造成奇怪的事情。 JFrame 及其上的所有组件意外旋转了 180°。但它唯一的静态行为,因为显示了一些文本组件,并且当它们上的文本发生更改时,它再次以非旋转方式呈现。
所以问题是为什么会发生这种情况?
如果我把它分成两部分:

a) 为什么 JFrame 上的 Graphics2D 不会影响其内容窗格上的子组件。为什么它只在我添加在这里没有意义的 JLabel 时才有效,但这只是导致我想要的结果的实验​​(= 用正确的旋转重新绘制)。

b)我可能应该以某种方式应用旋转 => 类似于覆盖添加到 JFrame 的 contentPane 上的每个组件的绘制方法。但是我该怎么做呢?因为上面描述的布局处理程序只管理一堆布局(可能是来自 java.awt 的自定义布局实现 LayoutManager2 的层),它只是提供放在布局上的组件并将它们放在内容窗格上。所以问题可能应该是我想要实现自定义绘画的地方,这意味着应用旋转(这是代码 g2d.rotate(Math.PI, anchorx, anchory); //rotation 180° 的这一部分) .


我希望它可以理解,我做了一些努力来了解可能出现问题的地方并尝试找出解决方案,但它的行为真的很奇怪。所以我希望有更多经验的人可以帮助我摆脱困境并为我指明道路。

【问题讨论】:

  • 我认为重量级的组件不会很喜欢。

标签: java swing layout paint paintcomponent


【解决方案1】:

您正在非常奇怪的点应用旋转。 Graphics2D.rotate() 仅适用于在旋转调用 之后绘制的东西,但您的绘制覆盖在调用 super 之后 旋转。

至于为什么添加标签会导致旋转,不看整个代码很难说清楚。可能是部分重绘的效果。

您不应修改传递给您的绘制方法的图形平移或旋转等基本要素。它有可能以意想不到的方式影响父组件的绘制,并且效果很容易根据 JRE 版本而改变。而是创建一个 图形以传递给您的子组件:

@Override
public void paintChildren(Graphics g) {
    Graphics2D g2d = (Graphics2D) g.create();
    try {
        g2d.rotate(Math.PI, anchorx, anchory);
        super.paintChildren(g2d);
    } finally {
        g2d.dispose();
    }
}

这个方法保持原始Graphics不变,至少允许父组件正常渲染。旋转图形仍然很棘手,并且可能会在渲染过程中产生意想不到的副作用,但至少这些效果现在被小心地限制在旋转组件的子组件中。

【讨论】:

    猜你喜欢
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 2013-11-28
    相关资源
    最近更新 更多