2017-04-26 51 views
1

我正在尝试制作一个简单的程序,它会询问用户一个问题,然后将他们的答案与存储的正确答案进行比较。问题似乎是,当我点击Ready JButton时程序的主循环没有运行。试图在JButton上启动程序按

我尝试将主方法更改为另一个非默认名称,并在actionPerformed()方法中添加了一个对它的调用,它似乎至少执行了一次循环,但后来导致无法关闭没有任务管理器的小程序一旦我点击了按钮。我不知道这是否意味着它会出现无尽的循环或什么。

我相信除了这个问题之外,还有更多需要解决的代码,但是如果不先清除它,我无法取得任何进展。如果在创建GUI时遇到问题,请告诉我。我试图根据我的工作做得很好,因此我不知道这是否是问题。

提供的任何帮助表示赞赏。

下面是代码:

import java.awt.*; 
import javax.swing.*; 

public class Langarden_App extends JApplet{ 
    private int width = 800, height = 600; 
    private LangardenPanel langPanel; 

    public void init(){ 
     langPanel = new LangardenPanel(); 
     getContentPane().add(langPanel); 
     setSize(width, height); 
    } 
} 

并与逻辑

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
import java.util.Arrays; 
import java.util.concurrent.TimeUnit; 
import java.util.*; 

public class LangardenPanel extends JPanel{ 

    private static JButton submit; 
    private static JButton ready = new JButton("Ready"); 
    private static JLabel instruct; 
    private JTextField input = new JTextField(100); 
    private static String inString; 
    private static ArrayList<String> questions; 
    private static ArrayList<String> answers; 
    private static Random rand = new Random(); 

    public LangardenPanel(){ 
     questions = new ArrayList<String> (Arrays.asList("¿Qué es la palabra para 'inveirno' en ingles?", "¿Qué es la forma de 'yo' del verbo 'venir'?")); 
     answers = new ArrayList<String> (Arrays.asList("winter", "voy")); 
     instruct = new JLabel("Welcome to Langarden! Press Submit to begin. You have one minute and three attempts for each question."); 
     submit = new JButton("Submit"); 
     this.setLayout(new BorderLayout()); 
     add(BorderLayout.SOUTH, ready); 
     add(BorderLayout.NORTH, instruct); 
     add(BorderLayout.CENTER, input); 
     ready.addActionListener(new SubListener()); 
    } 

    public static void main(String[] args){ 
     try{ 
      TimeUnit.SECONDS.sleep(3); 
     } catch (InterruptedException e){ 
     } 
     System.out.println("Setting text"); 
     instruct.setText("Alright! Let's Go!"); 
     try{ 
      TimeUnit.SECONDS.sleep(1); 
     } catch (InterruptedException e){ 
     } 
     do{ 
      System.out.println("Running loop"); 
      int qnum = rand.nextInt(questions.size()); 
      instruct.setText(questions.get(qnum)); 
      for (int i=0; i<3; i++){ 
       try { 
        TimeUnit.SECONDS.sleep(60); 
       } catch (InterruptedException e) { 
       } 
       if(checkAnswer(qnum, inString)){ 
        instruct.setText("Correct!"); 
        break; 
       } else { 
        instruct.setText("Try again...\n" + questions.get(qnum)); 
       } 
      } 
      instruct.setText("The correct answer was " + answers.get(qnum)); 
      try{ 
       TimeUnit.SECONDS.sleep(2); 
      } catch (InterruptedException e){ 
      } 
      questions.remove(qnum); 
      answers.remove(qnum); 
      instruct.setText("Would you like to continue? Enter No and click Submit to exit."); 
     } while (!inString.equalsIgnoreCase("No") && questions.size() != 0); 
     instruct.setText("Congratulations, you have completed this module!"); 
    } 

    private static boolean checkAnswer(int qnum, String inString) { 
     if (answers.get(qnum).equalsIgnoreCase(inString)) 
      return true; 
     return false; 
    } 

    private class SubListener implements ActionListener{ 
     public void actionPerformed(ActionEvent e){ 
      System.out.println("Button Pressed!"); 
      if(e.getSource() == ready){ 
       add(BorderLayout.SOUTH, submit); 
       submit.addActionListener(new SubListener()); 
      } else { 
       inString = input.getText(); 
      } 
     } 
    } 
} 
+0

你有没有得到任何错误? – Teocci

回答

1
  1. 摆脱的主要方法的类。如果这是作为一个小程序运行,那么该程序没有业务拥有主要方法。
  2. 制作全部字段非静态。是全部
  3. 摆脱while-true循环。如果这运行,这将压制你的Swing事件线程,使你的GUI冻结和无助。使用Swing Timer而不是“伪”循环。请查看Swing Timer Tutorial了解更多信息。
  4. 无论何时将组件添加到容器,都应该在同一个容器上调用revalidate()repaint(),以便容器的布局管理器可以布局新组件,以便操作系统可以重绘任何“脏”像素。
  5. 而不是像你所做的那样添加一个新的JButton,更好的方法是使用CardLayout交换组件。该教程可以在这里找到:CardLayout tutorial
+0

好的谢谢你的提示。我会尝试一下并回复你。再次感谢。 –

相关问题