"每次的运行结果都和第二次一样"这句话有点歧义,我的意思是这样的:
每次在构造函数中显示的都随in[0]中的值的变化而变化,但在actionPerformed方法中,一直显示的都是111.

解决方案 »

  1.   

    把你的RightsTable 整个代码贴出来看一下。
      

  2.   

    package UserManage;import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.table.*;
    import java.util.*;
    import java.sql.*;
    import com.borland.jbcl.layout.*;public class RightsTable extends JPanel{
      Object[][] m_RightsValue;
      BorderLayout borderLayout1 = new BorderLayout();
      JScrollPane jScrollPane1 = new JScrollPane();
      JPanel jPanel1 = new JPanel();
      JPanel jPanel2 = new JPanel();
      JTable jTable1;
      JButton jBtnOK = new JButton();
      JButton jBtnCancel = new JButton();
      JButton jBtnModifyRole = new JButton();   //修改角色或用户组所包含的角色
      JButton jBtnMakeUserRights = new JButton();  //生成用户的最终权限列表字符串  FlowLayout flowLayout1 = new FlowLayout();
      //String m_sGURID=new String("");      //传入的用户组(G)用户(U)角色(R)的ID
      int m_nType;          //设置权限的对象0--Role;1--Group;2--User
      String m_sSelectedItem;  String[] sHeader ={"权限对象描述","类别","权限值",
                         "权限对象描述","类别","权限值",
                         "权限对象描述","类别","权限值"};  //Vector vHeader = new Vector();  int[] tblColWidth = {125,10,12,125,10,12,125,10,12};
      DefaultTableModel tableModel;
      MyTableModel myTableModel;
      JButton jButton1 = new JButton();
      XYLayout xYLayout1 = new XYLayout();
      JComboBox jCbSubSys = new JComboBox();
      public String m_sGURID=new String("");  public RightsTable(String sID,int nType) {
        try  {
          m_sGURID = sID;
          m_nType = nType;
          System.out.println("RightsTable " +m_sGURID);
          System.out.println("m_sGURID in Constructor:" + m_sGURID);
          jbInit();
        }
        catch(Exception e) {
          e.printStackTrace();
        }
      }  public void jbInit() throws Exception{
        System.out.println("m_sGURID in jbInit:" + m_sGURID);
        ActionListener com_als = new ActionListener(){
          public void actionPerformed(ActionEvent e){
            com_actionPerformed(e,m_sGURID);
          }
        };    this.setBorder(BorderFactory.createRaisedBevelBorder());
        this.setLayout(borderLayout1);
        jBtnOK.setPreferredSize(new Dimension(70, 25));
        jBtnOK.setText("确定");
        jBtnCancel.setPreferredSize(new Dimension(70, 25));
        jBtnCancel.setText("取消");
        jPanel1.setLayout(flowLayout1);    //Construct the Table
        tableModel = new DefaultTableModel(sHeader,40);
        jTable1 = new JTable();
        jTable1.setModel(tableModel);
        for (int i = 0;i < tblColWidth.length;i ++)
          jTable1.getColumnModel().getColumn(i).setPreferredWidth(tblColWidth[i]);    jButton1.setBorder(BorderFactory.createEtchedBorder());
        jButton1.setText("子系统列表");
        jPanel2.setLayout(xYLayout1);
        jPanel2.setPreferredSize(new Dimension(370, 50));
        this.add(jScrollPane1, BorderLayout.CENTER);
        jScrollPane1.getViewport().add(jTable1, null);
        this.add(jPanel1, BorderLayout.SOUTH);
        this.add(jPanel2,BorderLayout.NORTH);
        jPanel2.add(jButton1, new XYConstraints(39, 5, 103, 28));
        jPanel2.add(jCbSubSys, new XYConstraints(153, 5, 303, 29));
        jPanel1.add(jBtnOK, null);
        if (m_nType == 0 || m_nType == 1){
          jBtnModifyRole.setPreferredSize(new Dimension(150, 25));
          jBtnModifyRole.setText("修改所包含的角色");
          jPanel1.add(jBtnModifyRole,null);
        }
        else if (m_nType == 2){
          jBtnMakeUserRights.setPreferredSize(new Dimension(150,25));
          jBtnMakeUserRights.setText("生成用户权限字符串");
          jPanel1.add(jBtnMakeUserRights,null);
        }
        jPanel1.add(jBtnCancel, null);    System.out.println("m_sGURID before fillcombobox:" + m_sGURID);
        fillCombBox();    //Register the Listener
        jBtnOK.addActionListener(com_als);
        jBtnCancel.addActionListener(com_als);
        jBtnModifyRole.addActionListener(com_als);
        jBtnMakeUserRights.addActionListener(com_als);    jCbSubSys.addItemListener(new ItemListener(){
          public void itemStateChanged(ItemEvent event){
            String item = (String)event.getItem();
            String s = new String(" Selected");
            if (event.getStateChange()==ItemEvent.SELECTED){
              if (!item.substring(0,1).equals("-")){
                JOptionPane.showMessageDialog(null,item+s);
                m_sSelectedItem = item.substring(0,3);
                getAllRights(m_sGURID,m_sSelectedItem);
                myTableModel = new MyTableModel(m_RightsValue,sHeader);
                myTableModel.setColumnEditable(2,true);
                myTableModel.setColumnEditable(5,true);
                myTableModel.setColumnEditable(8,true);
                jTable1.setModel(myTableModel);
                for (int i = 0;i < tblColWidth.length;i ++){
                  jTable1.getColumnModel().getColumn(i).setPreferredWidth(tblColWidth[i]);
                  //jTable1.getColumnModel().getColumn(i).setMaxWidth(tblColWidth[i]);
                  //jTable1.getColumnModel().getColumn(i).setMinWidth(tblColWidth[i]);
                }
                //当对用户进行权限设定时,首先要根据数据库中已有的个性化权限将权限列表中
                //的复选框选中
                String sPrivate = new String("");
                if (m_nType == 2){
                  try{
                    ResultSet r = ConnToDB.executeQuery("Select QX0107 from QX01 where QX0100 = '" + m_sGURID + "'");
                    while(r.next()){
                      sPrivate = r.getString("QX0107");
                    }
                    r.close();
                  }catch(Exception ec){
                     ec.printStackTrace();
                  }
                  if (!sPrivate.equals("default")){
                    //System.out.println(sPrivate);
                    sPrivate = sPrivate.substring(7);
                    System.out.println(sPrivate);
                  }
                }            jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
                //jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                jTable1.sizeColumnsToFit(true);
                jTable1.validate();
                jTable1.repaint();
                jTable1.updateUI();
                jScrollPane1.updateUI();
              }
            }
          }
        });
        System.out.println("m_sGURID before end of jbInit:" + m_sGURID);
      }  void com_actionPerformed(ActionEvent e,String inID){
        String theID = inID;
        System.out.println("jjjjjjjjjjjjjjjjjjevent:" + theID);
        if(e.getSource()==jBtnOK){
          //从表格中读取各个权限位的信息,并将其转换成字符串存入数据库中
          String temp = new String("");
          Boolean bChecked;
          for(int i=0;i<42;i++){
            bChecked = (Boolean)myTableModel.getValueAt(i,2);
            if (bChecked.booleanValue()){
              temp = temp + "1";
            }
            else{
              temp = temp + "0";
            }
            bChecked = (Boolean)myTableModel.getValueAt(i,5);
            if (bChecked.booleanValue()){
              temp = temp + "1";
            }
            else{
              temp = temp + "0";
            }
            bChecked = (Boolean)myTableModel.getValueAt(i,8);
            if (bChecked.booleanValue()){
              temp = temp + "1";
            }
            else{
              temp = temp + "0";
            }
          }
          //循环结束后,权限字符串串一共126位,多出了一位,所以存入数据库前要去掉最后一位
          //往数据库中存入权限字符串的时候,要把子系统编号添加在字符串最开头,并且要和数
          //据库中已有的字符串比较:如果已有的字符串中不包含当前子系统的字符串,直接把刚生成的
          //字符串加在以有字符串中;如果已有的字符串中包含当前子系统的字符串,则需要用刚生成的
          //字符串来替代已有的部分
          temp = m_sSelectedItem + "#" + temp.substring(0,temp.length()-1);      System.out.println("m_sGURID="+m_sGURID);
          int nPos = 0;
          String oldRightsString = new String("");
          String newRightsString = new String("");
            try{          switch(m_nType){
              //角色个性化权限字符串
              case 0:
                ResultSet rRole = ConnToDB.executeQuery("select QX0303 from QX03 where QX0300='" + m_sGURID + "'");
                while(rRole.next()){
                  oldRightsString = rRole.getString("QX0303");
                }
                rRole.close();
                if (oldRightsString.substring(0,7).equals("default"))
                  oldRightsString = oldRightsString.substring(7);            System.out.println(oldRightsString);
                nPos = oldRightsString.indexOf(temp.substring(0,4));
                if (nPos!=-1){
                  newRightsString = oldRightsString.substring(0,nPos) + temp + oldRightsString.substring(nPos+129);
                }
                else if(nPos==-1){
                  newRightsString = oldRightsString + temp;
                }
                System.out.println(newRightsString);
                ConnToDB.executeUpdate("Update QX03 set QX0303='" + newRightsString + "' where QX0300='" + m_sGURID + "'");
                break;
              //用户组个性化权限字符串
              case 1:
                ResultSet rGroup = ConnToDB.executeQuery("select QX0203 from QX02 where QX0200='" + m_sGURID + "'");
                while(rGroup.next()){
                  oldRightsString = rGroup.getString("QX0203");
                }
                rGroup.close();
                if (oldRightsString.substring(0,7).equals("default"))
                  oldRightsString = oldRightsString.substring(7);
                System.out.println(oldRightsString);
                nPos = oldRightsString.indexOf(temp.substring(0,4));
                if (nPos!=-1){
                  newRightsString = oldRightsString.substring(0,nPos) + temp + oldRightsString.substring(nPos+129);
                }
                else if(nPos==-1){
                  newRightsString = oldRightsString + temp;
                }
                System.out.println(newRightsString);
                ConnToDB.executeUpdate("Update QX02 set QX0203='" + newRightsString + "' where QX0200='" + m_sGURID + "'");            break;
              //用户个性化权限字符串
              case 2:
                ResultSet rUser = ConnToDB.executeQuery("select QX0107 from QX01 where QX0100='" + m_sGURID + "'");
                while(rUser.next()){
                  oldRightsString = rUser.getString("QX0107");
                }
                rUser.close();
                if (oldRightsString.substring(0,7).equals("default"))
                  oldRightsString = oldRightsString.substring(7);
                System.out.println("oldRightsString:" + oldRightsString);
                nPos = oldRightsString.indexOf(temp.substring(0,4));
                if (nPos!=-1){
                  newRightsString = oldRightsString.substring(0,nPos) + temp + oldRightsString.substring(nPos+129);
                }
                else if(nPos==-1){
                  newRightsString = oldRightsString + temp;
                }
                System.out.println("newRightsString:" + newRightsString);
                ConnToDB.executeUpdate("Update QX01 set QX0107='" + newRightsString + "' where QX0100='" + m_sGURID + "'");            break;
              default:
                break;
              }        } catch (Exception e1) {
              e1.printStackTrace();
            }    }
        else if (e.getSource()==jBtnCancel){    }
        else if (e.getSource()==jBtnModifyRole){
          System.out.println("m_sGURID in event:" + m_sGURID);
          //ExistRolesDlg ModifyRoleDlg = new ExistRolesDlg(1,2,m_sGURID);
          //ModifyRoleDlg.show();
        }
        else if (e.getSource()==jBtnMakeUserRights){    }
      }  void fillCombBox(){
        String[] sFillValue = new String[8];
        String[] sSubSysNo = {"000","001","010","011","100","101","110","111"};
        jCbSubSys.addItem("---请选择需要配置权限的应用子系统---");
        for (int i=0;i<sFillValue.length;i++){
          sFillValue[i] = sSubSysNo[i]+"---应用子系统" +i;
          jCbSubSys.addItem(sFillValue[i]);
        }
      }  //测试用,未从数据库取数据
      void getAllRights(String sID,String sSubSysNo){
      //sID为传入的组,角色,用户的ID号,根据此ID号取出权限字符串,并和权限配置表配合
      //取得该对象的所有权限信息
        boolean bRights;
        m_RightsValue = new Object[42][9];
        for (int i=0;i<42;i++){
          //if (i%2==0)
          //  bRights = false;
          //else
          //  bRights = true;
          for (int j=0;j<3;j++){
            //if (i==39 && j!=0){
            //  m_RightsValue[i][0+j*3] = null;
            //  m_RightsValue[i][1+j*3] = null;
            //  m_RightsValue[i][2+j*3] = null;
            //}
            //else{
              m_RightsValue[i][0+j*3] = sSubSysNo+"---"+"权限对象描述" + (i*3+j);
              m_RightsValue[i][1+j*3] = new Integer(i%5);
              m_RightsValue[i][2+j*3] = new Boolean(false);
            //}
          }
        }
      }}
      

  3.   

    注:
    com_actionPerformed(ActionEvent e,String inID)中的inID可以不要,我是拿来调试的,但即使是我把m_sGURID作为参数传递给com_actionPerformed,仍然不正确,我真是没招了!
    谢谢luodi莅临指导!
      

  4.   

    你的程序看上去没什么问题呀?不过有点奇怪的是,你是怎么在别的地方使用这个类的,因为在你的程序里没有修改m_sGURID 的地方,完全依赖于构造函数,所以问题出在你如何将这个类构造以及如何显示的地方吧。是不是在重新构造另一个RightsTable 的时候,你所按的按钮仍旧是上一个RightsTable 的实例中的JButton 呢?
      

  5.   

    不是,重新构造另一个RightsTable 的时候,所按的按钮不属于RightsTable类.
      

  6.   

    我想这是因为你在构造新的RightsTable时,没有替换掉原先的RightTable,也就是重新加入面板一次,因为你虽然更新了变量 jRightsPanel ,实际上面板上的还是没有更新的.
    所以按下按钮才会一直出现"111"
      

  7.   

    可是我已经更新了面板呀!
    jRightsPanel = new RightsTable(in[0],nFlag);
    jPanelRight.add(jRightsPanel,BorderLayout.CENTER);
    jRightsPanel.setVisible(true);
    jRightsPanel.updateUI();我还要怎么做呢?
      

  8.   

    这也就是我说的,按的按钮是属于上一个RightsTable 实例中的JButton 的情况。 :)
      

  9.   

    先用Container 的remove(Component comp) 方法将上一个RightsPanel 删除掉后,再 add 新的RightsPanel。
      

  10.   

    那我如何才能把上一个实例给弄掉呢?
    Java没有c++那样的析构函数呀.
      

  11.   

    真是太麻烦你了wolfsquare大哥,
    我再试试,实在不行的话,再把代码发给你.
    前一段时间忙了点别的事情,这段程序编了这么长还没有完成,真是不好意思啊!呵呵.
      

  12.   

    wolfsquare,luodi,搞定了!
    按照你们的建议,我重新加了一遍Panel:
    if (jRightsPanel != null)
        jPanelRight.remove(jRightsPanel);jRightsPanel = new RightsTable(in[0],nFlag);
    jPanelRight.add(jRightsPanel,BorderLayout.CENTER);
    jRightsPanel.setVisible(true);
    jRightsPanel.updateUI();
    jPanelRight.updateUI();果然就好了!
    多谢wolfsquare和luodi!!!
    wolfsquare大哥最近工作很忙吧?祝一切顺利,顺利,再顺利!