2015-05-17 6 views
0

Я делаю круговое моделирование. Изображения все окрашены в doDrawing(), но программа подключена к серверу, поэтому я хочу рисовать (создавать) изображения из другого класса в соответствии с тем, что отправляет сервер. Для целей тестирования я идентифицирую массив byte на mousePressed() в классе Roundabout. Это работает, я вижу println от spawnPedestrian(), но пешеход не окрашен на JPanel.Покрасить изображения на JPanel из другого класса

Что мне нужно изменить в spawnPedestrian(), чтобы заставить его работать?

Roundabout.java - основной класс

public class Roundabout extends JFrame{ 

Track track=new Track(); 
TrafficLight trafficLight1=new TrafficLight(1); 
TrafficLight trafficLight3=new TrafficLight(3); 
TrafficLight trafficLight2=new TrafficLight(2); 
TrafficLight trafficLight4=new TrafficLight(4); 
TrafficLight trafficLight5=new TrafficLight(5); 
Car car=new Car(412, 750); // south to west 
Car car2=new Car(50,400); // west to south 
Car car3=new Car(700,290); //east to south 
Car car4=new Car(470,750); 
Bus bus=new Bus(); 
Bicycle bicycle=new Bicycle(); 
Pedestrian pedestrian = new Pedestrian(571,750); 
ArrayList<Car> cars = new ArrayList<>(); 
//public ArrayList<TrafficLight> trafficLights = new ArrayList<>{trafficLight3}(); 

public static Map<Integer,TrafficLight> trafficLights = new HashMap<>(); 

byte[] array=new byte[]{0,2,1,1}; //test byte array 

private Long startTime; 
private long playTime = 4000; 
private double i; 

static TCPClient client; 

Surface surface=new Surface(); 

class Surface extends JPanel { 

private void doDrawing(Graphics g) { 

    Dimension size = getSize(); 
    Insets insets = getInsets(); 

    int w = size.width - insets.left - insets.right; 
    int h = size.height - insets.top - insets.bottom; 

    /* Draw the track first */ 
    track.paint(g); 

    /* Draw a car */ 
    //car.START_POS = new Point(412, 750); 
    car.setCarLane(Lane.topLane); 
    car.paint(g); 
    cars.add(car); //add to list 

    //car2.START_POS=new Point(50,400); 
    car2.carRotation=180; 
    car2.setCarLane(Lane.wsLane); 
    car2.paint(g); 
    cars.add(car2); 

    car3.carRotation=360; 
    car3.setCarLane(Lane.esLane); 
    car3.paint(g); 
    cars.add(car3); 

    car4.setCarLane(Lane.seLane); 
    car4.paint(g); 
    cars.add(car4); 

    /*Draw a bus*/ 
    bus.paint(g); 

    /*Draw a bicycle */ 
    bicycle.setBicyclePath(Lane.bicyclePath); 
    bicycle.paint(g); 

    /*Draw a pedestrian */ 
    pedestrian.setPedestrianPath(Lane.pedesSePath); 
    pedestrian.paint(g); 

    /* Draw traffic light*/ 

    trafficLight1.setPosition(520, 333); 
    trafficLight1.paint(g); 

    trafficLight3.setPosition(100, 275); 
    trafficLight3.paint(g); 

    trafficLight2.setPosition(100, 400); 
    trafficLight2.paint(g); 

    trafficLight4.setPosition(355, 535); 
    trafficLight4.paint(g); 

    trafficLight5.setPosition(404, 535); 
    trafficLight5.paint(g); 


} 

@Override 
public void paintComponent(Graphics g) { 

    super.paintComponent(g); 
    doDrawing(g); 
} 
} 

public Roundabout(){ 
    initUI(); 

    trafficLights.put(trafficLight1.id, trafficLight1); 
    trafficLights.put(trafficLight2.id,trafficLight2); 
    trafficLights.put(trafficLight3.id,trafficLight3); 
    trafficLights.put(trafficLight4.id,trafficLight4); 
    trafficLights.put(trafficLight5.id,trafficLight5); 
} 


private void initUI() { 

    setTitle("Roundabout"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    add(surface); 

    //add start 
    this.addMouseListener(new MouseAdapter() {// empty implementation of all 
     // MouseListener`s methods 
     @Override 
     public void mousePressed(MouseEvent e) { 
      System.out.println(e.getX() + "," + e.getY()); 
      ByteProtocol proto=new ByteProtocol(); 
      proto.identifyByteArray(new byte []{0x01,0x02,0x01,0x00}); 

     } 
    }); 
    //end add 

    //setSize(580, 550); 
    setSize(1618,850); 
    setLocationRelativeTo(null); 

} 


public static void main(String[] args) { 


    //Swing thread 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 

      Roundabout roundabout=new Roundabout(); 
      roundabout.setVisible(true);  
      roundabout.moveCar();  
     } 
    });    

    } 
} 

метод ByteProtocol.java, где spawnPedestrian() называется.

public void identifyByteArray(byte [] inputArray) { 

    byte identifier=inputArray[0]; 


    switch(identifier){ 
     case vehicle: 
      System.out.println("Identifier: Vehicle"); 
      decodeVehicleArray(inputArray); 
      break; 
     case trafficLight: 
      System.out.println("Traffic light"); 
      decodeTrafficLightArray(inputArray); 
      break; 
     case vehicleRegistration: 
      System.out.println("Vehicle registration"); 
      decodeVehicleRegistrationArray(inputArray); 
      break; 
     default: System.out.println("Unable to identify the byte array."); 
      break; 
    } 
} 

public void decodeVehicleArray(byte [] vehicleArray){ 

    byte startPosition=vehicleArray[1]; 
    String startPositionString = directions.get(startPosition); 
    System.out.println("Start position: "+startPositionString); 

    byte endPosition=vehicleArray[2]; 
    String endPositionString = directions.get(endPosition); 
    System.out.println("End position: "+endPositionString); 

    byte vehicleType=vehicleArray[3]; 
    String vehicleTypeString=vehicles.get(vehicleType); 
    System.out.println("Vehicle: "+vehicleTypeString); 


    Spawn spawn=new Spawn(); 
    spawn.spawnPedestrian(); 


    } 

Spawn.java

public class Spawn { 

Roundabout roundabout = new Roundabout(); 

public void spawnPedestrian(){ 
    Pedestrian p = new Pedestrian(30,50); 

    System.out.println("Spawn me "); 

    p.setVisible(true); 
    roundabout.surface.add(p); 
    roundabout.surface.revalidate(); 
    roundabout.surface.repaint(); 
    roundabout.revalidate(); 
    roundabout.repaint(); 

    } 
} 
+1

Чтобы лучше помочь, отправьте сообщение [MCVE] (http://stackoverflow.com/help/mcve) (минимальный полный проверяемый пример) или [SSCCE] (http://www.sscce.org/) (Short , Self Contained, Правильный пример). –

ответ

0

Когда вы пишете Roundabout roundabout = new Roundabout(); в классе Spawn, вы создаете новый объект типа Roundabout (новый JFrame в конце концов), и вы не» t хотите новый объект этого типа, вы хотите тот, который уже создан.

Что вам нужно сделать, это ссылка на поверхность JPanel от класса Spawn через геттер. Так что добавьте этот метод Roundabout класса и вызывать его из Spawn, чтобы получить его контекст и уметь рисовать на нем:

public static JPanel getSurface() 
{ 
    return surface; 
} 

А потом в классе Spawn удалить Roundabout roundabout = new Roundabout();, получить объект Surface JPanel и рисовать на ней:

public class Spawn { 

    public void spawnPedestrian(){ 
    Pedestrian p = new Pedestrian(30,50); 

    System.out.println("Spawn me "); 

    p.setVisible(true); 
    Roundabout.getSurface.add(p); 
    Roundabout.getSurface.revalidate(); 
    Roundabout.getSurface.repaint(); 
    Roundabout.getSurface.revalidate(); 
    Roundabout.getSurface.repaint(); 
    } 
} 

Обратите внимание, что вам необходимо будет сделать объект JPanel Surface статическим.

+0

Если make 'surface' static, я получаю ошибки в' initUI', потому что этот метод не является статическим. И если я удалю Roundabout roundabout = new Roundabout(), 'как бы я нарисовал JFrame? – Sybren

+0

@Sybren Вы получаете ошибки в 'initUI()', потому что вы пытаетесь ссылаться на статический объект из нестатического контекста, поэтому вы должны также сделать свой метод initUI() 'также статическим. Дело в том, что вам не нужен новый объект типа Roundabout, так как у вас уже есть другой. Если вы сделаете еще один «JFrame», вы не будете рисовать на главной. – Drumnbass

+0

Я сделал «кольцевой» статический, и геттер для панели выглядит так: 'public JPanel getSurface() { обратная поверхность; } 'и в' spawnPedestrian() 'Я делаю' Roundabout.roundabout.getSurface() 'для доступа к JPanel, но ничего не окрашивается. – Sybren

Смежные вопросы