GUI线程move()方法行为不端

时间:2017-01-24 18:05:56

标签: java swing

修改 :似乎在我的move()方法中,java必须跳过2个if语句中的一个

保持简单。我试图在java中创建一个用于模拟以下class Truck行为的GUI:蓝色方块应该运行他们的diagonales,他们这样做。但是当它们到达广场的边缘点时应该反弹,它们就会飞走。我已经设定了防止这种情况的条件,但它从未通过。我会上传GUI和Drawable,但我认为不需要它们。

enter image description here

Class Truck:

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);
    }

}

班级网站:

package construction_site;

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

public class Site implements Drawable {

    private int x, y, w, h;
    private Panel panel;

    public Site(int x, int y, int w, int h, Panel panel) {
        this.x = x;
        this.y = y;
        this.w = w;
        this.h = h;
        this.panel = panel;
    }

    public boolean contains(int x2, int y2) {
        return (x == x2 && y == 2);
    }

    public boolean truckOnSite(int x2, int y2) {
        return ( x2 == x + w / 2 && y2 == y + h / 2);
    }

    public boolean vanOnSite(int x2, int y2) {
        return ( (x2 == x && y2 == y + h / 2) || (x2 == x + w && y2 == y + h / 2) );
    }

    public void loadVan(Van v) {
        v.setCapacity(5000);
    }

    public void loadTruck(Truck t) {
        t.setCapacity(10000);
        t.setFull(true);
    }


    @Override
    public void draw(Graphics g) {
        g.setColor(Color.GRAY);
        g.fillRect(x, y, w, h);
    }


}

1 个答案:

答案 0 :(得分:0)

事后证明,截止错误似乎不是手头的问题。设置卡车的起点和确定何时应该转向其他方向的条件是错误的。看起来像卡车弹跳的东西,实际上是从同一对角线穿过的对手卡车。我的Truck move()方法的方向发生了简单的变化。

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;

    }

}