2015-04-14 3 views
2

Я пытаюсь создать программу в java, которая в основном делает фальшивую лотерею. Это позволяет вам либо быстро выбрать 5 случайных чисел, либо позволить вам выбрать свой собственный. Быстрый выбор и личные кнопки работают правильно. Как только вы нажимаете быстрый выбор, он отображает 5 случайных чисел в 5 случайных ячейках. Теперь проблема заключается в том, что при нажатии кнопки воспроизведения выигрышные номера не отображаются, и программа не отслеживает, сколько лет потребуется, и сколько рисунков и не отображается, если я получил 3 из 6 номеров и так далее на. Имейте в виду, что программа работает без единой ошибки.У меня нет ошибок, но цифры не добавляются в JTextField

Вот мой код для первого класса, который делает графический интерфейс:

public class LotteryInterface extends JFrame { 

LotteryEvent hello = new LotteryEvent(this); 

//set up row 1 
JPanel row1 = new JPanel(); 
ButtonGroup option = new ButtonGroup(); 
JCheckBox quickpick = new JCheckBox("Quick Pick", false); 
JCheckBox personal = new JCheckBox("Personal", true); 
//set up row 2 
JPanel row2 = new JPanel(); 
JLabel numbersLabel = new JLabel("Your Picks", JLabel.RIGHT); 
JTextField[] numbers = new JTextField[6]; 
JLabel winnersLabel = new JLabel("Winners", JLabel.RIGHT); 
JTextField[] winners = new JTextField[6]; 
//set up row 3 
JPanel row3 = new JPanel(); 
JButton play = new JButton("Play"); 
JButton stop = new JButton("Stop"); 
JButton reset = new JButton("Reset"); 
//set up row 4 
JPanel row4 = new JPanel(); 
JLabel got3label = new JLabel("3 of 6", JLabel.RIGHT); 
JTextField got3 = new JTextField("0"); 
JLabel got4Label = new JLabel("4 of 6", JLabel.RIGHT); 
JTextField got4 = new JTextField("0"); 
JLabel got5label = new JLabel("5 of 6", JLabel.RIGHT); 
JTextField got5 = new JTextField("0"); 
JLabel got6label = new JLabel("6 of 6", JLabel.RIGHT); 
JTextField got6 = new JTextField("0", 10); 
JLabel drawingsLabel = new JLabel("Drawings", JLabel.RIGHT); 
JTextField drawings = new JTextField(); 
JLabel yearsLabel = new JLabel("Years", JLabel.RIGHT); 
JTextField years = new JTextField(); 

public LotteryInterface() { 
    super("Lottery Interface"); 
    setLookAndFeel(); 
    setSize(550, 400); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    GridLayout layout = new GridLayout(0, 1, 10, 10); 
    setLayout(layout); 

    personal.addItemListener(hello); 
    quickpick.addItemListener(hello); 
    play.addActionListener(hello); 
    stop.addActionListener(hello); 
    reset.addActionListener(hello); 

    FlowLayout layout1 = new FlowLayout(FlowLayout.CENTER, 10, 10); 
    option.add(quickpick); 
    option.add(personal); 
    row1.setLayout(layout1); 
    row1.add(quickpick); 
    row1.add(personal); 
    add(row1); 

    GridLayout layout2 = new GridLayout(2, 7, 10, 10); 
    row2.setLayout(layout2); 
    row2.add(numbersLabel); 
    for (int i = 0; i < 6; i++) { 
     numbers[i] = new JTextField(); 
     row2.add(numbers[i]); 
    } 
    row2.add(winnersLabel); 
    for (int i = 0; i < 6; i++) { 
     winners[i] = new JTextField(); 
     winners[i].setEditable(false); 
     row2.add(winners[i]); 
    } 
    add(row2); 

    FlowLayout layout3 = new FlowLayout(FlowLayout.CENTER, 10, 10); 
    row3.setLayout(layout3); 
    row3.add(stop); 
    row3.add(play); 
    row3.add(reset); 
    add(row3); 

    GridLayout layout4 = new GridLayout(2, 3, 20, 10); 
    row4.setLayout(layout4); 
    row4.add(got3label); 
    got3.setEditable(false); 
    row4.add(got3); 
    row4.add(got4Label); 
    got4.setEditable(false); 
    row4.add(got4); 
    row4.add(got5label); 
    got5.setEditable(false); 
    row4.add(got5); 
    row4.add(got6label); 
    got6.setEditable(false); 
    row4.add(got6); 
    row4.add(drawingsLabel); 
    drawings.setEditable(false); 
    row4.add(drawings); 
    row4.add(yearsLabel); 
    years.setEditable(false); 
    row4.add(years); 
    add(row4); 


    setVisible(true); 

} 

private void setLookAndFeel() { 


} 

public static void main(String args[]) { 


    LotteryInterface yeah = new LotteryInterface(); 

    } 

} 

