假设在一个JPanel中有四个控件JTextField,JList,JCheckBox,JButton
当我点JButton时如何用一个for循环给其它三个控件赋值(所有控件已初始化)

解决方案 »

  1.   

    自己写一个MyPanel类,继承自JPanel,
    然后在其中加入属性 ArrayList UIList,
    重载 JPanel的add 方法public Component add(Component comp) {
           UIList.add(comp);
           super.add(comp);
        }然后在 button事件监听器里 遍历这个 UIList 即可。
      

  2.   

    请问一下,假设遍历 UIList 得到JTextField,能用setText("test")吗?
    好象不可以,可否说详细点!
      

  3.   

    1、自动以一个接口:
    interface MyComponent{
    void initComponent(Object value);//不知道需不需要参数,如果有默认值,可以不需要参数;
    }2、实现自己的组件,JTextField、JList、JCheckBox,全部实现MyComponent的接口:3、实现自己的JPanel,或者不实现也可以,就是向Panel中添加自定义组件的时候,需要使用List<MyComponent>保存起来,
       在需要初始化的时候,遍历List<MyComponent>,调用initComponent进行控件的初始化
      

  4.   


    如果使用一楼的方法,无论是默认值,还是自己需要设置的值,都需要在List遍历的时候对控件类型进行判断
      

  5.   


    是这个意思。我觉得在接口中定义的给控件赋值的方法里需要参数的,应该Object类型的,或者数组。总之参数是自己传入的,而接口的实现也是自己写的,肯定能够处理好。另外,我说的方法在2楼,不在1楼。
      

  6.   


    public interface MyComponent
    {
    public void setValueToComponent(Object value);
    }import javax.swing.JTextField;public class MyJTextField extends JTextField implements MyComponent
    {
    //實現MyComponent,TextField類型,調用父類的setText(String)方法
    public void setValueToComponent(Object value)
    {
    if (value instanceof String)
    {
    setText((String) value);
    }
    else
    {
    setText("");
    }
    }
    }import java.awt.Component;
    import java.util.ArrayList;
    import java.util.List;import javax.swing.JPanel;public class MyPanel extends JPanel
    {
    private List uiList = new ArrayList();

    //可以多重載一些JPanel的方法,提供良好的接口 //把UI加入到UIList中,在調用父類方法,將UI加入到JPanel中
    public Component add(MyComponent comp)
    {
    uiList.add(comp);
    return super.add((Component) comp);
    }

    //返回UIList
    public List getUIList()
    {
    return uiList;
    }
    }
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.List;import javax.swing.JButton;
    import javax.swing.JFrame;public class TestFrame extends JFrame
    {
    public TestFrame()
    {
    final MyPanel myP = new MyPanel();
    // 需要加入到UIList里的UI,定義成MyComponent接口類型
    MyComponent myJtf = new MyJTextField();
    //此處進入MyPanel的add方法
    myP.add(myJtf);

    //不需要加入到UIList里的UI,定義成JComponent類型
    JButton btn = new JButton("setValue");
    //此處進入JButton繼承自Container的add方法
    myP.add(btn);

    btn.addActionListener(new ActionListener()
    { public void actionPerformed(ActionEvent e)
    {
    List uiList = myP.getUIList();
    for(int i = 0; i < uiList.size(); i++)
    {
    // 此處給UI控件賦値
    //此處因為只加入了TextField控件,所以可以循環賦値
    //但由于JList,JCheckBox等賦値的參數不同,應該另行設計
    //可以將參數也有序化,然后調用MyComponent接口方法
    ((MyComponent) uiList.get(i)).setValueToComponent("String");
    }
    myP.updateUI();
    } });
    getContentPane().add(myP);
    setSize(300, 300);
    setLocation(100, 100);
    pack();
    setVisible(true);
    } public static void main(String args[])
    {
    TestFrame tf = new TestFrame();
    }
    }
      

  7.   

    LS实现的不太好的地方(个人观点):
    //把UI加入到UIList中,在調用父類方法,將UI加入到JPanel中
        public Component add(MyComponent comp)
        {
            uiList.add(comp);
            return super.add((Component) comp);
        }
    应该这样: @Override
    protected void addImpl(Component comp, Object constraints, int index) {
    if(comp inatanceof MyComponent){
            uiList.add(comp);
    }
    super.addImpl(comp, constraints, index);
    }如果像LS那样的话,太缺乏通用性,还的用户自己判断什么样控件需要调用什么样的add方法
      

  8.   

    jpanel.getComponents(),得到数组后遍历。