Могу ли я добавить совершенно новый экземпляр того же jPanel, имея доступ к предыдущему?

1

Я новичок здесь, и это мой первый вопрос: я пытаюсь задать вопрос и ответить (поп-викторину), я прошел через множество препятствий, проверив ответы на предыдущие вопросы, но я столкнулся с путают один.

Я помещаю переключатель в 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                   
}
  • 2
    «Я установил переключатель в jPanel и сделал его окончательным и статичным, чтобы сохранить выбранный статус». Это не имеет никакого смысла. Сохранение ссылки на существующий элемент управления также будет поддерживать его состояние. Это не имеет никакого отношения ни к final ни к static .
  • 0
    msgstr "(используя построитель графического интерфейса пользователя NetBeans)" Нет. Кажется, он использует тебя. Остановите это, отложив на время «волшебную шкатулку» и научившись кодировать Java.
Показать ещё 1 комментарий
Теги:
swing
jpanel

1 ответ

2
Лучший ответ

Если у вас есть JPanel, вы также должны иметь контейнер, в котором находится JPanel. Скорее всего, это JFrame; в любом случае - если у вас есть контейнер, скорее всего, вы поместите свой JPanel в него с помощью функции add(Component component). Попробуйте другой подход:

  1. В вашем контейнере создайте статическое поле, которое будет хранить вашу page1. Если вы используете запас JFrame, просто увеличьте его.
    Из того, что я себе представляю, каждая page1 представляет собой один вопрос в викторине, поэтому вы хотите, чтобы это поле было своего рода коллекцией для хранения всех ваших вопросов.

  2. Тип коллекции - это зависит от вас, но я думаю, что Map, Set, List будет самым удобным. Что вы хотите сделать, так это задать все ваши вопросы, и вы можете сделать это, например, в конструкторе контейнера. Я буду использовать Map здесь, но вы можете использовать любой другой тип коллекции, если хотите.

  3. Вы хотите, чтобы ваша Map сохраняла номер вопроса и его JPanel, поэтому давайте
    Map<Integer, page1> map = new HashMap<Integer, page1>();
    Хорошо, теперь задайте здесь все свои вопросы.
  4. Создайте себе статический геттер этой Map.
  5. Теперь, если вы нажмете кнопку "Следующий/предыдущий вопрос", вы вызываете свой статический геттер карты из контейнера, get свою page1 с правильным количеством вопросов, которое было бы предыдущим/следующим, и сделайте это, поместив его в свой контейнер с помощью функции setContentPane(Component chosenComponent).

Таким образом, у вас есть доступ ко всем вашим вопросам. Надеюсь, теперь это легче понять.

Говоря о выбранных ответах - не было бы лучшей идеей создать дополнительное поле в вашем классе page1, которое просто сохранит то, что выбрал пользователь, и в соответствии с этим полем правильный ответ будет проверяться при нажатии следующей/предыдущей кнопки?

Пример:
Создайте поле в своем JPanel, чтобы сохранить ответ - независимо от того, какой тип вы хотите, он может также быть int. Итак, у вас есть в вашем поле page1 private int chosenAnswer; , Теперь, когда вы создаете все свои вопросы (возможно, при размещении их на Map из вышеприведенного решения), инициализируйте вашу переменную selectedAnswer = 0; (просто поместите его в конструктор page1). Теперь, когда нажата предыдущая/следующая кнопка, проверьте все ваши переключатели, если некоторые из них нажаты. Если первый, выбранный ответ = 1; и т.д. Если ни одно из них не покидает 0. Это, я считаю, ясное.
Теперь вы хотите как-то вернуть эту информацию, когда вернетесь к вопросу, который ранее проверял ответ. Чтобы сделать это, попробуйте этот подход:

  1. Создайте в своей функции page1 public void setAnswer(). Вы хотите, чтобы эта функция проверяла значение этого int chosenAnswer - вы можете сделать это с помощью switch или просто несколько if. Этот chosenAnswer ответ будет соответствовать ответу, который был ранее проверен.
  2. Когда вы найдете правильный JRadioButton, это нужно проверить, вызовите функцию setSelected, унаследованную от AbstractButton, например firstRadioButton.setSelected(true) если значение chosenAnswer == 1.
  3. Теперь укажите место в вашем коде, где вы setContentPane(chosenQuestion) и перед этой линией ставите chosenQuestion.setAnswer(); ,
  • 0
    хорошо ..... это займет некоторое время, чтобы это впиталось. Ваша идея сохранить то, что выбрал пользователь, великолепна, я пойду с этим. но я все еще не понимаю весь набор страниц
  • 1
    @ Mofe-hendyEjegi Я улучшил свой ответ, вы должны проверить это сейчас.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню