AIProject / InterviewScreen.java
Saahil-doryu's picture
Upload 18 files
28b5ddf verified
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class InterviewScreen extends JPanel {
private ClearPassAIGUI controller;
private JTextArea questionArea;
private JTextArea answerInput;
private JTextArea feedbackArea;
private JButton generateBtn, nextBtn, evaluateBtn, submitBtn, readBtn, stopBtn;
private JLabel timerLabel, counterLabel, welcomeLabel;
private Timer timer;
private int timeLeft = 60;
private int answeredCount = 0;
private int totalQuestions;
public InterviewScreen(ClearPassAIGUI controller, int questionCount) {
this.controller = controller;
this.totalQuestions = questionCount;
setLayout(new BorderLayout(10, 10));
String username = controller.getCurrentUser();
welcomeLabel = new JLabel("Welcome, " + username + "!");
welcomeLabel.setFont(new Font("Arial", Font.BOLD, 16));
welcomeLabel.setHorizontalAlignment(SwingConstants.CENTER);
questionArea = createTextArea(false);
answerInput = createTextArea(true);
feedbackArea = createTextArea(false);
disableCopyPaste(answerInput);
generateBtn = new JButton("Generate Question");
evaluateBtn = new JButton("Evaluate Answer");
nextBtn = new JButton("Next Question");
readBtn = new JButton("Read Question");
stopBtn = new JButton("Stop Reading");
submitBtn = new JButton("Submit Interview");
timerLabel = new JLabel("Time Left: 60s");
counterLabel = new JLabel(getCounterText());
JPanel buttonPanel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(5, 10, 5, 10);
gbc.gridx = 0;
buttonPanel.add(generateBtn, gbc);
gbc.gridx = 1;
buttonPanel.add(evaluateBtn, gbc);
gbc.gridx = 2;
buttonPanel.add(nextBtn, gbc);
gbc.gridx = 3;
buttonPanel.add(readBtn, gbc);
gbc.gridx = 4;
buttonPanel.add(stopBtn, gbc);
gbc.gridx = 5;
buttonPanel.add(timerLabel, gbc);
gbc.gridx = 6;
buttonPanel.add(counterLabel, gbc);
JPanel topPanel = new JPanel(new BorderLayout());
topPanel.add(welcomeLabel, BorderLayout.NORTH);
topPanel.add(buttonPanel, BorderLayout.CENTER);
JPanel centerPanel = new JPanel();
centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.Y_AXIS));
centerPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
centerPanel.add(new JLabel("Generated Question:"));
centerPanel.add(new JScrollPane(questionArea));
centerPanel.add(Box.createVerticalStrut(10));
centerPanel.add(new JLabel("Your Answer:"));
centerPanel.add(new JScrollPane(answerInput));
centerPanel.add(Box.createVerticalStrut(10));
centerPanel.add(new JLabel("AI Feedback:"));
centerPanel.add(new JScrollPane(feedbackArea));
// Create bottom panel for submit button
JPanel bottomPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
submitBtn.setPreferredSize(new Dimension(200, 40)); // Make submit button larger
bottomPanel.add(submitBtn);
add(topPanel, BorderLayout.NORTH);
add(centerPanel, BorderLayout.CENTER);
add(bottomPanel, BorderLayout.SOUTH);
addListeners();
}
private JTextArea createTextArea(boolean editable) {
JTextArea ta = new JTextArea(5, 50);
ta.setLineWrap(true);
ta.setWrapStyleWord(true);
ta.setEditable(editable);
return ta;
}
private void disableCopyPaste(JTextArea ta) {
ta.getInputMap().put(KeyStroke.getKeyStroke("ctrl C"), "none");
ta.getInputMap().put(KeyStroke.getKeyStroke("ctrl V"), "none");
ta.getInputMap().put(KeyStroke.getKeyStroke("ctrl X"), "none");
ta.setComponentPopupMenu(null);
ta.setTransferHandler(null);
}
private void addListeners() {
generateBtn.addActionListener(e -> generateQuestion());
evaluateBtn.addActionListener(e -> evaluateAnswer());
nextBtn.addActionListener(e -> generateBtn.doClick());
submitBtn.addActionListener(e -> {
if (answeredCount > 0) {
controller.finishSession();
} else {
JOptionPane.showMessageDialog(this,
"Please answer at least one question before submitting.",
"No Answers",
JOptionPane.WARNING_MESSAGE);
}
});
readBtn.addActionListener(e -> {
String question = questionArea.getText().trim();
if (!question.isEmpty()) {
try {
controller.getTTSClient().speakText(question);
} catch (IOException ex) {
JOptionPane.showMessageDialog(this,
"Error reading question: " + ex.getMessage(),
"Error",
JOptionPane.ERROR_MESSAGE);
}
}
});
stopBtn.addActionListener(e -> {
controller.getTTSClient().stopSpeaking();
});
}
private void generateQuestion() {
String role = controller.getRole();
String username = controller.getCurrentUser();
if (!role.isEmpty()) {
String prompt = "Imagine you are an expert interviewer. The candidate is applying for the job role: \""
+ role + "\". Please create a thoughtful and beginner-friendly interview question.";
try {
questionArea.setText(controller.getGeminiClient().generateResponse(prompt));
answerInput.setText("");
feedbackArea.setText("");
startTimer();
} catch (IOException ex) {
questionArea.setText("Error: " + ex.getMessage());
}
}
}
private void evaluateAnswer() {
String question = questionArea.getText().trim();
String answer = answerInput.getText().trim();
if (!question.isEmpty() && !answer.isEmpty()) {
String evalPrompt = "Evaluate this answer to the question: \"" + question + "\".\n\nAnswer: \"" + answer
+ "\"\n\nGive short, clear feedback.";
try {
String feedback = controller.getGeminiClient().generateResponse(evalPrompt);
feedbackArea.setText(feedback);
recordAnswer(question, answer, feedback);
} catch (IOException ex) {
feedbackArea.setText("Error: " + ex.getMessage());
}
}
}
private void startTimer() {
timeLeft = 60;
if (timer != null)
timer.stop();
timer = new Timer(1000, e -> {
if (timeLeft <= 0) {
timer.stop();
nextBtn.doClick();
} else {
timeLeft--;
timerLabel.setText("Time Left: " + timeLeft + "s");
}
});
timer.start();
}
private void recordAnswer(String question, String answer, String feedback) {
QuestionData qd = new QuestionData();
qd.setQuestion(question);
qd.setAnswer(answer);
qd.setFeedback(feedback);
controller.getDataModel().setHistory(qd);
String filename = controller.getCurrentUser() + "_answers.txt";
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filename, true))) {
writer.write("Q: " + question + "\nA: " + answer + "\nF: " + feedback + "\n\n");
} catch (IOException e) {
e.printStackTrace();
}
answeredCount++;
counterLabel.setText(getCounterText());
if (answeredCount >= totalQuestions) {
controller.finishSession();
}
}
private String getCounterText() {
return "Answered: " + answeredCount + "/" + totalQuestions;
}
}