【发布时间】:2016-03-14 22:17:07
【问题描述】:
在 java awt 或 swing 中,当您想要更改某些组件的绘制时,通常必须覆盖方法 paint(Graphics g)(在 awt)或 paintComponent(Graphics g)(在 swing 中)。
这通常(也许总是 - 我不确定)在您创建组件时完成,例如:
JPanel jPanel = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
//... my implementation of paint, some transfromations, rotation, etc
}
};
想象一下,你有一个组件容器,例如可以由一些 JLabels、一些 JTextFields、一些图像组成。这将全部放在一个组件上。
通过容器,我的意思是您有一些带有 id 或类似结构的列表或映射,其中所有组件都将放在一个 JFrame 上。
问题是,我是否可以在使用此列表中的所有组件创建后,在所有组件都已创建的那一刻更改绘制方法。例如,我想做 Graphisc2D 中定义的旋转动作(rotate)。
所以基本上我想要的是我通过我拥有的组件列表并说:
“列表中的所有人(组件)都将旋转某个角度”。那可能吗?如果是怎么办?
编辑:
这是我工作不正常的解决方案:
graphicalDisplayPanel = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g2d = (Graphics2D) g;
g2d.rotate(Math.PI, anchorx, anchory);
}
@Override
public void paintChildren(Graphics g) {
super.paintChildren(g);
Graphics2D g2d2 = (Graphics2D) g;
g2d2.rotate(Math.PI, anchorx, anchory);
}
};
JFrame jFrame = JFrame();
// ... setting dimension, position, visible etc for JFrame, it works correctly nonrotated
jFrame.setContentPane(graphicalDisplayPanel);
【问题讨论】:
-
简单地说,是的,但请参阅answer。
-
@trashgod 谢谢,但是a)如果您阅读了我的问题,我问它是否可能在创建之后,但您的示例在创建期间执行。 b) 为什么不调用 super.paintComponent(g);在g2d的变化之前?? c)我之前确实这样做过,但问题是它在开始时会旋转它,但是如果您更改某些组件的值 - 例如显示在其上的文本。它再次呈现非旋转...
-
@trashgod 请查看我的问题的编辑和我之前的评论,您可以看到与您的类似的解决方案以及我在问这个问题之前所做的解决方案。但它有我提到的问题。
-
完全正确;您可以
rotate()图形上下文重新定位像素,但AWT 和Swing 组件 被设计为直立使用。 -
如需尽快获得更好的帮助,请发帖minimal reproducible example 或Short, Self Contained, Correct Example。
标签: swing awt paint paintcomponent graphics2d