Я пытаюсь создать программу в 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) нет никаких оснований для класс LotteryEvent.java для расширения JFrame, 2) ваш код не подчиняется правилам Swing для потоковой передачи, поскольку вы изменяете состояние компонента Swing из фонового потока, что никогда не должно выполняться. Я даже не знаю, почему у вас есть этот фоновый поток в вашем коде. Можете ли вы объяснить причину своего существования? Возможно, вы хотите вместо этого использовать Swing Timer? –
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
Имей с книгой, которая называется учить себя java в течение 24 часов. Мы не попали в резьбовую часть. Это то, что он рекомендовал в своей книге – devin