и вот второй класс, который делает графический интерфейс делают вещи:

public class LotteryEvent extends JFrame implements ActionListener, ItemListener, Runnable { 

LotteryInterface gui; 
Thread playing; 


public LotteryEvent(LotteryInterface in) { 
    gui = in ; 
} 

@Override 
public void actionPerformed(ActionEvent event) { 
    String command = event.getActionCommand(); 
    if (command.equals("Play")) { 
     startPlaying(); 
    } 
    if (command.equals("Stop")) { 
     stopPlaying(); 
    } 
    if (command.equals("Reset")) { 
     clearAllFields(); 
    } 

} 

void startPlaying() { 
    playing = new Thread(this); 
    playing.start(); 
    gui.play.setEnabled(false); 
    gui.stop.setEnabled(true); 
    gui.reset.setEnabled(false); 
    gui.quickpick.setSelected(false); 
    gui.personal.setEnabled(false); 

} 

void stopPlaying() { 
    gui.play.setEnabled(true); 
    gui.stop.setEnabled(false); 
    gui.reset.setEnabled(true); 
    gui.quickpick.setSelected(true); 
    gui.personal.setEnabled(true); 
    playing = null; 

} 

void clearAllFields() { 
    for (int i = 0; i < 6; i++) { 
     gui.winners[i].setText(null); 
     gui.numbers[i].setText(null); 
    } 

    gui.got3.setText("0"); 
    gui.got4.setText("0"); 
    gui.got4.setText("0"); 
    gui.got5.setText("0"); 
    gui.got6.setText("0"); 

    gui.years = null; 
    gui.drawings = null; 


} 

@Override 
public void itemStateChanged(ItemEvent event) { 
    Object item = event.getItem(); 
    if (item == gui.quickpick) { 
     for (int i = 0; i < 6; i++) { 
      int pick; 
      do { 
       pick = (int) Math.floor(Math.random() * 50 + 1); 

      } while (numberGone(pick, gui.numbers, i)); 
      gui.numbers[i].setText("" + pick); 
     } 
    } else { 

     for (int i = 0; i < 6; i++) { 
      gui.numbers[i].setText(null); 
     } 
    } 

} 

void addOneToField(JTextField field) { 
    int num = Integer.parseInt("0" + field.getText()); 
    num++; 
    field.setText("" + num); 
} 

boolean numberGone(int nums, JTextField[] pastNums, int count) { 
    for (int i = 0; i < count; i++) { 
     if (Integer.parseInt(pastNums[i].getText()) == nums) { 
      return true; 
     } 
    } 
    return false; 
} 

boolean matchedOne(JTextField win, JTextField[] allpicks) { 
    for (int i = 0; i < 6; i++) { 
     String winText = win.getText(); 
     if (winText.equals(allpicks[i].getText())) { 
      return true; 
     } 
    } 
    return false; 
} 

@Override 
public void run() { 
    Thread thisThread = new Thread(); 
    while (playing == thisThread) { 
     addOneToField(gui.drawings); 
     int draw = Integer.parseInt(gui.drawings.getText()); 
     float numYears = (float) draw/104; 
     gui.years.setText("" + numYears); 

     int matches = 0; 
     for (int i = 6; i < 6; i++) { 
      int ball; 
      do { 
       ball = (int) Math.floor(Math.random() * 50 + 1); 
      } while (numberGone(ball, gui.winners, i)); 
      gui.winners[i].setText("" + ball); 
      if (matchedOne(gui.winners[i], gui.numbers)) { 
       matches++; 
      } 

     } 
     switch (matches) { 
      case 3: 
       addOneToField(gui.got3); 
       break; 
      case 4: 
       addOneToField(gui.got4); 
       break; 
      case 5: 
       addOneToField(gui.got5); 
       break; 
      case 6: 
       addOneToField(gui.got6); 
       gui.stop.setEnabled(false); 
       gui.play.setEnabled(true); 
       playing = null; 
     } 
     try { 
      Thread.sleep(100); 
     } catch (InterruptedException e) { 

     } 

    } 

    } 

} 
+1

Я не знаю, почему ваш код плохо себя, но я знаю, что 1) нет никаких оснований для класс LotteryEvent.java для расширения JFrame, 2) ваш код не подчиняется правилам Swing для потоковой передачи, поскольку вы изменяете состояние компонента Swing из фонового потока, что никогда не должно выполняться. Я даже не знаю, почему у вас есть этот фоновый поток в вашем коде. Можете ли вы объяснить причину своего существования? Возможно, вы хотите вместо этого использовать Swing Timer? –

