2013-11-26 167 views
0

我试图通过在利用随机数的循环内设置JSlider位置来模拟“赛马”上的投注结果。我的问题是,当然,我不能在线程执行时更新图形用户界面,因此我的JSliders似乎没有竞赛,他们从头到尾都在进行着。我试着玩弄代码并将它们分离成不同的方法,但我无法解决单线程摆动问题。有没有办法强制更新或停止线程更新GUI并重新启动过程,直到满足条件?在线程中强制执行GUI更新 - JSlider更新

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JApplet; 
import javax.swing.JOptionPane; 



public class HorseMain extends JApplet { 



/** 
* Initializes the applet MainInterface 
*/ 
@Override 
public void init() { 
      try { 
     for (javax.swing.UIManager.LookAndFeelInfo info :  javax.swing.UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 
    } catch (ClassNotFoundException ex) { 
     java.util.logging.Logger.getLogger(MainInterface.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (InstantiationException ex) { 
     java.util.logging.Logger.getLogger(MainInterface.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (IllegalAccessException ex) { 
     java.util.logging.Logger.getLogger(MainInterface.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
     java.util.logging.Logger.getLogger(MainInterface.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } 
    //</editor-fold> 

    /* Create and display the applet */ 
    try { 
     java.awt.EventQueue.invokeAndWait(new Runnable() { 
      public void run() { 
       initComponents(); 
      } 
     }); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 


@SuppressWarnings("unchecked") 

    private void initComponents() { 


    jPanel1 = new javax.swing.JPanel(); 
    jSlider1 = new javax.swing.JSlider(1,400,1); 
    jSlider2 = new javax.swing.JSlider(1,400,1); 
    jSlider3 = new javax.swing.JSlider(1,400,1); 
    jSlider4 = new javax.swing.JSlider(1,400,1); 
    jSlider5 = new javax.swing.JSlider(1,400,1); 
    jSlider6 = new javax.swing.JSlider(1,400,1); 
    jPanel2 = new javax.swing.JPanel(); 
    jCheckBox1 = new javax.swing.JCheckBox(); 
    jCheckBox2 = new javax.swing.JCheckBox(); 
    jCheckBox3 = new javax.swing.JCheckBox(); 
    jComboBox1 = new javax.swing.JComboBox(); 
    jTextField1 = new javax.swing.JTextField(); 
    jLabel2 = new javax.swing.JLabel(); 
    jPanel3 = new javax.swing.JPanel(); 
    jPanel4 = new javax.swing.JPanel(); 
    jTextField2 = new javax.swing.JTextField(); 
    jButton1 = new javax.swing.JButton(); 
    jTextField3 = new javax.swing.JTextField(); 
    jLabel1 = new javax.swing.JLabel(); 



    javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); 
    jPanel1.setLayout(jPanel1Layout); 
    jPanel1Layout.setHorizontalGroup(
     jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addComponent(jSlider1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
     .addComponent(jSlider2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
     .addComponent(jSlider3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
     .addComponent(jSlider4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
     .addComponent(jSlider5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
     .addComponent(jSlider6, javax.swing.GroupLayout.Alignment.TRAILING,javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
    ); 
    jPanel1Layout.setVerticalGroup(
     jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(jPanel1Layout.createSequentialGroup() 
      .addContainerGap() 
      .addComponent(jSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addComponent(jSlider2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addComponent(jSlider3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addComponent(jSlider4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addComponent(jSlider5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
      .addComponent(jSlider6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
    ); 

    jCheckBox1.setText("Win"); 

    jCheckBox2.setText("Place"); 

    jCheckBox3.setText("Show"); 

    jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Horse 1", "Horse 2", 
    "Horse 3", "Horse 4", "Horse 5", "Horse 6"})); 

    jTextField1.setText("1"); 

    jLabel2.setText("Bet Amount:"); 

    javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); 
    jPanel2.setLayout(jPanel2Layout); 
    jPanel2Layout.setHorizontalGroup(
     jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(jPanel2Layout.createSequentialGroup() 
      .addContainerGap() 
      .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addComponent(jComboBox1, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
       .addGroup(jPanel2Layout.createSequentialGroup() 
        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
         .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) 
          .addComponent(jCheckBox3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
          .addComponent(jCheckBox2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
          .addComponent(jCheckBox1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
         .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) 
          .addComponent(jLabel2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
          .addComponent(jTextField1, javax.swing.GroupLayout.Alignment.LEADING))) 
        .addGap(0, 0, Short.MAX_VALUE))) 
      .addContainerGap()) 
    ); 
    jPanel2Layout.setVerticalGroup(
     jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(jPanel2Layout.createSequentialGroup() 
      .addContainerGap() 
      .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addGap(10, 10, 10) 
      .addComponent(jCheckBox1) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) 
      .addComponent(jCheckBox2) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addComponent(jCheckBox3) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) 
      .addComponent(jLabel2) 
      .addGap(5, 5, 5) 
      .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
    ); 

    javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); 
    jPanel3.setLayout(jPanel3Layout); 
    jPanel3Layout.setHorizontalGroup(
     jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 127, Short.MAX_VALUE) 
    ); 
    jPanel3Layout.setVerticalGroup(
     jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 65, Short.MAX_VALUE) 
    ); 

    jTextField2.setText("Winnings"); 

    jButton1.setText("RACE!"); 
    jButton1.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      jButton1ActionPerformed(evt); 
     } 
    }); 

    jTextField3.setText("500"); 

    jLabel1.setText("Bank:"); 

    javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4); 
    jPanel4.setLayout(jPanel4Layout); 
    jPanel4Layout.setHorizontalGroup(
     jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(jPanel4Layout.createSequentialGroup() 
      .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addGroup(jPanel4Layout.createSequentialGroup() 
        .addContainerGap() 
        .addComponent(jTextField3)) 
       .addGroup(jPanel4Layout.createSequentialGroup() 
        .addGap(22, 22, 22) 
        .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
        .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, 109, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addGap(0, 47, Short.MAX_VALUE))) 
      .addGap(160, 160, 160) 
      .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 115, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addGap(23, 23, 23)) 
    ); 
    jPanel4Layout.setVerticalGroup(
     jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel4Layout.createSequentialGroup() 
      .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) 
       .addGroup(jPanel4Layout.createSequentialGroup() 
        .addGap(37, 37, 37) 
        .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
         .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
         .addComponent(jLabel1)) 
        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 14, Short.MAX_VALUE) 
        .addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
       .addGroup(jPanel4Layout.createSequentialGroup() 
        .addContainerGap() 
        .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) 
      .addContainerGap()) 
    ); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addContainerGap() 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) 
       .addGroup(layout.createSequentialGroup() 
        .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
        .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
       .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addContainerGap() 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) 
       .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
       .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
      .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
    ); 

} 
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           


    if (evt.getSource() == jButton1) 
    { 
     while (END!=1) 
     { 
      END=race(); 
      timer(); 
     }    

    } 




} 
public void timer() 
    { 
     for(int i=0; i<6; i++) 
     {    
     try { 
      Thread.sleep(250L); 
    } catch (InterruptedException e) { 
      e.printStackTrace(); 
      } 


     }     
      } 
public int race() 
{ int end=0; 
    boolean racing=true;  

    stride1 = horse1.trot(); 
    pos1+= stride1; 
    jSlider1.setValue(pos1); 
    stride2 = horse2.trot(); 
    pos2+= stride2; 
    jSlider2.setValue(pos2); 
    stride3 = horse3.trot(); 
    pos3+= stride3; 
    jSlider3.setValue(pos3); 
    stride4 = horse1.trot(); 
    pos4+= stride4; 
    jSlider4.setValue(pos4); 
    stride5 = horse5.trot(); 
    pos5+=stride5; 
    jSlider5.setValue(pos5); 
    stride6 = horse6.trot(); 
    pos6+=stride5; 
    jSlider6.setValue(pos6); 
    System.out.println(stride1); 
    System.out.println(stride2); 
    System.out.println(stride3); 
    System.out.println(stride4); 
    System.out.println(stride5); 
    System.out.println(stride6); 
    System.out.println(pos1); 
    System.out.println(pos2); 
    if (pos1>=400 || pos2>=400 || pos3>=400 || pos4>=400 || pos5>=400 || pos6>=400) 
    end = 1;  

    return end; 
} 
private javax.swing.JButton jButton1; 
private javax.swing.JCheckBox jCheckBox1; 
private javax.swing.JCheckBox jCheckBox2; 
private javax.swing.JCheckBox jCheckBox3; 
private javax.swing.JComboBox jComboBox1; 
private javax.swing.JLabel jLabel1; 
private javax.swing.JLabel jLabel2; 
private javax.swing.JPanel jPanel1; 
private javax.swing.JPanel jPanel2; 
private javax.swing.JPanel jPanel3; 
private javax.swing.JPanel jPanel4; 
private javax.swing.JSlider jSlider1; 
private javax.swing.JSlider jSlider2; 
private javax.swing.JSlider jSlider3; 
private javax.swing.JSlider jSlider4; 
private javax.swing.JSlider jSlider5; 
private javax.swing.JSlider jSlider6; 
private javax.swing.JTextField jTextField1; 
private javax.swing.JTextField jTextField2; 
private javax.swing.JTextField jTextField3; 
    int stride1=0; 
    int stride2=0; 
    int stride3=0; 
    int stride4=0; 
    int stride5=0; 
    int stride6=0; 
    int pos1=0; 
    int pos2=0; 
    int pos3=0; 
    int pos4=0; 
    int pos5=0; 
    int pos6=0;    
    Horse horse1 = new Horse(); 
    Horse horse2 = new Horse(); 
    Horse horse3 = new Horse(); 
    Horse horse4 = new Horse(); 
    Horse horse5 = new Horse(); 
    Horse horse6 = new Horse(); 
    private int END=0; 

回答

2

这里是你的问题:

public void timer() { 
    for(int i=0; i<6; i++) { 
     try { 
      Thread.sleep(250L); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

该代码执行,并在此呼叫阻塞的Event Dispatching Thread(又名EDT):Thread.sleep(250L)。 EDT是Swing组件创建和更新发生的单一且特殊的线程。如果您在EDT中运行繁重的任务,那么您的GUI将冻结,Swing组件将无法工作(甚至无法显示)。

看一看Concurrency in Swing路径以了解Swing中的并发性。

您可以使用Swing Timer定期更新固定的时间。比如这样的事情:

final JSlider horse1 = new JSlider(0, 100, 0); 
final JSlider horse2 = new JSlider(0, 100, 0); 
final JSlider horse3 = new JSlider(0, 100, 0); 

Timer timer = new Timer(100, new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     Random random = new Random(); 

     int horse1Value = horse1.getValue(); 
     horse1Value += random.nextInt(101 - horse1Value); 
     horse1.setValue(horse1Value); 

     int horse2Value = horse2.getValue(); 
     horse2Value += random.nextInt(101 - horse2Value); 
     horse2.setValue(horse2Value); 

     int horse3Value = horse3.getValue(); 
     horse3Value += random.nextInt(101 - horse3Value); 
     horse3.setValue(horse3Value); 

     if(horse1Value == 100 && horse2Value == 100 && horse3Value == 100) { 
      System.out.println("Race finished!"); 
      Timer timer = (Timer)e.getSource(); 
      timer.stop(); 
     } 
    } 
}); 
timer.setRepeats(true); 
timer.start(); 
0

把所有的赛马比赛计算放到一个自己的线程中。你可以在那里做任何事情,包括Thread.sleep()

要移动滑块请致电SwingUtilities.invokeLater()。这种方式单线旋转和你的马并排运行。