Как я могу убедиться, что строковая переменная установлена ​​до переключения панели?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу убедиться, что строковая переменная установлена ​​до переключения панели?

Сообщение Anonymous »

Я хочу создать игру-викторину, используя Java. Я использовал панели для отображения разных «этапов» теста (больше похоже на разные интерфейсы) и использовал cardLayout для навигации по этим панелям (каждая панель находится в отдельном файле).
У меня есть панель под названием «Панель тем», в которой, по сути, есть несколько кнопок с темами, которые можно выбрать. Нажатие одной из этих кнопок приводит к переходу на другую панель ModePanel, на которой есть две кнопки: «Практика» и «Тест». При нажатии каждой из этих кнопок откроются соответствующие панели, и, наконец, начнется тест.
Дело в том, что я хочу, чтобы все вопросы и варианты были импортированы из файла .txt< /код> файл. Это работало бы нормально, если бы я использовал только один .txt, но я создал .txt для каждого из предметов, которые игрок может выбирать, и в зависимости от того, какая кнопка нажата в ObjectsPanel, я хочу, чтобы вопросы импортировались из соответствующего файла .txt .
Я постарался максимально сжать код, поэтому Я сделал версию викторины, которая делает на самом деле не делает того, что должен (на самом деле он мало работает и выглядит довольно плохо), но дело не в этом. Это чтобы увидеть, где может быть проблема.
Итак:

Код: Выделить всё

public class App {
public static void main(String[] args) throws Exception {
SwingUtilities.invokeLater(() -> new MainFrame());
}
}
Файл 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");
}
});
}
}
Кроме того, есть 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");
}
});
}
}
PracticPanel (TestPanel очень похожа):

Код: Выделить всё

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());
}
}
}
Проблема в том, что когда он достигает PracticePanel, переменнаяsharedData имеет значение null. Я реализовал отладочные отпечатки и сохранил некоторые из них (комментарии с восклицательными знаками в начале).
Это может быть что-то очевидное, но я действительно не знаю, что мне делать. Кроме того, в коде могут быть части, которые выглядят странно (для экспертов), и я, возможно, поступил бы умнее, организовав его, но я все еще учусь.

Подробнее здесь: https://stackoverflow.com/questions/792 ... nel-switch
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»