我有一个JFrame,下面有很多JPanel,各个panel都有几个JTextField,JTextArea,我想让所有的JTextField和JTextArea都不可编辑,怎么办?法一、最原始的方法就是对每个JTextField和JTextArea使用setEditable(false);法二、for(int i=1;i<count;i++){
        if(jPanel1.getComponent(i).getClass().toString().equals("class javax.swing.JTextField")){
          ((JTextField)jPanel1.getComponent(i)).setEditable(true);
        }
      }
上面这个很笨的方法也只能实现对一个JPanel下面的所有JTextField的修改
我现在问题时一个JFrame下面有很多JPanel55555,神阿,救救我!

解决方案 »

  1.   

    补充一下,一个JPanel下面还可能包含子JPanel
      

  2.   

    public static void setEditable(Component c, boolean b) {
    if (c instanceof Container) {
    Container p = (Container) c;
    int n = p.getComponentCount();
    for (int i = 0; i < n; i++) {
    setEditable(p.getComponent(i), b);
    }
    }
    else if (c instanceof JTextField || c instanceof JTextArea) {
    ((JTextComponent)c).setEditable(b);
    }
    }
    setEditable(frame, false);
      

  3.   

    楼上的牛,请问您做swing多长时间了,我也做过一段时间的swing,很想和你交个朋友。
      

  4.   

    自己写两个类,分别扩展JTextField和JTextArea,构造函数里加上setEditable
      

  5.   

    谢谢楼上gtlang78() 但是发生了一个很奇怪的错误,那就是但循环到JPanel时,p.getComponentCount()居然为0 明明有两个JTextField啊   附代码:
     import javax.swing.*;
    import java.awt.*;
    import javax.swing.text.*;
    public class setEditableTest extends JFrame{
      JPanel jPanel1 = new JPanel();
      JPanel jPanel2 = new JPanel();
      BorderLayout borderLayout1 = new BorderLayout();
      JPanel jPanel3 = new JPanel();
      JTextField jTextField1 = new JTextField();
      JTextField jTextField2 = new JTextField();
      JTextField jTextField3 = new JTextField();
      JTextField jTextField4 = new JTextField();
      public setEditableTest() {
        try {
          jbInit();
        }
        catch(Exception e) {
          e.printStackTrace();
        }
      }
      public static void main(String[] args) {
        setEditableTest setEditableTest1 = new setEditableTest();
        setEditable(setEditableTest1,false);
        setEditableTest1.setSize(400,300);
        setEditableTest1.setVisible(true);
      }
      private void jbInit() throws Exception {
        jPanel1.setBackground(Color.white);
        jPanel1.setLayout(borderLayout1);
        jPanel2.setBackground(Color.pink);
        jPanel3.setBackground(Color.white);
        jPanel3.setLayout(null);
        jTextField1.setText("jTextField1");
        jTextField1.setBounds(new Rectangle(41, 63, 145, 22));
        jTextField2.setText("jTextField2");
        jTextField2.setBounds(new Rectangle(208, 63, 145, 22));
        jTextField3.setText("jTextField3");
        jTextField4.setText("jTextField4");
        this.getContentPane().add(jPanel1,  BorderLayout.CENTER);
        jPanel1.add(jPanel2,  BorderLayout.SOUTH);
        jPanel2.add(jTextField3, null);
        jPanel2.add(jTextField4, null);
        jPanel1.add(jPanel3, BorderLayout.CENTER);
        jPanel3.add(jTextField1, null);
        jPanel3.add(jTextField2, null);
       
      }
      public static void setEditable(Component c, boolean b) {
          if (c instanceof Container) {
                  Container p = (Container) c;
                  int n = p.getComponentCount();
                  for (int i = 0; i < n; i++) {
                          setEditable(p.getComponent(i), b);
                  }
          }
          else if (c instanceof JTextField || c instanceof JTextArea) {
                  ((JTextComponent)c).setEditable(b);
          }
    }
    }
      

  6.   

    搞定了,我改了一下
    public  void setTextEditable(JPanel pp,boolean b){
        JPanel p = pp;
        for (int i = 0; i < p.getComponentCount(); i++) {
          if (p.getComponent(i) instanceof JPanel) {
            setTextEditable( (JPanel) p.getComponent(i), b);
          }
          else if (p.getComponent(i) instanceof JTextField) {
            ( (JTextField) p.getComponent(i)).setEditable(false);
          }
        }
      }然后setTextEditable(jPanel1,false);
      

  7.   

    楼主,为什么把Container改成JPanel就对了,JPanel本身就是Container啊
      

  8.   

    但是发生了一个很奇怪的错误,那就是但循环到JPanel时,p.getComponentCount()居然为0 明明有两个JTextField啊  不然你运行上面的代码看看,看是什么错误