簡體   English   中英

帶圖形組件的Swing Timer

[英]Swing Timer with Graphics component

我想在每2秒出現和消失的面板上創建一個圓圈。 這是我有的:

public class Board extends JPanel implements ActionListener {

    private final int DELAY = 2000;

    private Timer timer;

    /*
     * constructor
     */
    public Board() {

        setFocusable(true);
        initGame();
    }

    /*
     * initialize board
     */
    public void initGame() {

        timer = new Timer(DELAY, this);
        timer.start();

    }

    public void paint(Graphics g) {

        super.paint(g);
        g.setColor(Color.gray);
        // draw an oval starting at 20,20 with a width and height of 100 and
        // fill it
        g.drawOval(20, 20, 100, 100);
        g.fillOval(20, 20, 100, 100);

        g.dispose();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        repaint();
    }
}

感謝大伙們。 現在我想控制自己的圈子。 但是再次出了點問題,它沒有按照我的意願移動。

這是新方法:

    private boolean left = false;
private boolean right = true;
private boolean up = false;
private boolean down = false;

private Timer timer;

public int x = 20;
public int y = 20;
public int x2 = 100;
public int y2 = 100;

...

    public void paint(Graphics g) {

    super.paint(g);
    if (drawCircle) {
        g.setColor(Color.gray);
        // draw an oval starting at 20,20 with a width and height of 100 and
        // fill it
        g.drawOval(x, y, x2, y2);
        g.fillOval(x, y, x2, y2);
    }
    // removes native non-Java recourses
    g.dispose();
}

public void move() {

    if (left) {
        x -= 5;
    }
    if (right) {
        x += 5;
    }
    if (up) {
        y -= 5;
    }
    if (down) {
        y += 5;
    }
}

@Override
public void actionPerformed(ActionEvent e) {

    move();
    repaint();
}

private class TAdapter extends KeyAdapter {

    public void keyPressed(KeyEvent e) {

        int key = e.getKeyCode();

        if ((key == KeyEvent.VK_LEFT) && (!right)) {
            left = true;
            up = false;
            down = false;
        }

        if ((key == KeyEvent.VK_RIGHT) && (!left)) {
            right = true;
            up = false;
            down = false;
        }

        if ((key == KeyEvent.VK_UP) && (!down)) {
            up = true;
            right = false;
            left = false;
        }

        if ((key == KeyEvent.VK_DOWN) && (!up)) {
            down = true;
            right = false;
            left = false;
        }
    }
}

/ * ** * /解決了,我剛剛添加了

addKeyListener(new TAdapter());

給我的董事會建設者!

您只需要讓您的Timer修改某些狀態即可。 嘗試這樣的事情:

private boolean drawCircle = false;

public void actionPerformed(ActionEvent e) {
    drawCircle = !drawCircle;
    repaint();
}

public void paintComponent(Graphics g) {
    //...
    if ( drawCircle ) {
       g.setColor(Color.gray);
       //...
    }
}

您不是應該提出問題...作為問題嗎?

無論如何,向您的班級添加一個布爾值,在每個動作事件上切換它,並且僅在橢圓為真時才對其進行繪制。

編輯/注釋:-覆蓋paintComponent而不是paint-不要處理尚未創建的圖形。 刪除該行,或使用g.create()進行復制。 有關詳細信息,請參見http://java.sun.com/products/jfc/tsc/articles/swing2d/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM