2017-01-24 6 views
0

EDIT :私のmove()方法では、Javaは2文それをシンプルに保つことGUIスレッド移動()メソッドの誤動作

場合の1をスキップしているようです。私は、次のようなモデルのJavaでGUIを作ろうとしていますclass Truckの動作:青い四角は、それらの対角を走らせることになっています。しかし、一度彼らが正方形の端点に達すると、彼らは戻ってくるはずです。私はこれを防ぐための条件を設けましたが、決して通過しません。 GUIとDrawableをアップロードしますが、必要とは思われません。

enter image description here

クラストラック:

package construction_site; 

import java.awt.Color; 
import java.awt.Graphics; 

import javax.swing.plaf.ButtonUI; 

public class Truck extends Thread implements Drawable { 

    private boolean isFull = false; 
    private int x, y; 
    private int capacity; 
    private Panel panel; 
    static int r = 20; 
    private int dx, dy; 
    private Site site; 
    private Building building; 

    public Truck(int x, int y, Panel panel, Building building, Site site) { 
     this.x = x; 
     this.y = y; 
     this.building = building; 
     this.panel = panel; 
     this.site = site; 
     this.start(); 
    } 

    public void setCapacity(int capacity) { 
     this.capacity = capacity; 
    } 

    @Override 
    public void run() { 
     super.run(); 

     while (true) { 
      move(); 
      panel.repaint(); 

      try { 
       sleep(10); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 

    } 

    public int getX() { 
     return x; 
    } 

    public int getY() { 
     return y; 
    } 

    public void setDirection(int i) { 

     if (i == 0) { 
      dx = -1; 
      dy = -1; 
     } 

     if (i == 1) { 
      dx = 1; 
      dy = -1; 
     } 

     if (i == 2) { 
      dx = -1; 
      dy = 1; 

     } 

     if (i == 3) { 
      dx = 1; 
      dy = 1; 

     } 

    } 

    private void move() { 

     if (site.truckOnSite(x, y)) { 
      site.loadTruck(this); 
      dx *= -1; 
      dy *= -1; 
     } 

     if (building.containsTruck(this)) { 
      building.unloadTruck(this); 
      dx *= -1; 
      dy *= -1; 
     } 

     x += dx; 
     y += dy; 

    } 

    public int getDx() { 
     return dx; 
    } 

    public void setFull(boolean isFull) { 
     this.isFull = isFull; 
    } 

    @Override 
    public void draw(Graphics g) { 
     g.setColor(Color.BLUE); 
     if (isFull) 
      g.fillRect(x - 10, y - 10, r, r); 
     else 
      g.drawRect(x - 10, y - 10, r, r); 
    } 

} 

クラスパネル:

package construction_site; 

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.util.ArrayList; 

import javax.swing.JPanel; 

public class Panel extends JPanel { 

    private ArrayList<Drawable> drawables = new ArrayList<>(); 
    private Site site; 
    private Building[] buildings = new Building[4]; 
    private Truck[] trucks = new Truck[4]; 
    private Van[] vans = new Van[4]; 

    public Panel(int w, int h) { 
     setPreferredSize(new Dimension(w, h)); 

     site = new Site(100, 75, 500, 500, this); 
     drawables.add(site); 

     buildings[0] = new Building(100, 75, this); 
     buildings[1] = new Building(100 + 500, 75, this); 
     buildings[2] = new Building(100, 75 + 500, this); 
     buildings[3] = new Building(100 + 500, 75 + 500, this); 

     for (Building b : buildings) 
      drawables.add(b); 

     trucks[0] = new Truck(100 + 250, 75 + 250, this, buildings[0], site); 
     trucks[1] = new Truck(100 + 250, 75 + 250, this, buildings[1], site); 
     trucks[2] = new Truck(100 + 250, 75 + 250, this, buildings[2], site); 
     trucks[3] = new Truck(100 + 250, 75 + 250, this, buildings[3], site); 

     for (int i = 0; i < 4; i++) 
      trucks[i].setDirection(i); 

     for (Truck t : trucks) 
      drawables.add(t); 

    } 


    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     for (Drawable d : drawables) 
      d.draw(g); 
     g.setColor(Color.GREEN); 
     for (int i = 1; i <= 3; i++) 
      g.drawLine(buildings[0].getX(), buildings[0].getY(), buildings[i].getX(), buildings[i].getY()); 
     g.drawLine(buildings[1].getX(), buildings[1].getY(), buildings[2].getX(), buildings[2].getY()); 
    } 

} 

クラスビル:

package construction_site; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.util.concurrent.locks.Condition; 
import java.util.concurrent.locks.ReentrantLock; 

public class Building extends Thread implements Drawable { 

