翻译/旋转/移动图形对象而不会弄乱整个屏幕

时间:2014-04-05 15:43:38

标签: java user-interface paint graphics2d redraw

我正在编写一个GUI,它将进行一些图形转换/旋转等。

我的问题是,当我尝试翻译我的图片时,

(a)整个屏幕翻译而不是我的一个小画面区域

(b)旧油漆留在那里,留下一个大油漆斑点而不是翻译图像

(c)如果我使用clearRect方法允许我避免(b),整个屏幕变白并且(a)仍然是个问题

我的DrawPanel类(无论出于何种原因我称之为“LaunchTubeImage”)

private class LaunchTubeImage extends JPanel {

    private Color colour;


    public LaunchTubeImage(Color color) {
        super();
        this.colour = color;
    }

    public void paintComponent(Graphics g) {
        Graphics2D gg = (Graphics2D)g;
        double theta = (double)angle.getValue(); 
        theta = Math.toRadians(theta);
        gg.rotate(theta,tubeImage.getSize().width/2 + 10,
            tubeImage.getSize().height - 50);

        g.setColor(colour);

        g.clearRect(0,0,getWidth(),getHeight());
        g.fillRect(tubeImage.getSize().width/2,
            tubeImage.getSize().height - 100 , 10, 50);
    }
}

在我的代码中调用它

tubeImage = new LaunchTubeImage(Color.MAGENTA);


angle.addChangeListener(new ChangeListener(){
    public void stateChanged(ChangeEvent e) {
        tubeImage.repaint();
    }
});

案例1:在我发布的第一个代码块

中注释掉clearRect

http://i58.tinypic.com/2d1l5w2_th.png 根据需要黑色背景。还没有轮换。到目前为止看起来不错。

http://oi60.tinypic.com/1zw1sm.jpg 用我的JSpinner旋转它...你看到之前的位置没有被移除(并注意我的按钮是如何随机加倍并将它们自己放在屏幕的顶部)。

案例2:保持clearRect方法

oi57.tinypic.com/2s84307.jpg 到目前为止布局很好,但我希望背景为黑色

oi57.tinypic.com/4rde8x.jpg 好极了!它旋转了。但请注意出现在我右上角的随机“15”的奇怪行为

oi58.tinypic.com/vymljm.jpg 最后......当我调整窗口大小时,您会看到我的整个屏幕都旋转了 - 而不仅仅是我想要旋转的粉红色图像

提示/修复/建议?谢谢!!我希望我已经提供了足够的信息 (例如,如果你坚持要求我们提出明确/有用的问题......那么不要限制你可以发布的图像数量......:/)

1 个答案:

答案 0 :(得分:1)

被覆盖的paintComponent方法的第一行通常应为super.paintComponent(g)。在JPanel上,这将导致使用背景颜色清除绘图区域。如果要使用不同的颜色清除背景,可以通过手动填充矩形来完成此操作(不建议使用clearRect,请参阅JavaDoc),但当然,这必须在之前完成应用任何变换。

所以你的方法应该是这样的:

@Override 
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    g.setColor(colour);
    g.fillRect(0,0,getWidth(),getHeight());

    Graphics2D gg = (Graphics2D)g;

    double theta = (double)angle.getValue(); 
    theta = Math.toRadians(theta);
    gg.rotate(theta,tubeImage.getSize().width/2 + 10,tubeImage.getSize().height - 50);
    gg.fillRect(tubeImage.getSize().width/2,tubeImage.getSize().height - 100 , 10, 50);
}