2011-06-14 123 views
0

我有一个Applet类(扩展JApplet)。在类内部,我实例化一个JPanel并初始化一个JButton对象setEnabled(true)。在用户点击Panel中的这个按钮并做了一些处理之后,我调用了JPanel中的一个方法来更新面板。然后我做了setEnabled(false)点击JPanel上的按钮。Java Swing刷新JPanel

但是,在主面板上调用add(ScrollPane)之后,JPanel不能正确“刷新”。在处理并设置JButton未启用(并且我确认了正确的数据存在等)之后,JPanel仍处于初始化形式。

换句话说,我需要做什么才能在applet中的JPanel上调用add(JScrollPane)实际刷新Panel?

基本上我想知道:如果更新嵌套在JApplet内部的swing组件内的面板,应该更新可见吗?如果不是,需要做些什么来刷新?

这是代码:

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

你能分享你的代码吗? – 2011-06-14 10:12:56

+0

“我需要做什么以便在applet中的JPanel上调用add(JScrollPane)实际刷新Panel?”在应用程序中完全一样的东西。小程序不适用于新手。 BTW 1)'JPanel' /'Panel'要么使用正确的类名,要么不要将Swing与AWT混合使用。 2)为了更快地获得更好的帮助,请发布[SSCCE](http://pscode.org/sscce.html)。 – 2011-06-14 10:24:27

+0

我需要做什么以便在applet中的JPanel上调用add(JScrollPane)实际刷新JPanel? – Satisfaction 2011-06-14 10:31:26

回答

1

首先,你不应该打开动作中的连接。使用SwingWorker或其他执行程序来执行此操作。

其次,尝试在添加滚动窗格后调用面板上的revalidate()。这两个修复程序应该可以解决问题。

+0

谢谢!我正在使用SwingWorker,现在它工作! :) – Satisfaction 2011-06-15 14:29:18