2015-04-11 3 views
1

Я должен сделать Java Project о системе управления лифтом.Java Swing Animations

Моя проблема в 2 JPanel. Сначала для JLabel и Button 's, по одному для каждого этажа - я использую компоновку, потому что я хочу, чтобы она была отзывчивой. Перед началом программы у меня есть диалог, который я могу установить для первого и последнего уровня пола. Вот код:

public void setFloors() { 
    floorNavigation = new JPanel(); 
    floorNavigation.setLayout(new BoxLayout(floorNavigation, BoxLayout.Y_AXIS)); 
    floorNavigation.add(Box.createVerticalGlue()); 
    for(JPanel p : floorPanels){ 
     floorNavigation.add(p); 
    } 
    floorNavigation.add(Box.createVerticalGlue()); 
    frame.add(floorNavigation, BorderLayout.LINE_START); 
} 

public void createFloorPanel() { 
    JPanel floorPanel; 
    for(JLabel l : floorLabels){ 
     floorPanel = new JPanel(new FlowLayout()); 
     floorPanel.add(l); 
     floorPanel.add(floorButtons.get(floorLabels.indexOf(l))); 
     floorPanels.add(floorPanel); 
    } 
} 

Я хочу сделать лифт двигаться анимацию Y каждого JLabel в другом JPanel. Любые идеи, как это сделать? Такие вещи, как getY(), не работают.

ответ

0

Если я правильно понял, что панель, содержащая кнопки и панель, содержащая анимацию, будет располагаться рядом друг с другом и, таким образом, будет иметь одинаковую высоту. В этой ситуации вы можете рассчитать координаты Y координат, просто зная текущую высоту панели и количество кнопок, которые у вас есть. Просто разделите высоту с количеством кнопок и умножьте количество этажей, которые вы хотите достичь (обратите внимание, что это даст вам полы в обратном порядке, сверху вниз).

После вычисления этих позиций вы можете использовать простую линейную анимацию для перемещения своего «лифта» (я угадываю импортированный значок или изображение) в соответствующие положения кнопок. Вот простой шаблон для анимации (маленький круг представляет ваш лифт изображение):

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JButton; 
import javax.swing.SwingUtilities; 
import javax.swing.SwingWorker; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class SimpleAnimation { 

    static int x; 
    static int y = 150; 
    static int floor_distance = 130; 
    static int animation_speed = 10; //less is faster 
    static MyDrawPanel panel = new MyDrawPanel(); 

    public static void main(String[] args) { 

    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    final JButton buttonUp = new JButton("Floor Up"); 
    final JButton buttonDown = new JButton("Floor Down"); 

    buttonUp.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
     (new AnimatorUp()).execute(); 
     } 
    }); 

    buttonDown.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
     (new AnimatorDown()).execute(); 
     } 
    }); 

    frame.getContentPane().add(BorderLayout.NORTH, buttonUp); 
    frame.getContentPane().add(BorderLayout.SOUTH, buttonDown); 
    frame.getContentPane().add(panel); 
    frame.setSize(300,300); 
    frame.setVisible(true); 
    } 

    static class AnimatorUp extends SwingWorker<String, Object> { 
    @Override 
    public String doInBackground() { 
     try { 
     x = (int)(panel.getWidth()/2); 
     for(int i = 0; i < floor_distance; i++) { 
      y--; 
      panel.repaint(); 
      try{ Thread.sleep(animation_speed); } catch(Exception ex) { ex.printStackTrace(); } 
     } 
     } catch (Exception ignore) { 
     } 
     return ""; 
    } 
    } 

    static class AnimatorDown extends SwingWorker<String, Object> { 
    @Override 
    public String doInBackground() { 
     try { 
     x = (int)(panel.getWidth()/2); 
     for(int i = 0; i < floor_distance; i++) { 
      y++; 
      panel.repaint(); 
      try{ Thread.sleep(animation_speed); } catch(Exception ex) { ex.printStackTrace(); } 
     } 
     } catch (Exception ignore) { 
     } 
     return ""; 
    } 
    } 

    static class MyDrawPanel extends JPanel { 
    public void paintComponent(Graphics g) { 
     g.fillRect(0, 0, this.getWidth(), this.getHeight()); 
     g.setColor(new Color(215,215,215)); 
     x = (int)(panel.getWidth()/2); 
     g.fillOval(x, y, 50, 50); 
    } 
    } 

} 

Вы можете изменить этот код, чтобы кнопки запуска анимации, которая перемещает «лифт» к определенному полу. Вычисляя разницу между текущей Y-позицией «лифта» и положением Y желаемого пола, вы можете настроить направление и диапазон анимации.