我是新来的,这是我的第一个问题: 我正在尝试提问和答案(流行测验)程序,我通过查看以前问题的答案经历了很多障碍,但我遇到了一个令人困惑的问题。
我在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
}
答案 0 :(得分:2)
如果您有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
的静态getter。get
调用您的page1
中的静态地图获取器,其中包含前一个/下一个问题的正确问题并进行制作它通过将其放在具有函数setContentPane(Component chosenComponent)
通过这种方式,您可以访问所有问题。我希望现在它更容易理解。
说到所选择的答案 - 在page1
课程中创建额外的字段并不是一个更好的主意,只需存储用户选择的字段,并根据该字段在下一个/上一个字段中检查正确的答案点击按钮?
以下示例:
在你的JPanel中创建一个字段来存储你的答案 - 无论你想要什么类型,它也可以是一个int。因此,您拥有page1
字段private int chosenAnswer;
。现在,当您创建所有问题时(可能是从上面的解决方案中将它们放入Map
),初始化您选择的变量Answer = 0; (只需将其放在page1
构造函数中)。现在,当单击上一个/下一个按钮时,如果单击其中一些按钮,请检查所有单选按钮。如果是第一个,则选择答案= 1;如果他们都没有离开0,我相信这很清楚
现在,当您回到以前检查过答案的问题时,您希望以某种方式获取此信息。为此,请尝试以下方法:
page1
函数public void setAnswer()
中创建。您希望此函数检查该int chosenAnswer
的值 - 您可以使用switch
或只使用多个if
来执行此操作。此chosenAnswer
将与之前检查的答案相匹配。JRadioButton
时,请调用AbstractButton
继承的函数setSelected,例如firstRadioButton.setSelected(true)
,如果chosenAnswer == 1
的值}。setContentPane(chosenQuestion)
,然后在该行放置chosenQuestion.setAnswer();
。