此代码应该旋转JFrame 180°。如果满足某些条件,它会以某种方式。但是......让我们看看它:
//anchorx,anchory are center points of screen (JFrame)
JPanel panel = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
//super.paintChildren(g); // this shouldn't be here
//but the behaviour is same if i deleted this line
Graphics2D g2d = (Graphics2D) g;
g2d.rotate(Math.PI, anchorx, anchory);
}
/*
/* //I also commented this whole overiding paintChildren and
//the behaviour is still same like i described.
@Override
public void paintChildren(Graphics g) {
super.paintChildren(g);
Graphics2D g2d2 = (Graphics2D) g;
g2d2.rotate(Math.PI, anchorx, anchory);
}*/
};
JFrame frame = new JFrame();
frame.setContentPane(panel);
定义(以防止误解):旋转,旋转JFrame =想象JFrame是图片或照片,你无法触摸它并逐字旋转它的中心。因此它的组件也是旋转的。所以图片上有人,你将图片旋转180°。他的头将向下,他的右臂将在你的左侧,他的左臂将在你的右侧。所以在这个metaphore图片中是JFrame和JFrame上的组件是man。因此,JFrame的旋转意味着将整个旋转作为一个单元,包括其所有组件。
上面的代码只是绘制未旋转的JFrame。
所以上面的代码应该旋转JFrame但没有任何反应。
我尝试了一些选项,但没有改变任何东西。 (设置内容窗格后的行为)
1)重画:
frame.repaint();
2)验证并重新粉刷:
frame.repaint();
3)也可以在contentPane上尝试:
frame.getContentPane().repaint();
4) - || - :
frame.getContentPane().validate();
frame.getContentPane().repaint();
尝试1 - 4没有强制Java真正“重新绘制”JFrame并将其旋转。
5)所以我试过这个:
JLabel hwLabel = new JLabel("Hello world.");
hwLabel.setVisible(true);
frame.getContentPane().add(hwLabel);
如果在行frame.setContentPane(面板)之后添加了点 5 ,它最终会以某种方式 FORCE java来完成它的工作并重新绘制JFrame,所以它根据我的需要旋转。
问题是当contentPane上的某些组件的内容被更改时,它再次在旋转版本上绘制未旋转。所以,如果我使用我的定义中的metaphore。 “180°旋转的左手改变的左手应该在右侧重新绘制,但是它在左侧绘制,就像不旋转一样”。只是。如果我不进行旋转,那么更新的组件将绘制在它们所在的位置,而不是旋转。
的问题:
任何人都可以解释一下(重新)绘画生命周期是如何工作的?或者只是 我所缺少的重绘(或者基本上我的尝试1-4)不会强迫java重新绘制它,但JFrame上的添加组件是(尝试5)?
错误更新组件的事实在我的问题上是一个巨大的痛苦,但它不是这个问题的主要观点。这里只是为了完成实际行为的描述。
我已经阅读了关于绘画的文档以及关于它的许多主题和问题,但我没有找到任何有用的信息。