在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
}
};
想象一下,你有容器的组件,例如可以包含一些JLabel,一些JTextFields,一些图像。这将全部放在一个组件上。
通过容器,我的意思是你有一些带有id的列表或地图或一些类似的结构,其中包含你将放在一个JFrame上的所有组件。
问题是我是否可以在创建所有组件之后更改绘制方法,此时所有组件都已创建。例如,我想做Graphisc2D中定义的旋转动作(旋转),以及所有旋转动作。
基本上我想要的是我通过我所拥有的组件列表并说:
"列表中的所有人(组件)将以某个角度旋转"。那可能吗?如果是的话怎么样?
编辑:
这是我不正确的解决方案:
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);
答案 0 :(得分:0)
我没有测试过这个,但似乎它会起作用。 JComponent的paint()方法调用:
paintComponent(co);
paintBorder(co);
paintChildren(co);
其中co是Graphics对象。理论上,您创建一个图像,检索图形对象,然后将其传递给paintChildren()
。如果您这样做,则必须自己致电paintComponent()
和paintBorder()
。然后,只需旋转图像并将其绘制到组件中即可。您可能需要裁剪图像或相应调整组件大小才能使其正常工作。它可能看起来像这样:
BufferedImage myImage;
@Override
public void paint(Graphics g){
myImage = new BufferedImage(getWidth(), getHeight(), BufferedImage.TRANSLUCENT);
//using a transparent BufferedImage might not be efficient in your case
Graphics myGraphics = myImage.getGraphics();
super.paintComponent(g);
super.paintBorder(g);
super.paintChildren(myGraphics);
//rotation code here
// ...
//draw children onto your component
g.drawImage(myImage, 0, 0,getWidth(), getHeight(), null);
}
我希望我没有犯任何错误,如果有效,请告诉我。
答案 1 :(得分:0)
基本上我想要的是我通过我所拥有的组件列表并说:"列表中的所有人(组件)将以某个角度旋转"。
如果要将面板上的所有组件旋转为单个,则需要在paintComponent()方法中进行自定义绘制。
如果要旋转(例如)每个具有不同旋转角度的单个图像,则可以在paintComponent(...)
方法中再次执行此操作,并更改每个组件的角度。
或者,在第二种情况下,您可以使用Rotated Icon类。在这种情况下,Icon只是添加到JLabel。然后你可以改变旋转度并重新绘制标签,因此没有自定义绘画(图标本身除外)。