我可以在访问前一个jPanel的同时添加同一jPanel的全新实例吗?

时间:2014-09-02 11:08:10

标签: java swing jpanel

我是新来的,这是我的第一个问题: 我正在尝试提问和答案(流行测验)程序,我通过查看以前问题的答案经历了很多障碍,但我遇到了一个令人困惑的问题。

我在jPanel中放置了一个单选按钮,并将其设置为final和static以保持其选定状态,我正在尝试避免创建多个jPanel类(使用NetBeans GUI构建器)并决定仅使用一个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                   
}

1 个答案:

答案 0 :(得分:2)

如果您有JPanel,您还必须拥有一个容纳该JPanel的容器。最有可能是JFrame;无论如何 - 如果你有一个容器,很可能你把你的JPanel放在函数add(Component component)中。尝试不同的方法:

  1. 在您的容器中创建一个静态字段,用于存储您的page1。如果你使用股票JFrame,只需扩展它。
    从我的想象,每个page1代表一个测验中的单个问题,所以你希望这个字段是某种集合来存储你的所有问题。

  2. 收藏类型 - 这取决于您,但我认为MapSetList将是最方便的。你想要做的就是把你所有的问题放在这里,你可以在容器构造函数中进行。我会在这里使用Map,但如果您愿意,可以随意使用任何其他类型的收藏。

  3. 您希望Map存储问题编号及其JPanel,因此请让我们 Map<Integer, page1> map = new HashMap<Integer, page1>();
    好的,现在把你的所有问题都放在这里。
  4. 为自己生成Map的静态getter。
  5. 现在,如果您按下一个/上一个问题按钮,则可以从容器get调用您的page1中的静态地图获取器,其中包含前一个/下一个问题的正确问题并进行制作它通过将其放在具有函数setContentPane(Component chosenComponent)
  6. 的容器中来显示

    通过这种方式,您可以访问所有问题。我希望现在它更容易理解。

    说到所选择的答案 - 在page1课程中创建额外的字段并不是一个更好的主意,只需存储用户选择的字段,并根据该字段在下一个/上一个字段中检查正确的答案点击按钮?

    以下示例:
    在你的JPanel中创建一个字段来存储你的答案 - 无论你想要什么类型,它也可以是一个int。因此,您拥有page1字段private int chosenAnswer;。现在,当您创建所有问题时(可能是从上面的解决方案中将它们放入Map),初始化您选择的变量Answer = 0; (只需将其放在page1构造函数中)。现在,当单击上一个/下一个按钮时,如果单击其中一些按钮,请检查所有单选按钮。如果是第一个,则选择答案= 1;如果他们都没有离开0,我相信这很清楚 现在,当您回到以前检查过答案的问题时,您希望以某种方式获取此信息。为此,请尝试以下方法:

    1. page1函数public void setAnswer()中创建。您希望此函数检查该int chosenAnswer的值 - 您可以使用switch或只使用多个if来执行此操作。此chosenAnswer将与之前检查的答案相匹配。
    2. 当您找到需要检查的JRadioButton时,请调用AbstractButton继承的函数setSelected,例如firstRadioButton.setSelected(true),如果chosenAnswer == 1的值}。
    3. 现在代替代码中的位置setContentPane(chosenQuestion),然后在该行放置chosenQuestion.setAnswer();