У меня есть панель под названием «Панель тем», в которой, по сути, есть несколько кнопок с темами, которые можно выбрать. Нажатие одной из этих кнопок приводит к переходу на другую панель ModePanel, на которой есть две кнопки: «Практика» и «Тест». При нажатии каждой из этих кнопок откроются соответствующие панели, и, наконец, начнется тест.
Дело в том, что я хочу, чтобы все вопросы и варианты были импортированы из файла .txt< /код> файл. Это работало бы нормально, если бы я использовал только один .txt, но я создал .txt для каждого из предметов, которые игрок может выбирать, и в зависимости от того, какая кнопка нажата в ObjectsPanel, я хочу, чтобы вопросы импортировались из соответствующего файла .txt .
Я постарался максимально сжать код, поэтому Я сделал версию викторины, которая делает на самом деле не делает того, что должен (на самом деле он мало работает и выглядит довольно плохо), но дело не в этом. Это чтобы увидеть, где может быть проблема.
Итак:
Код: Выделить всё
public class App {
public static void main(String[] args) throws Exception {
SwingUtilities.invokeLater(() -> new MainFrame());
}
}
Код: Выделить всё
import javax.swing.*;
import java.awt.*;
class MainFrame extends JFrame {
private CardLayout cardLayout;
private JPanel mainPanel;
private SharedData sharedData;
public MainFrame() {
setTitle("QUIZ");
setSize(1000, 750); // frame dimension
setLocationRelativeTo(null);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
sharedData = new SharedData();
// CardLayout for switching panels
cardLayout = new CardLayout();
mainPanel = new JPanel(cardLayout);
mainPanel.add(new SubjectsPanel(this, sharedData), "SubjectsPanel");
mainPanel.add(new ModePanel(this, sharedData), "ModePanel");
mainPanel.add(new PracticePanel(this, sharedData), "PracticePanel");
add(mainPanel);
cardLayout.show(mainPanel, "SubjectsPanel");
}
public void switchToPanel(String panelName) {
cardLayout.show(mainPanel, panelName);
}
}
Код: Выделить всё
public class SharedData {
public String subject;
public String getSubjectChosen() {
return this.subject;
}
public void setSubjectChosen(String subject) {
this.subject = subject;
}
}
Код: Выделить всё
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
class SubjectsPanel extends JPanel {
JButton b1, b2;
public SubjectsPanel(MainFrame frame, SharedData sharedData) {
setLayout(new GridLayout(3, 2));
JButton b1 = new JButton("Anatomy");
JButton b2 = new JButton("Cellular Buiology");
b1.setFont(new Font("Arial", Font.BOLD, 40));
b2.setFont(new Font("Arial", Font.BOLD, 40));
add(b1);
add(b2);
b1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sharedData.setSubjectChosen("C:\\Users\\Utilizator\\Documents\\anatomy.txt");
System.out.println("1st bug print: " + sharedData.getSubjectChosen()); // it displays the file path
frame.switchToPanel("ModePanel");
}
});
b2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sharedData.setSubjectChosen("C:\\Users\\Utilizator\\Documents\\biocell.txt");
frame.switchToPanel("ModePanel");
}
});
}
}
Код: Выделить всё
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
class ModePanel extends JPanel {
public ModePanel(MainFrame frame, SharedData sharedData) {
setLayout(new GridLayout(0, 2));
JButton practiceButton = new JButton("Practice");
JButton testButton = new JButton("Test");
practiceButton.setFont(new Font("Arial", Font.BOLD, 40));
testButton.setFont(new Font("Arial", Font.BOLD, 40));
add(practiceButton);
add(testButton);
practiceButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("2nd bug print: " + sharedData.getSubjectChosen()); // !!!!!it displays the file path
frame.switchToPanel("PracticePanel");
}
});
}
}
Код: Выделить всё
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
public class PracticePanel extends JPanel {
JLabel question;
JCheckBox c[] = new JCheckBox[4];
JButton b1, b2;
int q_curent = 0, n = 3;
QnA q;
PracticePanel(MainFrame frame, SharedData sharedData) {
String subjectPath = sharedData.getSubjectChosen(); // should get the chosen subject
System.out.println(subjectPath); // displays null
this.q = new QnA(subjectPath); // passing the chosen subject to QnA
setLayout(new GridLayout(7, 0));
question = new JLabel();
question.setFont(new Font("Arial", Font.BOLD, 20));
add(question);
for (int i = 0; i < 3; i++) {
c[i] = new JCheckBox();
add(c[i]);
}
b1 = new JButton("Next");
b2 = new JButton("Previous");
b1.setFont(new Font("Arial", Font.BOLD, 18));
b2.setFont(new Font("Arial", Font.BOLD, 18));
b2.setEnabled(false);
add(b1);
add(b2);
set();
// if the "next" button is pressed
b1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
q_curent++;
b2.setEnabled(true);
set();
}
});
// if the "previous" button is pressed
b2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
q_curent--;
b1.setText("Next");
b1.setEnabled(true);
set();
if (q_curent == 0) {
b2.setEnabled(false);
}
}
});
}
private void set() {
for (int i = 0; i < n; i++) {
if (q_curent == i) {
question.setText(q.questions[q_curent]); // questions are displayed
for (int j = 0; j < 3; j++) {
c[j].setText(q.options[q_curent][j]); // answer options are displayed
}
}
}
}
}
Код: Выделить всё
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class QnA {
public String[] questions;
public String[][] options;
public QnA(String subject) {
// importing the questions and their options from the .txt
try {
System.out.println(subject); //displays null
BufferedReader f = new BufferedReader(new FileReader(subject)); //error; the path is null
int nr_questions = 3;
questions = new String[nr_questions];
options = new String[nr_questions][3];
String linie;
int i = 0;
// reading from the file
while ((linie = f.readLine()) != null) {
linie = linie.trim();
if (linie.isEmpty())
continue;
questions[i] = linie;
for (int j = 0; j < 3; j++) {
options[i][j] = f.readLine().trim();
}
i++;
}
// stop reading
f.close();
}
catch (IOException e) {
System.out.println("An error occurred: " + e.getMessage());
}
}
}
Это может быть что-то очевидное, но я действительно не знаю, что мне делать. Кроме того, в коде могут быть части, которые выглядят странно (для экспертов), и я, возможно, поступил бы умнее, организовав его, но я все еще учусь.
Подробнее здесь: https://stackoverflow.com/questions/792 ... nel-switch