2013-06-27 9 views
0

Я хотел бы проиллюстрировать проект о железных дорогах.Java-темы с Swing

Я решил использовать Swing. У меня есть фоновая карта в JPanel, и я рисую маленькие круги, которые движутся по железным дорогам. Он отлично работает, если у меня есть только один поезд, но я хотел бы добавить больше поездов.

Вот что я начал делать (и работает):

public static void main(String[] args) { 

    // JFrame and background panel construction 
    JFrame frame = new JFrame(); 
    JLayeredPane lpane = new JLayeredPane(); 
    ImagePanel panelBg = new ImagePanel(new ImageIcon("map.jpg").getImage());; 

    frame.setPreferredSize(new Dimension(1791, 695)); 
    frame.setLayout(new BorderLayout()); 
    frame.add(lpane,BorderLayout.CENTER); 
    lpane.setBounds(0,0,panelBg.getImg().getWidth(null),panelBg.getImg().getHeight(null)); 

    panelBg.setBounds(0,0,panelBg.getImg().getWidth(null),panelBg.getImg().getHeight(null)); 
    panelBg.setOpaque(true); 

    lpane.add(panelBg, new Integer(0), 0); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setVisible(true); 
    go(lpane,panelBg); 
    } 

private static void go(JLayeredPane pan,ImagePanel panBg) { 

    Parcours panelP = new Parcours(); 
    panelP.setBounds(0,0,panBg.getImg().getWidth(null),panBg.getImg().getHeight(null)); 
    panelP.setOpaque(false); 
    pan.add(panelP, new Integer(1), 0); 

    for(int i=0; i<panelP.getTable().size(); i++){ 
    panelP.setPosX(panelP.getTable().get(i).getX()-6); 
    panelP.setPosY(panelP.getTable().get(i).getY()-6); 
    panelP.repaint(); 
    try{ 
     Thread.sleep(100); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

«идти» читает ArrayList, содержащие координаты, где мой круг должен идти.

Я действительно не знаю, как создать несколько поездов. Должен ли я создать несколько JPanels или только один со всеми моими кругами?

Если я хорошо помню, я должен использовать Threads, но я попытался их реализовать, и я не могу начать.

Спасибо за вашу помощь

+4

Свинг не является потокобезопасным. Вы можете начать чтение учебника [Swing concurrency tutorial] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/), который уже узнал бы вас, что вы никогда не должны называть поток Thread.sleep в потоке Swing. Вместо этого используйте 'javax.swing.Timer', если хотите анимацию – Robin

+1

См. Также [' FleetPanel'] (http://stackoverflow.com/a/14887457/230513). – trashgod

ответ

1

Вы можете использовать центральный объект данных, который хранит trains.In каждый цикл поезда втянуться в разгаре. С другой стороны, поезда обновляются из ваших потоков.

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

0

Спасибо, Робин (см. Комментарии к моему первому сообщению), качели-таймеры кажутся лучшим решением. Я удалил свой ужасный Thread.sleep и установил таймеры вместо этого, он работает, еще раз спасибо.

спасибо Templar тоже