2012-07-11 51 views
2

我遇到问题。我正在从套接字读取数据,并且当我向应用程序读取一些有意义的数据时,我调用一个方法来重新绘制我想要的swing对象的屏幕。这种方法除了有时不会出现的情况外都可以正常工作。在第一次调用该方法时屏幕上没有任何东西(我已经运行了调试,并通过了该方法)。愚蠢的部分是,如果我最小化和最大化应用程序,它再次正常工作。此外,如果方法再次执行,它可以正常工作。我将代码放在这里只是为了文档:摆动方法错误

public void GraphicONENodeJoined (Nodes NodesList) 
{ 
    SensorsMapGraf [] sensorsMap; 
    boolean FLAG; 
    int ymin=0, ymax=30; 
    FLAG = TabExistingNode_NEW_nodeRefresh (NodesList); 
    if (FLAG) 
    { 
     ValorTeste++; 
     if (ValorTeste > 1) 
     { 
      String [] s = new String[ValorTeste]; 
      JButton [] jbb = new JButton[ValorTeste]; 
      JCheckBox [] ch = new JCheckBox[ValorTeste]; 
      for (int i=0 ; i < ValorTeste-1 ; i++) 
      { 
       s[i] = nods[i]; 
       jbb[i] = jb[i]; 
       ch[i] = CheckBoxNodes[i];  
      } 
      jb = new JButton[ValorTeste]; 
      CheckBoxNodes = new JCheckBox[ValorTeste]; 
      nods = new String[ValorTeste]; 

      for (int i=0 ; i < ValorTeste ; i++) 
      { 
       nods[i] = s[i]; 
       jb[i] = jbb[i]; 

       CheckBoxNodes[i] = ch[i]; 
      }  
     } 

      nods[ValorTeste-1]+= NodesList.GETSourceNodeID(); 
      //PARA FAZER O UPDATE DAS TABS E DOS GRÁFICOS 
      JPanel meio = new JPanel();   //JPanel que contem os graficos de cada sensor 

      String s = new String(); 
      s += NodesList.GETSourceNodeID(); 

      JPanel meio_cima = new JPanel(); //JPanel que contem o botão view (permitirá escolher quais os sensores a ver) 
      meio_cima.setAlignmentX(LEFT_ALIGNMENT); 
      meio_cima.setPreferredSize(new Dimension(dim.width, 25)); 
      meio.setBounds (pan1.getBounds()); 
      GridBagLayout g = new GridBagLayout(); 
      GridBagConstraints c = new GridBagConstraints(); 

      meio.setLayout(g); 
      meio.setOpaque(true); 
      //botão view (permitirá escolher quais os sensores a ver) 
      jb[nods.length-1] = new JButton("View"); 
      jb[nods.length-1].setPreferredSize(new Dimension(100,20)); 
      jb[ValorTeste -1].addActionListener(this); 
      meio_cima.add(jb[ValorTeste-1]); 
      //Panel qu albergará o panel meio e o panel meio_cima 
      JPanel principal = new JPanel(); 
      //inicia o array de sensores que cada Tab tem de mostrar 
      sensorsMap = new SensorsMapGraf[NodesList.GETnumSensoresActivos()]; 

      int indice = 0; 
      for (int j=0 ; j < 12 ; j++) 
      { 
       //nicely to view in the graphics 
       if ((j == 0) || (j == 1) || (j == 2) || (j == 3) || (j == 6) || (j == 7)) 
       { 
        ymin = 0; 
        ymax = 3; 
       } 
       if (j == 8) 
       { 
        ymin = 0; 
        ymax = 100; 
       } 
       if (j == 9) 
       { 
        ymin = 0; 
        ymax = 100; 
       } 
       if (j == 10) 
       { 
        ymin = 0; 
        ymax = 4; 
       } 
       if (j == 11) 
       { 
        ymin = 0; 
        ymax = 130; 
       } 
       if (j == 4) 
       { 
        ymin = 0; 
        ymax = 6000; 
       } 
       if (j == 5) 
       { 
        ymin = 0; 
        ymax =700; 
       } 

       if (NodesList.GETSensores(j).GETligado()) // se estiver ligado 
       { 
        //panel que albergará o grafico 
        JPanel p = new JPanel(); 
        p.setBounds(meio.getBounds()); 

        if (NodesList.GETnumSensoresActivos() <= 4) 
        { 
         if (NodesList.GETnumSensoresActivos() <= 4 && NodesList.GETnumSensoresActivos() > 1) 
          sensorsMap[indice] = new SensorsMapGraf(true,NodesList.GETSensores(j).GETnome(),NodesList.GETSensores(j).GETunidade(),meio.getBounds(),(int)meio.getWidth()/2-20,(int)meio.getHeight()/2-20,ymin,ymax); // cria o sensor 
         else 
          sensorsMap[indice] = new SensorsMapGraf(true,NodesList.GETSensores(j).GETnome(),NodesList.GETSensores(j).GETunidade(),meio.getBounds(),(int)meio.getWidth()/NodesList.GETnumSensoresActivos(),(int)meio.getHeight()/NodesList.GETnumSensoresActivos()-35,ymin,ymax); // cria o sensor 
        } 

        if (NodesList.GETnumSensoresActivos() > 4 && NodesList.GETnumSensoresActivos() <= 8) 
         sensorsMap[indice] = new SensorsMapGraf(true,NodesList.GETSensores(j).GETnome(),NodesList.GETSensores(j).GETunidade(),p.getBounds(),(int)meio.getWidth()/4-15,(int)meio.getHeight()/2 - 45,ymin,ymax); // cria o sensor 

        if (NodesList.GETnumSensoresActivos() > 8 && NodesList.GETnumSensoresActivos() <= 12) 
         sensorsMap[indice] = new SensorsMapGraf(true,NodesList.GETSensores(j).GETnome(),NodesList.GETSensores(j).GETunidade(),p.getBounds(),(int)meio.getWidth()/4-20,(int)meio.getHeight()/3-35,ymin,ymax); // cria o sensor 

         if (indice == 0) 
         { 
          c.fill = GridBagConstraints.HORIZONTAL; 
          c.gridx = 0; 
          c.gridy = 0; 
          meio.add(sensorsMap[indice].GetGraph().GETDemoPanel(),c); //adidionar o panel p ao panel meio 
         } 
         if (indice == 1) 
         { 
          c.fill = GridBagConstraints.HORIZONTAL; 
          c.gridx = 1; 
          c.gridy = 0; 
          meio.add(sensorsMap[indice].GetGraph().GETDemoPanel(),c); //adidionar o panel p ao panel meio 
         } 
         if (indice == 2) 
         { 
          c.fill = GridBagConstraints.HORIZONTAL; 
          if (NodesList.GETnumSensoresActivos() <= 4) 
          { 
           c.gridx = 0; 
           c.gridy = 1; 
          } 
          else 
          { 
           c.gridx = 2; 
           c.gridy = 0; 
          } 
          meio.add(sensorsMap[indice].GetGraph().GETDemoPanel(),c); //adidionar o panel p ao panel meio 
         } 
         if (indice == 3) 
         { 
          c.fill = GridBagConstraints.HORIZONTAL; 
          if (NodesList.GETnumSensoresActivos() > 4) 
          { 
           c.gridx = 3; 
           c.gridy = 0; 
          } 
          else 
          { 
           c.gridx = 1; 
           c.gridy = 1; 
          } 
          meio.add(sensorsMap[indice].GetGraph().GETDemoPanel(),c); //adidionar o panel p ao panel meio 
         } 
         if (indice == 4) 
         { 

          c.fill = GridBagConstraints.HORIZONTAL; 
          c.gridx = 0; 
          c.gridy = 1; 
          meio.add(sensorsMap[indice].GetGraph().GETDemoPanel(),c); //adidionar o panel p ao panel meio 
         } 
         if (indice == 5) 
         { 
          c.fill = GridBagConstraints.HORIZONTAL; 
          c.gridx = 1; 
          c.gridy = 1; 
          meio.add(sensorsMap[indice].GetGraph().GETDemoPanel(),c); //adidionar o panel p ao panel meio 
         } 
         if (indice == 6) 
         { 
          c.fill = GridBagConstraints.HORIZONTAL; 
          c.gridx = 2; 
          c.gridy = 1; 
          meio.add(sensorsMap[indice].GetGraph().GETDemoPanel(),c); //adidionar o panel p ao panel meio 
         } 
         if (indice == 7) 
         { 
          c.fill = GridBagConstraints.HORIZONTAL; 
          c.gridx = 3; 
          c.gridy = 1; 
          meio.add(sensorsMap[indice].GetGraph().GETDemoPanel(),c); //adidionar o panel p ao panel meio 
         } 
         if (indice == 8) 
         { 
          c.fill = GridBagConstraints.HORIZONTAL; 
          c.gridx = 0; 
          c.gridy = 2; 
          meio.add(sensorsMap[indice].GetGraph().GETDemoPanel(),c); //adidionar o panel p ao panel meio 
         } 
         if (indice == 9) 
         { 
          c.fill = GridBagConstraints.HORIZONTAL; 
          c.gridx = 1; 
          c.gridy = 2; 
          meio.add(sensorsMap[indice].GetGraph().GETDemoPanel(),c); //adidionar o panel p ao panel meio 
         } 
         if (indice == 10) 
         { 
          c.fill = GridBagConstraints.HORIZONTAL; 
          c.gridx = 2; 
          c.gridy = 2; 
          meio.add(sensorsMap[indice].GetGraph().GETDemoPanel(),c); //adidionar o panel p ao panel meio 
         } 
         if (indice == 11) 
         { 
          c.fill = GridBagConstraints.HORIZONTAL; 
          c.gridx = 3; 
          c.gridy = 2; 
          meio.add(sensorsMap[indice].GetGraph().GETDemoPanel(),c); //adidionar o panel p ao panel meio 
         } 
        indice++; 
       } 
      } 

      //adicionar o meio_cima e o meio panel principal 
      principal.add(meio_cima); 
      principal.add(meio); 

      Tabs.addTab(s, principal); // adicionar tab 
      String ss = new String(); 
      ss += NodesList.GETSourceNodeID(); 

      GraphicsMap.add(new CentralMap(ValorTeste-1, ValorTeste-1, sensorsMap,ss,NodesList.GETLogicalNodeID())); // adição de uma Tab 
      GraphicsMap.get(ValorTeste-1).SetnumSensorsToShow(NodesList.GETnumSensoresActivos()); 

      posx = 20; 
      posy = 20; 

      CheckBoxNodes[ValorTeste-1] = new JCheckBox(s); 
      CheckBoxNodes[ValorTeste-1].setBackground(null); 
      CheckBoxNodes[ValorTeste-1].setLayout(new GridLayout(ValorTeste, 1, 0, 30)); 
      CheckBoxNodes[ValorTeste-1].setBounds(posx, posy, aux1-60, 30); 
      CheckBoxNodes[ValorTeste-1].setSelected(false); 
      CheckBoxNodes[ValorTeste-1].setOpaque(true); 
      CheckBoxNodes[ValorTeste-1].setVisible(true); 

      //Evento a tratar 
      CheckBoxNodes[ValorTeste-1].addItemListener (this); 

      pan3.add (CheckBoxNodes[ValorTeste-1]); 
      pan1.add (Tabs); 
    } 
    } 

我已经尝试重画pan2但它没有做任何事情。

在此先感谢

+0

考虑发布[SSCCE](SSCCE.org)。 – 2012-07-11 15:47:35

回答

4

你张贴了很多的这些代码完全无关的问题,混乱的代码,但它听起来好像你可能有一个Swing的并发性问题。一定要读取后台线程中的数据以及写入Swing事件线程或EDT上的Swing组件。尽管如此,为了更好的帮助,发布与问题相关的代码。 sscce将工作得最好。

此外,如果在GUI中添加或删除组件,请务必在容器上调用revalidate(),然后在repaint()上调用revalidate()

+1

+1,如果可能的话,调用invalidate(jcomponent我认为)。重新打印请求将保证重新返回到ETD,但使用SwingUtilities.invokeLater – MadProgrammer 2012-07-11 18:05:25

+0

是一个很好的做法。哼,也许是缺少的重新验证。我会尝试..当然;) – 2012-07-12 13:54:50