【发布时间】: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