2015-04-21 3 views
-1

Я хочу сделать Die gui, который меняет лицо матрицы каждый раз, когда отображается другое число. У меня есть класс RollDie, который расширяет класс графического интерфейса Die:Die with threads

public class RollDie2 extends Die implements Runnable { 

public static void main(String[] args) { 

    long sleeptime = 500; 
    int times; 
    Random rd = new Random(); 
    int face; 
    int facebefore; 

    times = rd.nextInt(20)+1; 
    face = rd.nextInt(6) + 1; 

    // Graphics 
    SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
      Die die = new RollDie2(); 

      die.setVisible(true); 
      } 
     }); 



    for (int i=0; i<times; i++) { 
     (new Thread(new RollDie2(face))).start(); 
     try { 
      Thread.sleep(sleeptime); 
     } catch (InterruptedException e) {e.printStackTrace();} 
     sleeptime += 100; 

     facebefore = face; 
     face = rd.nextInt(6) + 1; 

     while (facebefore == face) //so it is different every time 
      face = rd.nextInt(6) + 1; 
    } 
    System.out.println("The die was rolled " + times + " times."); 



} 

int face; 

public RollDie2(int face) { 
    this.face = face; 
    super.changeFace(face); 

} 
public RollDie2() { 

} 
@Override 
public void run() { 

    System.out.println("The face is now showing: " + face); 
} 

} 

и класс GUI:

public class Die extends JFrame { 
int face; 

public Die() { 
    init(); 

} 


private void init() { 
    //final 
    DiePanel surface = new DiePanel(); 
    add(surface); 
    // surface.updateVal(face); 
    addWindowListener(new WindowAdapter() { 
     @Override 
     public void windowClosing(WindowEvent e) { 
      Timer timer = surface.getTimer(); 
      timer.stop(); 
     } 
    }); 

    setTitle("Dice"); 
    setSize(500, 300); 
    //setLocationRelativeTo(null); 
    setLayout(new GridLayout(1,3)); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 

public void changeFace(int value) { 
    face = value; 

} 
public int getFace() { 
    return face; 
} 
} 

Проблема заключается в каждый раз, когда я называю getFace() в классе панели она ничего не возвращает и я не могу обновить значение Die. Я думаю, что это имеет какое-то отношение к потокам, но не знает, что.

+0

Ваш метод запуска просто выплескивает строку и ничего больше. –

+0

У меня есть invokeLater() вверх. Он создает gui. – Nikola

+0

Да, но все, что делает, это создать объект Die и установить видимость. Когда это действительно катит кости, то есть звоните своему генератору случайных чисел? –

ответ

0

Я вижу ваш недостающий набор методов. Также ваш код повсюду. Thread's сложны. Этот код ниже поможет мне запустить сразу несколько потоков. Это может помочь вашей проблеме с потоком.

public class RollDie implements Runnable 
{ 
//variables go here 

public RollDie() 
{ 
    start(); 
} 

public void start() 
{ 
Thread thread = new thread(this); 
thread.start(); 
} 

public void run() 
{ 
//code for RollDie goes here 
} 

} 

Затем просто позвоните своему конструктору RollDie из класса die. Надеюсь, что это поможет.

+0

Вы не должны расширять Thread своим классом (и нет необходимости ни в том, что вы используете его через интерфейс Runnable). В вашем примере код * бесполезный * любой * чрезвычайно запутанный *, потому что вы фактически переопределяете метод Thread.start() на совершенно другую семантику. – Durandal

+0

Хорошо, я получил, это было из учебника, которое я нашел онлайн в любом случае! – Geen

+0

Вы на самом деле * создаете * и * начинаете * _two_ там - тот, который вы создали * расширением * Thread (и вызываете super.start() в своем конструкторе), а другой в переопределении start(), где вы явно " new Thread() ", а затем start(). Только вторая полезная работа. Это может быть артефактом, оставшимся «попыткой многих разных вещей», но, конечно, не хорошим чистым кодом (как если бы вы показали что-то подобное в собеседовании, у вас гарантированно будет отказано). Просто удалите «extends Thread» и вызов super.start(). Он по-прежнему будет работать одинаково. – Durandal