|
TruthTableQuiz
TruthTable.java
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
class TruthTable extends JScrollPane {
public TruthModel TTModel;
public JTable tTable;
String []Guesses={"","T","F"};
JComboBox guessBox=new JComboBox(Guesses);
public TruthTable() {
initTable("A"); }
public TruthTable(String S) {
initTable(S); }
// difficulty: 0 is easy, 1 is medium, etc.
public void getRandomTable(int seed,int terms,int difficulty) {
Proposition rand=new Proposition();
rand.randomProp(seed,terms,difficulty);
initTable(rand.getProp());
}
public void initTable(String S) {
TTModel=new TruthModel(S);
tTable=new JTable(TTModel) {
public TableCellRenderer getCellRenderer(int row,int column) {
if(column==tTable.getColumnCount()-1) {
return new AnswerRenderer();
}
else {
DefaultTableCellRenderer GRend=
new DefaultTableCellRenderer();
GRend.setBackground(new Color(150,150,250));
return GRend;
}
}
};
tTable.getTableHeader().setReorderingAllowed(false);
tTable.setCellEditor(new DefaultCellEditor(guessBox));
tTable.setSelectionMode(0); // 0==single row selection only.
// stupid JAVA.
this.setViewportView(tTable);
int width=initColumnStyles();
int height=(tTable.getRowCount()+1)*tTable.getRowHeight()+4;
this.setPreferredSize(new Dimension(width,height));
this.validate();
}
public int gradeAnswer() {
return TTModel.gradeAnswer();
}
public void giveAnswer() {
TTModel.giveAnswer();
}
public String getProp() {
return TTModel.getProp();
}
private int initColumnStyles() {
TableColumn column=null;
int totalSize=0;
int i=0;
for (i = 0; i < TTModel.getColumnCount()-1; i++) {
column=tTable.getColumnModel().getColumn(i);
column.setWidth(20);
totalSize+=20;
}
column=tTable.getColumnModel().getColumn(i);
column.setCellEditor(new DefaultCellEditor(guessBox));
column.sizeWidthToFit();
totalSize+=column.getWidth();
return totalSize;
}
class AnswerRenderer extends JLabel implements TableCellRenderer {
public AnswerRenderer() {
super();
}
public void setValue(Object value) {
super.setText((String)value);
}
public Component getTableCellRendererComponent(
JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column) {
DefaultTableCellRenderer GRend=new DefaultTableCellRenderer();
GRend.setText((String) value);
if(TTModel.solve==false)
GRend.setBackground(new Color(200,200,250));
else if(TTModel.isCorrect(row))
GRend.setBackground(new Color(150,250,150));
else GRend.setBackground(new Color(250,150,150));
return GRend;
}
}
}
//---------------------------------------------------------------------
class TruthModel extends AbstractTableModel {
Proposition prop;
boolean solve;
String[] tHead;
String aHead="\u03A3";
Boolean[][] theTable;
Object[][] theGuess;
TruthModel(String S) {
initTable(S);
}
public void initTable(String S) {
solve=false;
prop=new Proposition(S);
tHead=prop.getTruthTableTitle();
theTable=prop.getAllTruthAssignments();
boolean [] theAnswer=prop.getAllTruthValues();
theGuess=new Object[theAnswer.length][2];
for(int i=0;i<theGuess.length;i++) {
theGuess[i][0]=theAnswer[i]==true?"T":"F";
theGuess[i][1]=" ";
}
fireTableStructureChanged();
}
public void giveAnswer() {
for(int i=0;i<getRowCount();i++) { theGuess[i][1]=theGuess[i][0]; }
solve=true;
fireTableStructureChanged();
}
public int gradeAnswer() {
int numCorrect=0;
for(int i=0;i<getRowCount();i++) {
if(theGuess[i][0]==theGuess[i][1]) numCorrect++;
}
solve=true;
fireTableStructureChanged();
return numCorrect;
}
public boolean isCorrect(int i) { return theGuess[i][0]==theGuess[i][1]; }
public String getProp() { return prop.getProp(); }
public int getColumnCount() { return tHead.length+1; }
public int getRowCount() { return theTable.length; }
public String getColumnName(int col) {
if(col<tHead.length) return tHead[col];
else return aHead;
}
public Object getValueAt(int row, int col) {
if(col<tHead.length) {
if( (theTable[row][col]).equals(Boolean.TRUE) )
return "T";
else return "F";
}
else if(col==tHead.length && solve==false)
return theGuess[row][1];
else // col==tHead.length && showAnwer=true);
return theGuess[row][0];
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int row, int col) {
if (col==tHead.length && solve==false) return true;
else return false;
}
public void setValueAt(Object value, int row, int col) {
if(col==tHead.length) { theGuess[row][1]=value; }
}
};
|