    private Panel panel; 
    private boolean done = false; 
    private int x, y; 
    static int w = 100; 
    static int h = 100; 
    private ReentrantLock lock = new ReentrantLock(); 
    private Condition insufficientMaterial = lock.newCondition(); 
    private Condition insufficientMisc = lock.newCondition(); 
    private Condition sufficient = lock.newCondition(); 
    private int material = 0; 
    private int misc = 0; 
    private int spent = 0; 

    public Building(int x, int y, Panel panel) { 
     this.x = x; 
     this.y = y; 
     this.panel = panel; 
     this.start(); 
    } 

    @Override 
    public void run() { 
     super.run(); 

     lock.lock(); 

     while(material < 100) 
      try { 
       insufficientMaterial.await(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

     spent += 150; 
     misc -= 50; 
     material -= 100; 

     try { 
      sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

    } 

    public void unloadVan(Van v) { 

     lock.lock(); 
     System.out.println("Truck got in"); 

     if (material >= 100 && misc >=50) { 

     } 
     misc += 50; 
     v.setCapacity(0); 

     insufficientMisc.signalAll(); 
     lock.unlock(); 

    } 

    public void unloadTruck(Truck t) { 

     lock.lock(); 


     material += 10000; 
     t.setCapacity(0); 
     t.setFull(false); 

     insufficientMaterial.signalAll(); 
     lock.unlock(); 
    } 


    public void setMaterial(int material) { 
     this.material = material; 
    } 

    public void setMisc(int misc) { 
     this.misc = misc; 
    } 


    public boolean containsVan(int x2, int y2) { 
     return (Math.sqrt((x - x2)*(x - x2) + (y - y2)*(y - y2)) <= h/2); 
    } 

    public boolean containsTruck(Truck t) { 
     return (x == t.getX() && y == t.getY()); 
    } 

    public int getX() { 
     return x; 
    } 

    public int getY() { 
     return y; 
    } 


    @Override 
    public void draw(Graphics g) { 
     g.setColor(Color.BLACK); 
     g.drawRect(x - 50, y - 50, 100, 100); 
    } 

} 

クラスのサイト:

+0

[あなたの問題を実証した完全な実行可能な例](http://stackoverflow.com/help/mcve)を提供しておけば、もっと面白い問題のように見えます – MadProgrammer

答えて

0

多くのことが判明して以来、切り捨てエラーは手元の問題ではないようです。トラックの出発点と、いつ他の方向に向けるのかを決定するのは間違いでした。トラックが跳ね返っているように見えたのは、実際には、同じ対角線からの反対側のトラックでした。私のTruckmove()メソッドの方向の単純な変更は、そのトリックでした。

public void setDirection(int i) { 

    if (i == 0) { 
     dx = -1; 
     dy = -1; 
    } 

    if (i == 1) { 
     dx = 1; 
     dy = -1; 
    } 

    if (i == 2) { 
     dx = -1; 
     dy = 1; 

    } 

    if (i == 3) { 
     dx = 1; 
     dy = 1; 

    } 

} 
関連する問題