Я хотел бы проиллюстрировать проект о железных дорогах.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, но я попытался их реализовать, и я не могу начать.
Спасибо за вашу помощь
Свинг не является потокобезопасным. Вы можете начать чтение учебника [Swing concurrency tutorial] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/), который уже узнал бы вас, что вы никогда не должны называть поток Thread.sleep в потоке Swing. Вместо этого используйте 'javax.swing.Timer', если хотите анимацию – Robin
См. Также [' FleetPanel'] (http://stackoverflow.com/a/14887457/230513). – trashgod