Java 在CardLayout面板中意外切换JRadioButton
所以问题是:我正在尝试制作一个类似于向导的CardLayout。在每个卡片面板中,我放回&next JButton和3个JRadioButton以在3个页面之间切换 现在,当我第一次选择单选按钮时,它工作正常。但是,当我第二次选择单选按钮时,它们并没有按预期被选中。例如,我想选择第2页,卡面板2会显示,但单选按钮2的状态不会显示它正在被选中,而是单选按钮1或3会被选中。按钮2仅在我再次单击时被选中。当我尝试选择其他人时也会发生同样的事情Java 在CardLayout面板中意外切换JRadioButton,java,swing,cardlayout,jradiobutton,Java,Swing,Cardlayout,Jradiobutton,所以问题是:我正在尝试制作一个类似于向导的CardLayout。在每个卡片面板中,我放回&next JButton和3个JRadioButton以在3个页面之间切换 现在,当我第一次选择单选按钮时,它工作正常。但是,当我第二次选择单选按钮时,它们并没有按预期被选中。例如,我想选择第2页,卡面板2会显示,但单选按钮2的状态不会显示它正在被选中,而是单选按钮1或3会被选中。按钮2仅在我再次单击时被选中。当我尝试选择其他人时也会发生同样的事情 import java.awt.*; import jav
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CardLayoutWizardDemo extends JFrame{
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable() {
public void run() {
CardLayoutWizardDemo frame= new CardLayoutWizardDemo();
frame.init();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
private static final long serialVersionUID = 1L;
private JPanel cardPanel, panel1, panel2, panel3, btnPanel1, btnPanel2, btnPanel3;
private JLabel label1, label2, label3;
private JRadioButton step1, step2, step3;
private ButtonGroup bg;
private CardLayout cl = new CardLayout();
private void init(){
setTitle("CardLayoutWizardDemo");
cardPanel = new JPanel();
cardPanel.setLayout(cl);
panel1 = new JPanel(new BorderLayout());
panel2 = new JPanel(new BorderLayout());
panel3 = new JPanel(new BorderLayout());
label1 = new JLabel("label 1");
label2 = new JLabel("label 2");
label3 = new JLabel("label 3");
panel1.add(label1, BorderLayout.NORTH);
panel2.add(label2, BorderLayout.NORTH);
panel3.add(label3, BorderLayout.NORTH);
btnPanel1 = new JPanel();
btnPanel2 = new JPanel();
btnPanel3 = new JPanel();
btnPanel1.setName("panel1");
btnPanel2.setName("panel2");
btnPanel3.setName("panel3");
btnPanel1 = initTutBtn(btnPanel1);
btnPanel2 = initTutBtn(btnPanel2);
btnPanel3 = initTutBtn(btnPanel3);
panel1.add(btnPanel1, BorderLayout.SOUTH);
panel2.add(btnPanel2, BorderLayout.SOUTH);
panel3.add(btnPanel3, BorderLayout.SOUTH);
cardPanel.add(panel1, "1");
cardPanel.add(panel2,"2");
cardPanel.add(panel3,"3");
getContentPane().add(cardPanel, BorderLayout.CENTER);
setPreferredSize(new Dimension(350,500));
setMinimumSize(new Dimension(240,320));
pack();
setLocationByPlatform(true);
}
/**create new set of 3 step buttons
*/
private JPanel initTutBtn(JPanel btnPanel){
btnPanel.setLayout(new BoxLayout(btnPanel,BoxLayout.X_AXIS));
step1 = new JRadioButton();
step2 = new JRadioButton();
step3 = new JRadioButton();
step1.setActionCommand("step1");
step2.setActionCommand("step2");
step3.setActionCommand("step3");
bg = new ButtonGroup();
bg.add(step1);
bg.add(step2);
bg.add(step3);
if (btnPanel.getName().equals("panel1")){
step1.setSelected(true);
}else if (btnPanel.getName().equals("panel2")){
step2.setSelected(true);
}else if (btnPanel.getName().equals("panel3")){
step3.setSelected(true);
}
step1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
goToStep(e);
}
});
step2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
goToStep(e);
}
});
step3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
goToStep(e);
}
});
btnPanel.add(step1);
btnPanel.add(step2);
btnPanel.add(step3);
return btnPanel;
}
private void goToStep(ActionEvent evt){
if(evt.getActionCommand().equals("step1")){
cl.show(cardPanel, "1");
}else if(evt.getActionCommand().equals("step2")){
cl.show(cardPanel, "2");
}else if(evt.getActionCommand().equals("step3")){
cl.show(cardPanel, "3");
}
}
}
我想问题可能在于我在
initButton()
和goToStep(ActionEvent evt)
中创建了新的单选按钮,但我不知道我做错了什么请创建并发布一个有效的or。谢谢@HovercraftFullOfEels我添加了一个SSCE。请再次检查。您正在分别三次初始化JRadioButton字段。您总共创建了九个JRadioButton。@VGR但是如果我没有,JRadioButton不会显示在卡面板上。我尝试只初始化3个JRadioButton一次,然后将它们添加到3个新的JPanel buttonPanel中。也没有出现。对的将JRadioButtons放在CardLayout外部的单独面板中。当然,您可以放弃使用CardLayout和单选按钮,而是使用设置为JTabbedPane.BOTTOM的JTabbedPane,这意味着您的工作量要少得多。