图像被mouseDragged方法重新绘制时闪烁

时间:2016-03-14 22:00:10

标签: java swing jframe repaint

正如标题所示,我的问题是我希望能够拖动图像 在这种特定情况下,我想将图像从一个JPanel(或者更确切地说是我自己的子类)拖到另一个(不同的)JPanel子类中。因此,我在我的JPanel子类中添加了MouseListener,因此在单击面板中的某个区域时,会选择在JFrame(子类)上绘制图像。这是一些代码,所以你会理解我的问题:

public void mousePressed(MouseEvent e) {
    int x = e.getX();
    int y = e.getY();
    if (x >= 10 && x < 42 && y >= 10 && y < 42) {
        image = barracks;   //barracks is a predefined image, created in the constructor
        dragBuilding = true;
        PixelMain.pixelMain.repaint(); //pixelMain is an instance of the JFrame subclass
    }
}
//irrelevant code, e.g mouseMoved, ...
public void mouseDragged(MouseEvent e) {
    if (dragBuilding) {
        //System.out.println("GPanel mouseDragged");
        PixelMain.pixelMain.repaint();
    }
}

JFrame子类只包含构造函数和以下代码:

public void paint(Graphics g) {   //i would have used paintComponent, but it seems like JFrame does not have this method ...?
    super.paint(g);
    if (PixelMain.panelOffense.getDragBuilding()) {  //panelOffense is an instance of the JPanel subclass, getDragBuilding returns a boolean that depends on whether the mouse is held down at the moment
        Graphics2D g2 = (Graphics2D) g;
        Rectangle2D tr = new Rectangle2D.Double((int)getMousePosition().getX(), (int)getMousePosition().getY(), 16, 16); //size of the texture
        TexturePaint tp = new TexturePaint(PixelMain.panelOffense.getImg(), tr);
        g2.setPaint(tp);
        Rectangle2D r = (Rectangle2D) new Rectangle((int)getMousePosition().getX(), (int)getMousePosition().getY(), 16, 16); //area to fill with texture
        g2.fill(r);

        System.out.println("test");
    }
}

在你问之前 - 我确实将一些代码移到了其他类中,因此它的调用次数较少,但这不是问题所在。即使paint方法只绘制一个矩形(直接在Graphics g上,而不是Graphics2D上),矩形也会闪烁 如果有人能帮我找出解决方案,我会非常感激!

注意:我知道在JFrame或JFrame的子类上绘制可能不是很优雅,但我个人不知道其他选择。
注意2:根据我读过的google / stackoverflow结果或线程,我应该使用JPanel,它似乎是双缓冲的(不管是什么,我真的不明白。但是再说一次,这几乎是晚上11点了)。因此,我可能会将所有组件移动到JPanel来解决问题,但我想尝试解决问题而不这样做。
注3:是的,代码属于我正在编写的(策略)游戏,但考虑到问题与游戏开发并不完全相关,我决定在此处发布,而不是在游戏开发堆栈交换。

0 个答案:

没有答案