Swing 在java中对组件的绘制方法进行后期重写

Swing 在java中对组件的绘制方法进行后期重写,swing,awt,paint,paintcomponent,graphics2d,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) {

在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和一些image组成。这些都将放在一个组件上。 通过容器,我的意思是你有一些列表或带有ID的映射或类似的结构,其中的所有组件都将放在一个JFrame上。
问题是,在使用此列表中的所有组件进行创建后,如果所有组件都已创建,是否可以更改绘制方法。例如,我想对所有这些对象执行旋转动作(rotate),这在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);

我还没有测试过这个,但它似乎可以工作。JComponent的paint()方法调用:

paintComponent(co);
paintBorder(co);
paintChildren(co);
其中co是一个图形对象。理论上,您可以创建一个图像,检索图形对象,然后将其传递到
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);

}
我希望我没有犯任何错误,请让我知道这是否有效

所以基本上我想要的是,我浏览了我拥有的组件列表,并说:“列表中的所有组件都将以一定角度旋转”

如果要旋转面板,从而将面板上的所有组件作为一个单独使用,则需要在paintComponent()方法中进行自定义绘制

例如,如果要旋转每个具有不同旋转角度的单个图像,则可以在
paintComponent(…)
方法中再次执行此操作,并更改每个组件的角度


或者,在第二种情况下,您可以使用该类。在这种情况下,图标只是添加到JLabel中。然后,您可以更改旋转度并重新绘制标签,这样就没有自定义绘制(图标本身除外)。

很简单,是的,但请看这个。@trashgood谢谢,但是a)如果您阅读了我的问题,我问您是否可以在创建后进行绘制,但您的示例在创建期间进行了绘制。b) 为什么不叫super.paintComponent(g);在g2d改变之前??c) 我以前确实这样做过,但问题是它在开始时会旋转它,但如果您更改某个组件的值,例如它上面显示的文本。它再次呈现为非旋转…@trashgood请查看我的问题和我之前的评论的编辑,您可以看到类似于您的解决方案,以及我在提出此问题之前所做的解决方案。但它有我提到的问题;您可以
rotate()
图形上下文来重新定位像素,但是AWT和Swing组件被设计为直立使用。为了更快地获得更好的帮助,请发布or。因为除了背景信息之外,没有人回答问题,所以我加粗了真正的问题是什么。如果我理解正确,绘制组件是在创建仪器之前必须覆盖的方法。但由于现有应用程序中所有组件的创建机制都很复杂,我问,如果您已经有了所有组件的创建列表,并且希望更改它们的旋转,是否可以通过其他方式实现。注意:我认为不可能覆盖现有对象的方法,所以我不能在绘画组件中这样做。@user1097772,问题已经解决了。不,除非覆盖绘制方法,否则在将组件添加到GUI后,不能旋转组件。或者,除非您想创建一个“包装面板”面板,以便从GUI中删除现有面板,并将此面板添加到包装面板,然后将包装面板添加到GUI中。同样,这意味着您需要在包装器面板中进行自定义绘制。因此,您不能仅仅使用现有的GUI并旋转组件。那么包装器面板呢?我可能是解决方案,但它不能解决面板上组件的痛苦?我以前试过,我也试过旋转它,即使是组件,但当组件更新后,它们会在上面重新绘制,而不是旋转。所以从我的角度来看,应该在左上角的是右下角的“上下颠倒”。因为JPanel的旋转(我将其设置为conent窗格)不知何故不会影响更新组件后的重新绘制。我不明白为什么我们在兜圈子。张贴一篇演示您正在尝试做什么的文章。坦率地说,你的要求对我来说毫无意义。即使您旋转组件,它们也无法工作,因为您将无法使用鼠标在文本字段中键入内容或与任何组件交互,因为将为错误的点生成事件。图像的意义是什么?我想在contentPane的中心位置创建组件,为什么要使用一些图像?您的问题有点让人困惑。当你说你想“例如,我想做旋转动作(rotate),这是在Graphisc2D中定义的,与所有的对象一起”时,我以为你想旋转
内容窗格中的所有对象。这个图像的原因是你可以旋转它。是的,当然,你是对的。但我可能只是没有真正得到图像的部分,或者我无法从代码中看到它,我想它可能在那里。我会的