Так что я относительно новичок в java (сам преподавал, поэтому мне бы понравились любые советы/критические замечания, которые вы могли бы дать), и, как практика, я решил создать программу для прокатки кости с помощью swing с помощью Jbuttons as Игральная кость. Чтобы имитировать прокачку кубиков, я хотел случайно изменить текст Jbutton на разные числа за несколько секунд до представления результата.Редактирование проблемы JButton текст неоднократно изнутри ActionPerformed метод
Метод, который я написал для этого, по-видимому, работал до тех пор, пока я не попытался вызвать, если из метода ActionPerformed. Когда я это сделал, программа замерзнет до конца метода, а затем изменит текст кнопок на конечный результат.
Мне было любопытно, может ли кто-нибудь объяснить, почему это происходит, или научить меня правильно делать что-то подобное. Спасибо за любую помощь.
пыльник быстрый пример того же вопроса
package experiments.changingtext;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class ChangingText extends JFrame implements ActionListener{
JButton button = new JButton("Change Me");
public ChangingText(){
this.setSize(200,200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel pane = new JPanel();
button.addActionListener(this);
pane.add(button);
this.add(pane);
this.setVisible(true);
try{Thread.sleep(500);}catch(Exception ex){}
//Works as expected
this.changeButtonText();
}
@Override
public void actionPerformed(ActionEvent e) {
//when run program freezes and presents the final text "change to 5"
if(e.getSource() == button){
button.setText("change to 1");
try{Thread.sleep(500);}catch(Exception ex){}
button.setText("change to 2");
try{Thread.sleep(500);}catch(Exception ex){}
button.setText("change to 3");
try{Thread.sleep(500);}catch(Exception ex){}
button.setText("change to 4");
try{Thread.sleep(500);}catch(Exception ex){}
button.setText("change to 5");
}
}
public void changeButtonText(){
button.setText("change to 1");
try{Thread.sleep(500);}catch(Exception ex){}
button.setText("change to 2");
try{Thread.sleep(500);}catch(Exception ex){}
button.setText("change to 3");
try{Thread.sleep(500);}catch(Exception ex){}
button.setText("change to 4");
try{Thread.sleep(500);}catch(Exception ex){}
button.setText("change to 5");
}
}
Качели использует один поток для управления событиями и живописи, это означает, что мы вы используете Thread.sleep, вы блокирование событий потока диспетчеризации, предотвращая его от живописи в пользовательском интерфейсе. Вместо этого вы можете использовать таймер Swing – MadProgrammer