Как сделать анимированный круг?

1

Я все еще участвую в графическом интерфейсе, все еще испытывая некоторые проблемы с головою вокруг потоков:/

Im делает этот GUI, в котором есть 2 круга, один большой (100x100) и один маленький (50x50). Маленький будет идти к краю большого круга и в течение 0,5 секунд, маленький круг пойдет в центр и что он, когда пользователь должен щелкнуть. Всякий раз, когда пользователь нажимает, когда круг находится посередине, пользователь оценивает. Единственная проблема, с которой я сталкиваюсь, заключается в том, что круг не движется, так как я подозреваю, что это что-то связано с моими потоками, следовательно, причина, по которой im использует потоки, чтобы узнать, как их использовать.

графический интерфейс пользователя

public class gui extends JPanel implements MouseListener,
    Runnable {
Thread t = new Thread();


int score = 0;
int rnd;
static final int smallcircleposx = 75;
static final int smallcircleposy = 75;
int circleposx = 75;
int circleposy = 75;
int mousex, mousey;
Random random = new Random();

public gui() {

}

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.BLUE);
    g.fillOval(50, 50, 100, 100);
    g.setColor(Color.RED);
    g.fillOval(circleposx, circleposy, 50, 50);

}

// THREAD FOR MOVING THE CIRCLE
public void run() {
    rnd = random.nextInt(999);

    if (rnd % 5 == 0) {
        circleposx = circleposx + 25;
    } else if (rnd % 4 == 0) {
        circleposx = circleposx - 25;
    } else if (rnd % 3 == 0) {
        circleposy = circleposy + 25;
    } else {
        circleposy = circleposy - 25;
    }

    try {
        Thread.sleep(500);
        circleposx = smallcircleposx;
        circleposy = smallcircleposy;
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

public void mouseClicked(MouseEvent m) {

    if (circleposx == smallcircleposx && circleposy == smallcircleposy) {
        score++;
    }
}

ГЛАВНЫЙ

public class main {

public static void main(String[] args) {
    JFrame frame = new JFrame("Circle enlarger");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400,400);
    frame.setVisible(true);

    gui co = new gui();
    frame.add(co);
    frame.addMouseListener(co);
    Thread x = new Thread(new gui());
    x.start();


}

}

Я знаю, что я не использовал все методы mouselistener.

Теги:
user-interface
swing
animation
paintcomponent

1 ответ

1

Некоторые моменты, которые следует помнить:

  1. Используйте MouseAdaptor вместо MouseListener если вы не переопределяете все методы.

  2. Не красьте непосредственно над верхней частью контейнера уровня, такие как JFrame, JApplet вместо этого использовать JPanel

  3. Не используйте Thread.sleep() который когда-нибудь повесит все приложение swing, вместо этого попробуйте использовать Swing Timer, который наиболее подходит для приложения swing.

    Подробнее о том, как использовать качающиеся таймеры

  4. Не забудьте вызвать super.paintComponent() в переопределенном методе paintComponent().

  5. Call frame.setVisible(true) в конце после добавления всех компонентов.

  6. Используйте frame.pack() вместо frame.setSize() который соответствует компонентам в соответствии с предпочтительным размером компонента.

  7. Переопределите getPreferredSize() чтобы установить предпочтительный размер JPanel в случае пользовательской покраски.

  8. Используйте SwingUtilities.invokeLater() или EventQueue.invokeLater(), чтобы убедиться, что EDT инициализирован правильно.

    Прочитайте больше

Это стоит прочитать Урок: Выполнение пользовательской живописи


Пример кода: (измените его в соответствии с вашей собственной живописью)

private Timer timer;
...
// 500 Milli-seconds 
timer = new javax.swing.Timer(500, new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent arg0) {
        // change the coordinate
        panel.repaint();

        if (condition) {
            timer.stop(); // you can stop the timer anytime
        }
    }
});
timer.setRepeats(true); // you can turn-off the repeatation
timer.start();

public static void main(String args[]) {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            // Initialize the UI
        }
    });
}

class MyJPanel extends JPanel {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        ...
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(..., ...);
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню