2014-09-02 40 views
1

我在这里是新来的,这是我的第一个问题: 我想提出一个问题和答案(流行测验)计划,我已经通过检查以前的问题的答案经历了很多障碍,但我遇到了一个令人困惑的问题。我试图避免使多个jPanel类(使用NetBeans GUI生成器),并决定使用只有一个Jpanel类(),并且使其成为最终和静态,以保持其选定的状态, 。但我的问题是,每当我按下下一个按钮,它仍然显示相同的页面(仍然选中单选按钮)。我如何制作全新的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'无关。 – 2014-09-02 11:22:17

+0

*“(使用NetBeans GUI生成器)”*不可以。好像它在使用你。通过暂时搁置“魔术画盒”并学习如何编写Java来阻止它的发展。 – 2014-09-02 11:24:01

+0

当我使用多个Jpanels时,在它们之间切换会导致单选按钮重置为未选定模式。使其最终和静态停止重置。现在我试图只用一个面板来做同样的事情,所以我可以实现下一个问题和以前的问题功能。请原谅我的java noobiness。 – 2014-09-02 11:36:34

回答

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中创建一个字段以存储您的答案 - 无论您想要什么类型,它都可能是一个整数。所以,你在page1字段private int chosenAnswer;。现在,当您创建所有问题时(可能将上述解决方案放入Map时),请初始化您的变量chosenAnswer = 0; (简单地把它放在page1的构造函数中)。现在,当单击上一个/下一个按钮时,如果单击其中一些按钮,请检查所有单选按钮。如果第一个是,chosenAnswer = 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();
+0

好吧.....它需要一段时间才能沉入其中。您存储用户选择的内容的想法非常棒,我会继续努力。但我仍然没有得到整个页面的东西 – 2014-09-02 12:06:47

+1

@ Mofe-hendyEjegi我改进了我的答案,你现在应该检查一下。 – spoko 2014-09-02 14:38:56

+0

errthing一直很好,直到我得到了一部分,真的很困惑这一切 – 2014-09-02 22:12:45

相关问题