post覆盖java

时间:2015-12-09 15:11:01

标签: swing awt paint paintcomponent graphics2d

在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);

2 个答案:

答案 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。然后你可以改变旋转度并重新绘制标签,因此没有自定义绘画(图标本身除外)。