【问题标题】:Putting multiple ButtonGroups in one JFrame将多个 ButtonGroups 放在一个 JFrame 中
【发布时间】:2017-11-25 18:36:51
【问题描述】:

我正在尝试使用 ButtonGroup 将多个 JButtons 放在一个框架上。

我必须将 3 组按钮放在一个框架上,彼此分开。

以下代码确实创建了按钮,但它们并没有被分开,而是似乎在相互“删除”。

我希望看到单独的按钮组,每组 4 个按钮。

该方法接受“问题”对象的 ArrayList,如下所示:

public class Question {
private String _question;
private String _option1;
private String _option2;
private String _option3;
private String _option4;
}

方法如下。它位于从另一个类“DisplayOnPanel”继承框架的类中,用于将面板设置在同一框架上。 “this”指的是一个框架:

public void addButtonstoFrame(ArrayList<Question> q){
    ArrayList<ButtonGroup> BG = new ArrayList<>();
    ArrayList<JPanel> JP = new ArrayList<>();

    JLabel question1 = new JLabel();
    int j=0;
    for (int i = 0; i <q.size() ; i++) {
        BG.add(new ButtonGroup());
        JP.add(new JPanel());
        JRadioButton option1 = new JRadioButton(q.get(i).get_option1());
        JRadioButton option2 = new JRadioButton(q.get(i).get_option2());
        JRadioButton option3 = new JRadioButton(q.get(i).get_option3());
        JRadioButton option4 = new JRadioButton(q.get(i).get_option4());
        BG.get(j).add(option1);
        BG.get(j).add(option2);
        BG.get(j).add(option3);
        BG.get(j).add(option4);
        JP.get(j).add(option1);
        JP.get(j).add(option2);
        JP.get(j).add(option3);
        JP.get(j).add(option4);


        this.setLayout(new BorderLayout()); //this referes to a frame
        this.add(JP.get(j)); //this referes to a frame
        JP.get(i).setLocation(j+10,j+10);
        JP.get(j).setVisible(true);
        this.setVisible(true);//this referes to a frame
        j++;
    }

}

结果只有 4 个按钮,而不是 12 个:

谢谢!

【问题讨论】:

  • 请始终包含完整的代码示例 (SSCCE)。
  • 实际上是很多代码,上次有人告诉我不要发布我的整个代码:-(
  • 现在不会告诉您发布整个代码。如需尽快获得更好的帮助,请发布minimal reproducible exampleShort, Self Contained, Correct Example。 @Amber 的提示:[mcve] 在评论中自动扩展为 minimal reproducible example
  • 我猜他们的关键字是“短”。您不应该发布您的整个代码,但您应该发布一个显示问题的最小完整示例。即具有主要方法的类。
  • 您确定要使用 BorderLayout 吗?我认为这就是让你失望的原因。

标签: java swing jframe jpanel jbutton


【解决方案1】:

首先,变量名不应以大写字符开头。

    JRadioButton option1 = new JRadioButton(q.get(i).get_option1());
    JRadioButton option2 = new JRadioButton(q.get(i).get_option2());
    JRadioButton option3 = new JRadioButton(q.get(i).get_option3());
    JRadioButton option4 = new JRadioButton(q.get(i).get_option4());
    BG.get(j).add(option1);
    BG.get(j).add(option2);
    BG.get(j).add(option3);
    BG.get(j).add(option4);
    JP.get(j).add(option1);
    JP.get(j).add(option2);
    JP.get(j).add(option3);
    JP.get(j).add(option4);

一个组件只能属于一个父容器。

当您将按钮添加到“JP”包含时,您会将其从“BG”容器中删除。

因此,您需要为每个单选按钮再创建 4 个实例。

【讨论】:

  • 我明白了。那么有没有一种方法可以让我创建一次单选按钮?也许我创建了太多的 JP?
  • 我不明白你的问题。您不能在不同的面板上共享组件,也不能将相同的组件两次添加到同一个面板。您需要创建组件的多个实例。如果你家里有一个“苹果”。你不能把苹果放在冰箱里和厨房桌子上的篮子里。你需要两个苹果。
  • 我的问题是如何让每 4 个按钮位于同一组中,而无需为此编写 8 行代码。谢谢!
  • 您总是可以创建一个方法来创建一个面板,然后向面板添加 4 个按钮。然后您调用该方法两次。这是基本的编程。如果你想重复相同的代码块,你可以创建一个方法。或者您可以创建一个循环。在循环内创建按钮和面板并调用循环两次。
  • @camickr,我认为这不是问题所在。将单选按钮添加到 JPanel 和 ButtonGroup 没有任何问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多