【问题标题】:Java Help! paintComponent woesJava 帮助!油漆组件问题
【发布时间】:2014-06-04 08:56:43
【问题描述】:

我是 Java 新手,每天都在学习新事物。 我正在尝试学习如何获取两个不同的 .png 文件并使用绘图组件单独旋转它们。 我能够使两个图像都绘制并具有单独的运动,但是旋转功能似乎无法将每个 2DGraphic 变量识别为独立的。

两个图像都将旋转到最后一个 '.rotate' 角度。我在网上查过,但每个关于旋转图形的教程都只处理一个图像。这工作正常。我只是无法让两个图像以不同的方式旋转。我希望 P1GFX 与 P2GFX 分开旋转。

这里是代码。 这段代码有效,但是它们都被旋转到最后一个 .rotate 指定的位置。

public void paintComponent(Graphics frogp1) {


            Graphics2D P1GFX = (Graphics2D)frogp1;
            Graphics2D P2GFX = (Graphics2D)frogp1;
            P1GFX.rotate(90, 150 / 2, 150 / 2);
            P2GFX.rotate(40, 50, 50);
            P1GFX.drawImage(p1.getImage1(), p1x, p1y,this);
            P2GFX.drawImage(p2.getImage2(), p2x, p2y, this);


}

所以,我尝试在paintComponent 中设置多个参数!那应该有效吗?没有! 此代码根本不会出现任何图像!当paintComponent中的参数不止一个时,屏幕上什么也没有画出来!

public void paintComponent(Graphics frogp1, Graphics frogp2) {


            Graphics2D P1GFX = (Graphics2D)frogp1;
            Graphics2D P2GFX = (Graphics2D)frogp2;
            P1GFX.rotate(90, 150 / 2, 150 / 2);
            P2GFX.rotate(40, 50, 50);
            P1GFX.drawImage(p1.getImage1(), p1x, p1y,this);
            P2GFX.drawImage(p2.getImage2(), p2x, p2y, this);


}

所以我想,嘿!也许我需要制作不止一个paintComponent!当然,如果不重新创建我自己的 repaint() 方法实例,这是不可能的。

public void paintComponent1(Graphics frogp1) {
            Graphics2D P1GFX = (Graphics2D)frogp1;
            P1GFX.rotate(90, 150 / 2, 150 / 2);
            P1GFX.drawImage(p1.getImage1(), p1x, p1y,this);

}
public void paintComponent2(Graphics frogp2) {
            Graphics2D P2GFX = (Graphics2D)frogp2;
            P2GFX.rotate(90, 150 / 2, 150 / 2);
            P2GFX.drawImage(p2.getImage2(), p2x, p2y,this);

}

这使得 repaint() 什么都不做,因此什么也没有被绘制。

请帮助我旋转多个图像/Graphics2D 变量!

【问题讨论】:

    标签: java swing rotation paintcomponent


    【解决方案1】:

    您可以旋转,然后取消旋转并重新定位:

    public void paintComponent(Graphics graphics) {
            Graphics2D g2d = (Graphics2D)graphics;
            g2d.rotate(90, 150 / 2, 150 / 2);
            g2d.drawImage(p1.getImage1(), p1x, p1y,this);
            g2d.rotate(-90, 150 / 2, 150 / 2);
            g2d.rotate(40, 50, 50);
            g2d.drawImage(p2.getImage2(), p2x, p2y, this);
    }
    

    【讨论】:

    • 我明白为什么这可以工作,但从长远来看,它会给我带来问题,因为旋转实际上会在每次按键时发生。
    【解决方案2】:
    Graphics2D P1GFX = (Graphics2D)frogp1;
    Graphics2D P2GFX = (Graphics2D)frogp1;
    

    铸造一个对象意味着您仍在使用相同的对象引用。

    如果你想要两个单独的 Graphics 对象,那么你需要这样做:

    Graphics2D p1gfx = (Graphics2D)frogp1.create();
    Graphics2D p2gfx = (Graphics2D)frogp1.create();
    

    那么当你完成你使用的 Graphics 对象时:

    p1gfx.dispose();
    p2gfx.dispose();
    

    我更改了变量名以遵循 Java 命名约定。变量名不要全部使用大写字符。

    【讨论】:

    • 谢谢!我明天会试试这个,这听起来很有希望!旁注:我故意没有使用正确的变量命名,因为与另一个类似项目有些混淆。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多