Java проблемы с потоками - PullRequest
       3

Java проблемы с потоками

2 голосов
/ 06 октября 2011

Я пытаюсь создать игровой автомат в Java. В этом игровом автомате я завершил базовое начало проекта. У меня есть аниматоры, которые попадают в случайное пространство (вишня, бланк, семь и т. Д.), Фон, кнопки для старта и ставки в дебюте, однако мне нужно выяснить окончание слота; как сделать так, чтобы результаты игрового автомата отображались без нажатия пользователем кнопки. Я считаю, что для этого лучше всего погрузиться в мир потоков. Однако, когда я попытался создать простую тему, аниматоры перестали работать, а когда я вынул эту тему, аниматоры работали. Это довольно загадка.
Вот часть кода, если это поможет объяснение:

public class SlotMachineOpeningGraphic extends JPanel implements Runnable
{
    JLayeredPane layeredPane= new JLayeredPane ();
JFrame frame = new JFrame();

public Thread thread;
public volatile boolean running = false;

Player plyr = new Player ();

public static final long startTime = System.currentTimeMillis ();

JLabel numberBet = new JLabel ("" + plyr.getBet()); //things that change on JFrame
JLabel numberAccount = new JLabel (""+ plyr.getAccount ());
JButton betButton = new JButton ("Bet ++");
JButton playAgain = new JButton ("Start");

public SlotMachineOpeningGraphic()   
 {
    layeredPane.setPreferredSize(new Dimension(750, 460));//changes size to image with  border for buttons
                                                          //andlabels

    ImageIcon bG = new ImageIcon ("/Users/Documents/slotmachine.png");//background file
    JLabel backGround = new JLabel (bG);
    backGround.setBounds (70,0, bG.getIconWidth(), bG.getIconHeight());//won't display if you do not set bounds
    layeredPane.add (backGround, new Integer (0));//add to first layer

    /*add buttons and labels to give user options
     * and information, placed in layer 2 */

    playAgain.setBounds (110,420, 100, 25);
    layeredPane.add (playAgain, new Integer (2));
    playAgain.addActionListener (new Start());


    betButton.setBounds (320,420, 100, 25);
    layeredPane.add (betButton, new Integer (2));
    betButton.addActionListener (new SlotBB ());


    JButton mainMenu = new JButton ("Main Menu");
    mainMenu.setBounds (520,420, 100, 25);
    layeredPane.add (mainMenu, new Integer (2));
    long checkTime = System.currentTimeMillis ();
    System.out.println ("Total execution time : " + (checkTime - startTime));

    JLabel bet = new JLabel ("Bet:");
    bet.setBounds (620, 320, 100, 30);

    Font font = new Font ("Corsiva Hebrew",bet.getFont().getStyle(),30);  //desired font    & size

    bet.setFont (font);
    layeredPane.add (bet, new Integer (2));


    numberBet.setBounds (620, 340, 100, 30);
    layeredPane.add (numberBet, new Integer (2));
    numberBet.setFont (font);

    JLabel account = new JLabel ("Account: ");
    account.setBounds (5, 320, 150, 30);
    account.setFont (font);
    layeredPane.add (account, new Integer (2));

    numberAccount.setBounds (5, 340, 150, 30);
    numberAccount.setFont (font);
    layeredPane.add (numberAccount, new Integer (2));


     add(layeredPane);

    JComponent newContentPane = layeredPane;

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    newContentPane.setOpaque(true); //content panes must be opaque
    frame.setContentPane(newContentPane);
    frame.setBackground (Color.white);

    //Display the window.
    frame.pack();
    frame.setVisible(true);

}




public void run ()
{
  try {
    Thread.sleep (20);
    System.out.println ("works");
  }
  catch (Exception e) {
    System.out.println ("doesn't work");
  }

}




class Start extends JPanel implements ActionListener
{
  public void actionPerformed (ActionEvent event)
  { 
    SlotAnimator a0 = new SlotAnimator (40);
    a0.setBounds(155, 85, 100, 90); 
    layeredPane.add (a0, new Integer (1));

    SlotAnimator a1 = new SlotAnimator (85);
    a1.setBounds(320, 85, 100, 90); 
    layeredPane.add (a1, new Integer (1));

    SlotAnimator a2 = new SlotAnimator (135);
    a2.setBounds(470, 85, 100, 90); 
    layeredPane.add (a2, new Integer (1));
    playAgain.setText ("play again?");
    hearSound();

    thread = new Thread (new SlotMachineOpeningGraphic ());
    thread.start ();

  }
}



 public static void main (String [] args)
 {
   new SlotMachineOpeningGraphic();
 }
}

Есть предложения по подходу? Буду очень признателен!

Ответы [ 3 ]

3 голосов
/ 06 октября 2011

@ HFOE прав в использовании javax.swing.Timer, который управляет собственным потоком для безопасной генерации периодических событий GUI.Возможно, вы также захотите принять шаблон Model-View-Controller , пример которого здесь .

3 голосов
/ 06 октября 2011

Это как минимум одна из ваших ошибок:

thread = new Thread(new SlotMachineOpeningGraphic());

Вы создаете новый объект SlotMachineOpeningGraphic, который полностью отличается от исходного. Не делай этого. Если вам пришлось использовать здесь объект SlotMachineOpeningGraphic, вам следует использовать ссылку на исходный класс, который уже существует и содержит закрытый внутренний класс Start, такой как:

thread = new Thread(SlotMachineOpeningGraphic.this);

Так что это не проблема "потоков" как таковая, а проблема ссылок - вы используете неправильную ссылку в качестве Runnable для вашего потока.

Но я настоятельно советую вам не использовать ваши классы GUI для ActionListeners, OtherListeners или Runnables, так как вы просите класс делать слишком много. Лучше использовать анонимный внутренний класс или отдельный отдельный класс.

1 голос
/ 06 октября 2011

Вы можете попытаться использовать классы Future или Runnable для выполнения обработки и получения их результатов, как только они завершатся.Обязательно поместите эти потоки в пул потоков!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...