2011-06-14 2 views
0

나는 애플릿 클래스 (extend JApplet)를 가지고있다. 클래스 안에서 나는 JPanel을 인스턴스화하고 JButton whit을 초기화하고있다 setEnabled(true). 사용자가 패널에서이 버튼을 클릭하고 몇 가지 처리를 수행 한 후에 JPanel 내부의 메소드를 호출하여 패널을 업데이트합니다. 그런 다음 setEnabled(false) 버튼을 JPanel에서 클릭합니다.자바 스윙 새로 고침 JPanel

그러나 메인 패널에서 add(ScrollPane)을 호출하면 JPanel이 올바르게 "새로 고침"되지 않습니다. 처리 후 JButton을 활성화하지 않은 상태로 설정하면 (그리고 올바른 데이터가 있는지 확인한 후) JPanel은 여전히 ​​초기화 된 형태로 유지됩니다.

즉, 애플릿 내의 JPanel에서 add(JScrollPane)을 호출하면 실제로 패널이 새로 고쳐지기 때문에 무엇이 필요합니까?

기본적으로 궁금하네요. JApplet 내부에 중첩 된 스윙 구성 요소 내부의 패널을 업데이트하면 업데이트가 표시되어야합니까? 그렇지 않으면 새로 고침하기 위해 수행해야 할 작업은 무엇입니까?

public void actionPerformed(ActionEvent e) { 
    String command = e.getActionCommand(); 

    if (STAMPA_COMMAND.equals(command)) { 

     stampa.setEnabled(false); 
     JPanel areaPrint = new JPanel(); 
     JLabel lab = new JLabel("Wait Printing..."); 
     areaPrint.setBackground(Color.magenta); 
     areaPrint.add(lab); 
     scrollArea.getViewport().add(areaPrint); // THIS IS THE PROBLEM...THE CHANGE ARE NOT REFRESHED 

     try { 
      PrintPdf printPDFFile; 
      ArrayList assegniDaStampare = new ArrayList(); 

      for (int i = 0; i < assegni.size(); i++) { 
       DatiAssegno datiAss = (DatiAssegno) assegni.get(i); 

       if (datiAss != null && datiAss.getStatoAssegno().equals(STATUS_OK)) { 
        printPDFFile = new PrintPdf("Stampa Assegni", datiAss); 

        printPDFFile.print(); 

        String servletLocation = "http://localhost/Servlet"; 

        //   connect to the servlet 

        URL studentDBservlet = new URL(servletLocation); 
        URLConnection servletConnection = studentDBservlet.openConnection(); 
        servletConnection.setUseCaches(false); 
        servletConnection.setDefaultUseCaches(false); 
        servletConnection.setDoInput(true); 
        servletConnection.setDoOutput(true); 

        OutputStream outstream = servletConnection.getOutputStream(); 
        ObjectOutputStream oos = new ObjectOutputStream(outstream); 
        oos.writeObject(datiAss.idAssegno); 
        oos.flush(); 
        oos.close(); 

        ObjectInputStream inputFromServlet = new ObjectInputStream(servletConnection.getInputStream()); 
        try { 
         String statusSave = (String) inputFromServlet.readObject(); 
        } catch (ClassNotFoundException e4) { 
         e4.printStackTrace(); 
        } 
       } 
      } 
      JPanel areaPrint2 = new JPanel(); 
      JLabel lab2 = new JLabel("Print Complete"); 
      areaPrint2.setBackground(Color.green); 
      areaPrint2.add(lab2); 
      scrollArea.getViewport().add(areaPrint2); 
     } catch (FileNotFoundException e1) { 
      //do something 
     } catch (IOException e2) { 
      //do something 
     } catch (PrinterException e3) { 
      //do something 
     } 
    } 
    if (EXIT_COMMAND.equals(command)) { 
     JSObject win = JSObject.getWindow(appletParent); 
     appletParent.stop(); 
     appletParent.destroy(); 
     win.eval("self.close()"); 
    } 
} 
+0

코드를 공유 할 수 있습니까? –

+0

"애플릿 내의 JPanel에 add (JScrollPane)를 호출하면 실제로 Panel이 새로 고쳐지기 때문에 무엇을해야합니까?" 애플리케이션에서 똑같은 일을 할 것입니다. 애플릿은 초보자 용이 아닙니다. BTW 1)'JPanel' /'Panel'은 올바른 클래스 이름을 사용하거나 Swing과 AWT를 섞지 않습니다. 2) 더 빨리 도움을 받으려면 [SSCCE] (http://pscode.org/sscce.html)를 게시하십시오. –

+0

애플릿 내의 JPanel에서 add (JScrollPane)를 호출하면 실제로 JPanel이 새로 고쳐지기 때문에 어떻게해야합니까? – Satisfaction

답변

1

첫째로, 당신이 조치 내에서 연결을 여는해서는 안 :

는 코드입니다. SwingWorker 또는 다른 실행 프로그램을 사용하여이를 수행하십시오.

두 번째로 스크롤 패널을 추가 한 후 패널에서 revalidate()를 호출 해보십시오. 이 두 가지 수정 사항으로 문제가 해결됩니다.

+0

감사합니다! 저는 SwingWorker를 사용하고 있습니다. :) – Satisfaction

관련 문제