Я новичок здесь, и это мой первый вопрос: я пытаюсь задать вопрос и ответить (поп-викторину), я прошел через множество препятствий, проверив ответы на предыдущие вопросы, но я столкнулся с путают один.
Я помещаю переключатель в jPanel и делаю его окончательным и статическим, чтобы сохранить выбранный статус, я пытаюсь избежать создания нескольких классов jPanel (используя построитель GUI NetBeans) и решил использовать только один класс Jpanel. Но моя проблема заключается в том, что каждый раз, когда я нажимаю следующую кнопку, она по-прежнему показывает одну и ту же страницу (с выбранной радиокнопкой). Как я могу создать совершенно новый Jpanel, но все же похожий на оригинальный?
здесь мой пример кода:
package pages;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
/**
*
* @author Hendy
*/
public class page1 extends javax.swing.JPanel {
/**
* Creates new form page1
*/
public page1() {
initComponents();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jButton1 = new javax.swing.JButton();
jRadioButton1.setText("first");
jButton1.setText("next");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(176, 176, 176)
.addComponent(jRadioButton1)
.addContainerGap(179, Short.MAX_VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jButton1)
.addGap(30, 30, 30))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(131, 131, 131)
.addComponent(jRadioButton1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 96, Short.MAX_VALUE)
.addComponent(jButton1)
.addGap(27, 27, 27))
);
}// </editor-fold>
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
removeAll();
setLayout(new FlowLayout());
setLayout( new BorderLayout() );
invalidate();
page1 on = new page1();
add(on,BorderLayout.NORTH );
revalidate();
}
// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private static final javax.swing.JRadioButton jRadioButton1 = new javax.swing.JRadioButton();
// End of variables declaration
}
Если у вас есть JPanel, вы также должны иметь контейнер, в котором находится JPanel. Скорее всего, это JFrame; в любом случае - если у вас есть контейнер, скорее всего, вы поместите свой JPanel в него с помощью функции add(Component component)
. Попробуйте другой подход:
В вашем контейнере создайте статическое поле, которое будет хранить вашу page1
. Если вы используете запас JFrame, просто увеличьте его.
Из того, что я себе представляю, каждая page1
представляет собой один вопрос в викторине, поэтому вы хотите, чтобы это поле было своего рода коллекцией для хранения всех ваших вопросов.
Тип коллекции - это зависит от вас, но я думаю, что Map
, Set
, List
будет самым удобным. Что вы хотите сделать, так это задать все ваши вопросы, и вы можете сделать это, например, в конструкторе контейнера. Я буду использовать Map
здесь, но вы можете использовать любой другой тип коллекции, если хотите.
Map
сохраняла номер вопроса и его JPanel, поэтому давайте Map<Integer, page1> map = new HashMap<Integer, page1>();
Map
.get
свою page1
с правильным количеством вопросов, которое было бы предыдущим/следующим, и сделайте это, поместив его в свой контейнер с помощью функции setContentPane(Component chosenComponent)
. Таким образом, у вас есть доступ ко всем вашим вопросам. Надеюсь, теперь это легче понять.
Говоря о выбранных ответах - не было бы лучшей идеей создать дополнительное поле в вашем классе page1
, которое просто сохранит то, что выбрал пользователь, и в соответствии с этим полем правильный ответ будет проверяться при нажатии следующей/предыдущей кнопки?
Пример:
Создайте поле в своем JPanel, чтобы сохранить ответ - независимо от того, какой тип вы хотите, он может также быть int. Итак, у вас есть в вашем поле page1
private int chosenAnswer;
, Теперь, когда вы создаете все свои вопросы (возможно, при размещении их на Map
из вышеприведенного решения), инициализируйте вашу переменную selectedAnswer = 0; (просто поместите его в конструктор page1
). Теперь, когда нажата предыдущая/следующая кнопка, проверьте все ваши переключатели, если некоторые из них нажаты. Если первый, выбранный ответ = 1; и т.д. Если ни одно из них не покидает 0. Это, я считаю, ясное.
Теперь вы хотите как-то вернуть эту информацию, когда вернетесь к вопросу, который ранее проверял ответ. Чтобы сделать это, попробуйте этот подход:
page1
public void setAnswer()
. Вы хотите, чтобы эта функция проверяла значение этого int chosenAnswer
- вы можете сделать это с помощью switch
или просто несколько if
. Этот chosenAnswer
ответ будет соответствовать ответу, который был ранее проверен.JRadioButton
, это нужно проверить, вызовите функцию setSelected, унаследованную от AbstractButton
, например firstRadioButton.setSelected(true)
если значение chosenAnswer == 1
.setContentPane(chosenQuestion)
и перед этой линией ставите chosenQuestion.setAnswer();
,
final
ни кstatic
.