Java Swing:如何将容器绑定到JRadioButton?

Java Swing:如何将容器绑定到JRadioButton?,java,swing,parent-child,jradiobutton,Java,Swing,Parent Child,Jradiobutton,我有一堆动态添加的面板,其中包含单选按钮,还有一个面板,有几个标签绑定到单选按钮。假设我有一个按钮,它应该检索容器,标签绑定到选中的单选按钮,或者换言之,数据绑定到选中的单选按钮。但是如何得到这个容器呢 下面是我尝试执行此操作的代码(事实上,这是一个存根,用于显示UI(视图)端的情况): 公共类测试扩展JFrame{ 公共静态按钮组单选按钮=新建按钮组(); 公开考试(){ 超级(“测试”); setDefaultCloseOperation(WindowConstants.EXIT_ON_CL

我有一堆动态添加的面板,其中包含单选按钮,还有一个面板,有几个标签绑定到单选按钮。假设我有一个按钮,它应该检索容器,标签绑定到选中的单选按钮,或者换言之,数据绑定到选中的单选按钮。但是如何得到这个容器呢

下面是我尝试执行此操作的代码(事实上,这是一个存根,用于显示UI(视图)端的情况):

公共类测试扩展JFrame{
公共静态按钮组单选按钮=新建按钮组();
公开考试(){
超级(“测试”);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
设置大小(200300);
最终JPanel面板=新JPanel();
panel.setLayout(新的BoxLayout(panel,BoxLayout.Y_轴));
JButton addButton=新JButton(“添加”);
addButton.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
添加(带有单选按钮(“text1”、“text2”)的新面板);
panel.revalidate();
}
});
panel.add(添加按钮);
JButton infoButton=新JButton(“Info”);
infoButton.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
for(枚举myRadioButtons=radioButtons.getElements();
myRadioButtons.hasMoreElements();){
JRadioButton btn=(JRadioButton)myRadioButtons.nextElement();
如果(btn.isSelected()){
PanelWithTwoLabels panelWithLabels=(PanelWithTwoLabels)btn.getComponent(1);//尝试将组件绑定到选定的JRadioButton
JOptionPane.showMessageDialog(null,“Text1:+panelWithLabels.getLabel1Text()+”,Text2:+panelWithLabels.getLabel2Text());
}
}
}
});
面板。添加(信息按钮);
getContentPane().add(面板);
setVisible(真);
}
公共静态void main(字符串[]args){
新测试();
}
//带有两个文本字段的JRadioButton+面板
私有类PanelWithRadioButton扩展了JPanel{
私人JRadioButton rbbutton;
带有两个标签的专用面板带有两个标签的面板;
带单选按钮的公共面板(字符串文本1、字符串文本2){
setLayout(新的BoxLayout(这是BoxLayout.X_轴));
panelWithTwoLabels=新的panelWithTwoLabels(text1、text2);
rButton=newjradiobutton();
添加(panelWithTwoLabels);//将组件绑定到JRadioButton
单选按钮。添加(rButton);
添加(rButton);
添加(带两个标签的面板);
}
}
带有两个标签的私有类Panel扩展了JPanel{
私人JLabel标签1;
私人JLabel标签2;
带有两个标签的公共面板(字符串text1、字符串text2){
setLayout(新的BoxLayout(这是BoxLayout.Y_轴));
label1=新的JLabel(text1);
label2=新的JLabel(text2);
添加(标签1);
添加(标签2);
}
私有字符串getLabel1Text(){
返回label1.getText();
}
私有字符串getLabel2Text(){
返回label2.getText();
}
}
}

听起来你在做一个数据驱动的问答程序。虽然通过递归遍历从容器的
getComponents()
方法返回的数组,所示方法在技术上是可行的,但结果混淆了包含和继承层次结构;它的伸缩性也很差

相反,按照建议分离模型(字符串、选择)和视图(标签、按钮)。让视图使用所示的一种通知方法来侦听其模型。这样,视图的每个实例都知道自己的按钮以及选择的按钮。几乎所有标准的Swing组件都是一个很好的例子

附录:虽然我不愿意认可隐含的设计限制,但这里有一个权宜之计

PanelWithRadioButton
中,添加对
panelWithTwoLabels
的引用作为客户端属性:

rButton.putClientProperty("labels", panelWithTwoLabels);
actionPerformed()
中,使用属性检索带有两个标签的
面板:

PanelWithTwoLabels panelWithLabels =
    (PanelWithTwoLabels) btn.getClientProperty("labels");

听起来你在做一个数据驱动的问答程序。虽然通过递归遍历从容器的
getComponents()
方法返回的数组,所示方法在技术上是可行的,但结果混淆了包含和继承层次结构;它的伸缩性也很差

相反,按照建议分离模型(字符串、选择)和视图(标签、按钮)。让视图使用所示的一种通知方法来侦听其模型。这样,视图的每个实例都知道自己的按钮以及选择的按钮。几乎所有标准的Swing组件都是一个很好的例子

附录:虽然我不愿意认可隐含的设计限制,但这里有一个权宜之计

PanelWithRadioButton
中,添加对
panelWithTwoLabels
的引用作为客户端属性:

rButton.putClientProperty("labels", panelWithTwoLabels);
actionPerformed()
中,使用属性检索带有两个标签的
面板:

PanelWithTwoLabels panelWithLabels =
    (PanelWithTwoLabels) btn.getClientProperty("labels");

与你的问题无关,但

panel.updateUI();
不要这样使用updateUI()方法。当LAF更改时,Swing在内部使用updateUI()方法

将组件添加到可见GUI时,应使用:

panel.revalidat();
panel.repaint(); // sometimes needed

与你的问题无关,但

panel.updateUI();
不要这样使用updateUI()方法。当LAF更改时,Swing在内部使用updateUI()方法

将组件添加到可见GUI时,应使用:

panel.revalidat();
panel.repaint(); // sometimes needed

哦,谢谢。只是我有一个例子,当updateUI()对我起作用时,重新绘制对我不起作用。哦,谢谢。只是我有一个例子,当updateUI()对我起作用时,重新绘制对我来说不起作用