调用Paint方法但不重绘

时间:2014-03-12 21:55:45

标签: java jframe drawing jpanel paint

这里的问题是paintComponent()方法被调用,它获取fillRect()的必要变量,但在按下键后实际上并没有绘制任何东西。我不明白为什么因为每次按下D键时,mato.getPositionX()的返回值都会递增,并且递增的值会传递给fillRect()。这是代码:

屏幕类

public class Screen extends JFrame implements KeyListener {

private Mato mDrawScreensMato;

public Screen() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    pack();
    setVisible(true);
    setLocationRelativeTo(null);
    setSize(400, 400);
    DrawScreen screen = new DrawScreen();
    mDrawScreensMato = screen.getMato();
    addKeyListener(this);
    add(screen);
}

//keyTyped

@Override
public void keyPressed(KeyEvent ke) {
    int c = ke.getKeyCode();
    if (c == KeyEvent.VK_D) {
        mDrawScreensMato.setPositionX(mDrawScreensMato.getPositionX() + 1);
        repaint();
        }
    }

//keyReleased
}

DrawScreen类

public class DrawScreen extends JPanel {

private Mato mato;

public DrawScreen() {
    mato = new Mato();
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setColor(Color.RED);
    System.out.println(mato.getPositionX());
    g2d.fillRect(
            mato.getPositionX(), mato.getPositionY(),
            mato.MATO_WIDTH, mato.MATO_HEIGHT
    );
}

public Mato getMato() {
    return mato;
    }
}

马托班

public class Mato {
    final int MATO_WIDTH = 20;
    final int MATO_HEIGHT = 20;
    final int MATO_START_POS_X = 20;
    final int MATO_START_POS_Y = 40;

    private int positionX;
    private int positionY;

public Mato(){
        positionX = MATO_START_POS_X;
        positionY = MATO_START_POS_Y;
    }

public void setPositionX(int positionX) {
        this.positionX = positionX;
    }

public int getPositionX() {
        return positionX;
    }

//Get/Set positionY

}

1 个答案:

答案 0 :(得分:1)

问题的主要原因是您早期致电setVisible ......

一般的经验法则是,只有在准备好UI

后才调用setVisible
public Screen() {
    DrawScreen screen = new DrawScreen();
    mDrawScreensMato = screen.getMato();
    addKeyListener(this);
    add(screen);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    // This is a useless call as DrawScreen
    // does not provide appropriate sizing hints to the layout manager
    pack();
    setSize(400, 400);
    // This needs to be called AFTER the size of window has been determined,
    // as it uses the size of the window to determine it's location
    setLocationRelativeTo(null);
    setVisible(true);
}

KeyListener非常麻烦,你最好使用Key Bindings