Застрял в дизайне - PullRequest
       2

Застрял в дизайне

0 голосов
/ 17 апреля 2011

У меня есть небольшая Java-программа с графическим интерфейсом, над которой я работаю, но разработка того, как части должны работать вместе, разочаровывает меня. По сути, мне нужно нарисовать «машину» на панели и прикрепить эту панель к раме. Затем анимируйте панель, чтобы создать иллюзию движения.

Моя проблема в том, что я не понимаю, как переместить код, который выполняет анимацию, в свой собственный класс. Когда я начал работать над этим, я сначала создал элементы интерфейса. Затем я наткнулся на класс Timer и использовал этот класс в том, что должно было быть просто элементом класса UI (CarBody). Теперь мой код работает так, что, как только я запускаю программу, «машина» начинает двигаться, потому что я не настроил ее на нажатие кнопки. Я не понимаю, как переместить код анимации в класс on и вызвать его нажатием кнопки.

Я мог бы решить эту проблему за две секунды, ЕСЛИ я мог вызвать repaint () в методе executeAction (). Проблема в том, что я не могу этого сделать! Это не скомпилируется таким образом.

То, что я сделал, это

class CarBody extends JPanel {
    private int xCoordinate = 0;
    CarBody(){
        Timer timer = new Timer(1000,new TimerListener());
        timer.start();

}

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        //g.fillRect(10, 10, 60, 50);

        if(xCoordinate > getWidth()){
            xCoordinate = -20;
        }
        xCoordinate +=100;
        g.fillRect(xCoordinate,10,60,50);

}

    class TimerListener implements ActionListener{
        public void actionPerformed(ActionEvent e){
            repaint();

        }
    }
}

1 Ответ

2 голосов
/ 17 апреля 2011

Я мог бы решить эту проблему за две секунды, ЕСЛИ я мог вызвать repaint () в методе executeAction ().

Не следует изменять координаты автомобиля в методе paintComponent ().У вас должен быть метод, который устанавливает координаты, а затем перерисовывает автомобиль.

Когда вы создаете класс ActionListener, затем передаете панель, которую вы хотите перекрасить, в качестве параметра класса.Затем вы можете вызвать метод "changeLocation", который обновит местоположение автомобиля, а затем вызовет repaint () для себя.

Для другого подхода вы можете добавить значок к метке и просто изменить местоположениеярлык, и он будет перекрашиваться автоматически.Вот простой пример:

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

public class TimerAnimation extends JLabel implements ActionListener
{
    int deltaX = 2;
    int deltaY = 3;
    int directionX = 1;
    int directionY = 1;

    public TimerAnimation(
        int startX, int startY,
        int deltaX, int deltaY,
        int directionX, int directionY,
        int delay)
    {
        this.deltaX = deltaX;
        this.deltaY = deltaY;
        this.directionX = directionX;
        this.directionY = directionY;

        setIcon( new ImageIcon("dukewavered.gif") );
//      setIcon( new ImageIcon("copy16.gif") );
        setSize( getPreferredSize() );
        setLocation(startX, startY);
        new javax.swing.Timer(delay, this).start();
    }

    public void actionPerformed(ActionEvent e)
    {
        Container parent = getParent();

        //  Determine next X position

        int nextX = getLocation().x + (deltaX * directionX);

        if (nextX < 0)
        {
            nextX = 0;
            directionX *= -1;
        }

        if ( nextX + getSize().width > parent.getSize().width)
        {
            nextX = parent.getSize().width - getSize().width;
            directionX *= -1;
        }

        //  Determine next Y position

        int nextY = getLocation().y + (deltaY * directionY);

        if (nextY < 0)
        {
            nextY = 0;
            directionY *= -1;
        }

        if ( nextY + getSize().height > parent.getSize().height)
        {
            nextY = parent.getSize().height - getSize().height;
            directionY *= -1;
        }

        //  Move the label

        setLocation(nextX, nextY);
    }

    public static void main(String[] args)
    {
        JPanel panel = new JPanel();
        JFrame frame = new JFrame();

        frame.setContentPane(panel);
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.getContentPane().setLayout(null);
//      frame.getContentPane().add( new TimerAnimation(10, 10, 2, 3, 1, 1, 10) );
        frame.getContentPane().add( new TimerAnimation(300, 100, 3, 2, -1, 1, 20) );
//      frame.getContentPane().add( new TimerAnimation(0, 000, 5, 0, 1, 1, 20) );
        frame.getContentPane().add( new TimerAnimation(0, 200, 5, 0, 1, 1, 80) );
        frame.setSize(400, 400);
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
//      frame.getContentPane().add( new TimerAnimation(10, 10, 2, 3, 1, 1, 10) );
//      frame.getContentPane().add( new TimerAnimation(10, 10, 3, 0, 1, 1, 10) );
    }
}

В этом примере не выполняется нестандартное рисование, а анимация выполняется путем вызова метода setlocation (...) на метке, который вызовет repaint (), так чторешение немного отличается от вашего, но ключевой момент - НЕ изменять значения местоположения в методе paintComponent ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...