+1

Swing не является потокобезопасным, лучшим решением может быть использование SwingWorker или события Swing 'Timer'. См. [Параллелизм в Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/), [Рабочие потоки и SwingWorker] (http://docs.oracle.com/javase/tutorial/uiswing/ concurrency/worker.html) и [Как использовать таймеры Swing] (http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html) для получения более подробной информации. – MadProgrammer

+0

Имей с книгой, которая называется учить себя java в течение 24 часов. Мы не попали в резьбовую часть. Это то, что он рекомендовал в своей книге – devin

ответ

1

Okay, проблема довольно просто, решение не так много ...

Когда вы звоните startPlaying вы ...

playing = new Thread(this); 

Но когда run называется, то вы это сделать ...

Thread thisThread = new Thread(); 
while (playing == thisThread) { 

Проблема заключается в том, thisThread и playing никогда не равны.

Лучшим решением может быть использование AtomicBoolean в качестве государственного флага работает и убедитесь, что вместо того, чтобы ... однако ...

свинг не поточно, и вы пытаетесь обновить пользовательский интерфейс из вне контекста Диспетчерской нити события

Лучшим решением было бы использовать Swing Timer, это позволит вам настроить повторный вызов с регулярной задержкой, которая будет уведомляться в контексте потока диспетчеризации событий.

Другим преимуществом является то, Swing Timer имеет stop метод его собственной ...

См Concurrency in Swing и How to use Swing Timers для более подробной информации.

Как уже отмечалось, нет необходимости в LotteryEvent простирается от JFrame, на самом деле, я бы утверждать, что он не должен даже реализовать ActionListener или ItemListener, но это мне

Изменено с пример

Кроме того, этот for (int i = 6; i < 6; i++) { является неправильным ...

import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 
import javax.swing.ButtonGroup; 
import javax.swing.JButton; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class LotteryInterface extends JPanel { 

    LotteryEvent hello = new LotteryEvent(this); 

    //set up row 1 
    JPanel row1 = new JPanel(); 
    ButtonGroup option = new ButtonGroup(); 
    JCheckBox quickpick = new JCheckBox("Quick Pick", false); 
    JCheckBox personal = new JCheckBox("Personal", true); 
    //set up row 2 
    JPanel row2 = new JPanel(); 
    JLabel numbersLabel = new JLabel("Your Picks", JLabel.RIGHT); 
    JTextField[] numbers = new JTextField[6]; 
    JLabel winnersLabel = new JLabel("Winners", JLabel.RIGHT); 
    JTextField[] winners = new JTextField[6]; 
    //set up row 3 
    JPanel row3 = new JPanel(); 
    JButton play = new JButton("Play"); 
    JButton stop = new JButton("Stop"); 
    JButton reset = new JButton("Reset"); 
    //set up row 4 
    JPanel row4 = new JPanel(); 
    JLabel got3label = new JLabel("3 of 6", JLabel.RIGHT); 
    JTextField got3 = new JTextField("0"); 
    JLabel got4Label = new JLabel("4 of 6", JLabel.RIGHT); 
    JTextField got4 = new JTextField("0"); 
    JLabel got5label = new JLabel("5 of 6", JLabel.RIGHT); 
    JTextField got5 = new JTextField("0"); 
    JLabel got6label = new JLabel("6 of 6", JLabel.RIGHT); 
    JTextField got6 = new JTextField("0", 10); 
    JLabel drawingsLabel = new JLabel("Drawings", JLabel.RIGHT); 
    JTextField drawings = new JTextField(); 
    JLabel yearsLabel = new JLabel("Years", JLabel.RIGHT); 
    JTextField years = new JTextField(); 

    public LotteryInterface() { 
     GridLayout layout = new GridLayout(0, 1, 10, 10); 
     setLayout(layout); 

     ItemListener itemListener = new ItemListener() { 

      @Override 
      public void itemStateChanged(ItemEvent e) { 
       Object item = e.getItem(); 
       if (item == quickpick) { 
        for (int i = 0; i < 6; i++) { 
         int pick; 
         do { 
          pick = (int) Math.floor(Math.random() * 50 + 1); 

         } while (numberGone(pick, numbers, i)); 
         numbers[i].setText("" + pick); 
        } 
       } else { 

        for (int i = 0; i < 6; i++) { 
         numbers[i].setText(null); 
        } 
       } 

      } 
     }; 

     personal.addItemListener(itemListener); 
     quickpick.addItemListener(itemListener); 
     play.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       hello.start(); 
      } 
     }); 
     stop.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       hello.stop(); 
      } 
     }); 
     reset.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       hello.stop(); 
       clearAllFields(); 
      } 
     }); 

     FlowLayout layout1 = new FlowLayout(FlowLayout.CENTER, 10, 10); 
     option.add(quickpick); 
     option.add(personal); 
     row1.setLayout(layout1); 
     row1.add(quickpick); 
     row1.add(personal); 
     add(row1); 

     GridLayout layout2 = new GridLayout(2, 7, 10, 10); 
     row2.setLayout(layout2); 
     row2.add(numbersLabel); 
     for (int i = 0; i < 6; i++) { 
      numbers[i] = new JTextField(); 
      row2.add(numbers[i]); 
     } 
     row2.add(winnersLabel); 
     for (int i = 0; i < 6; i++) { 
      winners[i] = new JTextField(); 
      winners[i].setEditable(false); 
      row2.add(winners[i]); 
     } 
     add(row2); 

     FlowLayout layout3 = new FlowLayout(FlowLayout.CENTER, 10, 10); 
     row3.setLayout(layout3); 
     row3.add(stop); 
     row3.add(play); 
     row3.add(reset); 
     add(row3); 

     GridLayout layout4 = new GridLayout(2, 3, 20, 10); 
     row4.setLayout(layout4); 
     row4.add(got3label); 
     got3.setEditable(false); 
     row4.add(got3); 
     row4.add(got4Label); 
     got4.setEditable(false); 
     row4.add(got4); 
     row4.add(got5label); 
     got5.setEditable(false); 
     row4.add(got5); 
     row4.add(got6label); 
     got6.setEditable(false); 
     row4.add(got6); 
     row4.add(drawingsLabel); 
     drawings.setEditable(false); 
     row4.add(drawings); 
     row4.add(yearsLabel); 
     years.setEditable(false); 
     row4.add(years); 
     add(row4); 

    } 

    void clearAllFields() { 
     for (int i = 0; i < 6; i++) { 
      winners[i].setText(null); 
      numbers[i].setText(null); 
     } 

     got3.setText("0"); 
     got4.setText("0"); 
     got4.setText("0"); 
     got5.setText("0"); 
     got6.setText("0"); 

     years = null; 
     drawings = null; 

    } 

    boolean numberGone(int nums, JTextField[] pastNums, int count) { 
     for (int i = 0; i < count; i++) { 
      if (Integer.parseInt(pastNums[i].getText()) == nums) { 
       return true; 
      } 
     } 
     return false; 
    } 

    public static void main(String args[]) { 

     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new LotteryInterface()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class LotteryEvent { 

     LotteryInterface gui; 
     private Timer timer; 

     public LotteryEvent(LotteryInterface in) { 
      gui = in; 
      timer = new Timer(100, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        addOneToField(gui.drawings); 
        int draw = Integer.parseInt(gui.drawings.getText()); 
        float numYears = (float) draw/104; 
        gui.years.setText("" + numYears); 

        int matches = 0; 
        for (int i = 0; i < 6; i++) { 
         int ball; 
         do { 
          ball = (int) Math.floor(Math.random() * 50 + 1); 
         } while (numberGone(ball, gui.winners, i)); 
         gui.winners[i].setText("" + ball); 
         if (matchedOne(gui.winners[i], gui.numbers)) { 
          matches++; 
         } 

        } 
        switch (matches) { 
         case 3: 
          addOneToField(gui.got3); 
          break; 
         case 4: 
          addOneToField(gui.got4); 
          break; 
         case 5: 
          addOneToField(gui.got5); 
          break; 
         case 6: 
          addOneToField(gui.got6); 
          gui.stop.setEnabled(false); 
          gui.play.setEnabled(true); 
          stop(); 
        } 
       } 
      }); 
     } 

     public void stop() { 
      timer.stop(); 
     } 

     public void start() { 
      timer.start(); 
     } 

     void addOneToField(JTextField field) { 
      int num = Integer.parseInt("0" + field.getText()); 
      num++; 
      field.setText("" + num); 
     } 

     boolean matchedOne(JTextField win, JTextField[] allpicks) { 
      for (int i = 0; i < 6; i++) { 
       String winText = win.getText(); 
       if (winText.equals(allpicks[i].getText())) { 
        return true; 
       } 
      } 
      return false; 
     } 

    } 

} 
0

найденную неполадку

Thread thisThread = new Thread(); 

необходимо изменить, чтобы

Thread thisThread = thread.currentThread(); 
+0

Так почему же это все плохо? – devin

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