JPanel repaint()无效

时间:2014-04-03 17:09:06

标签: java swing paintcomponent graphics2d repaint

我搜索过几个与此类似标题的问题(例如how to use jpanel with paint (or repaint)),但我找不到我的代码无法工作的原因。我是一个带有JPanels新手的图形,所以我第一次尝试做这种事情就是制作一个可以用箭头键移动的三角形。我把三角画画得很好,没问题。但是,当我试图用箭头移动三角形时,它没有移动。任何人都可以找到为什么它不会重新粉刷?

JPanel代码(我还有一个单独的JFrame本类,它只生成框架并添加面板,如果你需要看到那个告诉我并且我将其编辑):

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Drawpanel extends JPanel implements KeyListener{

    int[] xcoords = {-20,0,20};//Triangle x coordinates
    int[] ycoords = {20,-20,20};//Triangle y coordinates
    int x = 100;//X coordinate for drawing the triangle
    int y = 100;//Y coordinate for drawing the triangle
    Graphics2D g2d;
    Polygon tri = new Polygon(xcoords,ycoords,xcoords.length);//triangle

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g2d = (Graphics2D)g;
        g2d.translate(x,y);//draw triangle at x and y coordinates
        g2d.setColor(new Color(234,22,72));
        g2d.fill(tri);
    }
    public void keyTyped(KeyEvent k){}
    public void keyReleased(KeyEvent k){}
    public void keyPressed(KeyEvent k)
    {
        int keycode = k.getKeyCode();
        switch(keycode)
        {
        case KeyEvent.VK_DOWN://if down arrow pressed, decrease ship y coordinate by 10
            y -= 10;
        case KeyEvent.VK_UP:
            y += 10;
        case KeyEvent.VK_LEFT:
            x -= 10;
        case KeyEvent.VK_RIGHT:
            x += 10;
        }   
        repaint();//screen doesn't repaint
    }   

}

1 个答案:

答案 0 :(得分:2)

不要使用KeyListener。 Swing旨在与Key Bindings一起使用。

可能的问题是面板没有焦点,也没有响应KeyEvents。有关详细信息,请参阅Motion Using the Keyboard以及使用键绑定的解决方案。

另一个可能的问题是,您不能覆盖面板的getPreferredSize()方法以返回适当的Dimension,因此大小为0,因此Swing认为没有任何内容可以绘制。