我正在编写一个测验程序,它打开一个包含问题和答案的文本文件。问题和答案被放入数组中,并在单击按钮时放入文本字段中。打开文件启用 Q 按钮。
页面底部的计数器显示文件中的问题总数以及每个问题的计数。
当您单击“Q”按钮时,问题被放置在 Q 文本字段中,Q 按钮被禁用,回答按钮(“A”)被启用,并且“currentQuestion”计数器增加一。当您单击 A 按钮时,答案将显示在答案字段中,A 按钮被禁用,Q 按钮被启用。再次按下 Q 按钮会清除上一个问题的答案文本,启用 A 按钮并禁用自身。它像这样来回移动,直到到达数组列表中的最后一个问题和答案。
在显示最后一个问题和答案后,我需要能够再次按下 Q 按钮并显示文本“That's all Folks!” 在问题文本字段中,同时禁用 Q 和 A 按钮。
我设法使用方法 getEndStatus() (此布尔方法是分配的要求)来检查是否已达到最后一个问题。我可以使用它将文本放置在问题文本字段中。但是,我似乎无法弄清楚如何禁用这两个按钮。我在 Q 按钮单击时尝试了表单源代码中的 if 语句(也尝试使用 A 按钮单击),如果 getEndStatus() 方法返回 true,则禁用该按钮,但它会在产生最终消息的最终单击之前禁用该按钮.
我还需要在上次用于查找文件的同一文件夹中启动对 JFileChooser 的每个后续调用。我不知道该怎么做。
任何帮助深表感谢!提前致谢!
这是类构造函数的源代码:
package business;
import java.io.*;
import java.util.ArrayList;
public class Quiz {
private ArrayList<String> questions, answers;
private int qCount, qNumber;
private String errmsg, actmsg;
public Quiz(String fn){
//fn = file name with full path
this.qCount = 0;
this.qNumber = 0;
this.errmsg = "";
this.actmsg = "";
try{
BufferedReader in = new BufferedReader(
new FileReader(fn));
questions = new ArrayList<String>();
answers = new ArrayList<String>();
String s = in.readLine();
while (s != null){
qCount++;
questions.add(s); //put question in array list
answers.add(in.readLine()); //read and post answer
s = in.readLine(); //next question
}//end while loop
in.close();
}catch (Exception e){
errmsg = "Error opening file: " + e.getMessage();
}//end try catch
if (qCount > 0){
qNumber =1;
actmsg = "Quiz file read. Next number = " + qNumber;
}//end if statement
}//end of constructor
public int getQuizCount(){
return this.qCount;
}//end getQuizCount()
public String getActionResult(){
if (qNumber < qCount){
actmsg = "Quiz file read. Next number = " + qNumber;
}else if(getEndStatus()){
actmsg = "That's all Folks!";
}else{
actmsg = "Quiz file read. Next number = " + qCount;
}
return this.actmsg;
}//end getActionResult()
public String getErrorMsg(){
return this.errmsg;
}//end getErrorMsg()
public String getQuestion(){
if (qNumber == 0){
return "No Questions on File.";
}else if(getEndStatus()){
return "That's All Folks!";
}else{
qNumber++;
return this.questions.get(qNumber-2);
}
}//end getQuestion()
public String getAnswer(){
if(qNumber == 0){
return "No Answers on File.";
}
return this.answers.get(qNumber-2);
}
public int getCurrCount(){
return qNumber-1;
}
public boolean getEndStatus(){
if(qNumber <= qCount){
return false;
}
return true;
}
}//end class()
这是来自表单视图的相关源代码:
private void jmnuOpenActionPerformed(java.awt.event.ActionEvent evt) {
statusMessageLabel.setText("");
JFileChooser f = new JFileChooser(".");
f.setDialogTitle("Select Quiz File");
FileNameExtensionFilter filter =
new FileNameExtensionFilter("Text Files (*.txt)","txt");
f.setFileFilter(filter);
JDialog dg = new JDialog();
int rval = f.showOpenDialog(dg);
if (rval == JFileChooser.CANCEL_OPTION){
jtxtFile.setText("");
statusMessageLabel.setText("Open Canceled.");
}else {
jtxtFile.setText(f.getSelectedFile().getAbsolutePath());
q = new Quiz(f.getSelectedFile().getAbsolutePath());
if (q.getErrorMsg().isEmpty()){
jtxtTotQ.setText(String.valueOf(q.getQuizCount()));
jbtnQ.setEnabled(true);
statusMessageLabel.setText(q.getActionResult());
}else{
statusMessageLabel.setText(q.getErrorMsg());
jtxtTotQ.setText("");
jtxtCurrQ.setText("");
}//end if else
}//end if else
jtxtQ.setText("");
jtxtA.setText("");
}
private void jbtnQActionPerformed(java.awt.event.ActionEvent evt) {
jtxtQ.setText(q.getQuestion());
jtxtCurrQ.setText(String.valueOf(q.getCurrCount()));
statusMessageLabel.setText(q.getActionResult());
jtxtA.setText("");
jbtnQ.setEnabled(false);
if (q.getEndStatus()){
jbtnA.setEnabled(false);
}else{
jbtnA.setEnabled(true);
}
}
private void jbtnAActionPerformed(java.awt.event.ActionEvent evt) {
jtxtA.setText(q.getAnswer());
jbtnA.setEnabled(false);
jbtnQ.setEnabled(true);
}