【问题标题】:Java Jprogressbar in Jtable not working properlyJtable 中的 Java Jprogressbar 无法正常工作
【发布时间】:2014-11-16 00:31:12
【问题描述】:

我的 Jprogressbar 工作异常,我已将 jprogress 放在 Jtable 列中,现在我面临的问题是,如果我们不触摸进度条,它可以正常工作,但是如果我们点击任何一行,所有 3 个进度条都会改变当前正在运行的进度条的状态。

I am calling the following code
clsDownload(URLtoDownload,i,"file" + i ,JTable);

In clsDownload class, i am downloading file and also updating the progressbar, using 
 jTbl1.getModel().setValueAt(((int) dPercent)+"%", Loc, 1);

现在从这段代码中,如果我们点击任何 Jtable 行,它也会更新另一个进度条。

这是有问题的完整代码

public class ProgressCellRenderer extends JProgressBar
                        implements TableCellRenderer {

  /**
   * Creates a JProgressBar with the range 0,100.
   */
  public ProgressCellRenderer(){
    super(0, 100);
    setValue(0);
    setString("0%");
    setStringPainted(true);
  }

  public Component getTableCellRendererComponent(
                                    JTable table,
                                    Object value,
                                    boolean isSelected,
                                    boolean hasFocus,
                                    int row,
                                    int column) {

    //value is a percentage e.g. 95%
    final String sValue = value.toString();
    int index = sValue.indexOf('%');
    if (index != -1) {
      int p = 0;
      try{
        p = Integer.parseInt(sValue.substring(0, index));
      }
      catch(NumberFormatException e){
      }

      setValue(p);
      setString(sValue);
    }
    return this;
  }
}





public class clsDownload  implements Callable<String> {

    private String fileURL;
    private String localFileName;
    private JTable jTbl1;
    private int Loc;
    clsDownload(String UrlName, int Jobpos, String lFileName, JTable tbl1)
    {
        try
        {

           fileURL = UrlName;
          localFileName = lFileName;
          jTbl1 = tbl1;  
          Loc= Jobpos;
        }
        catch (Exception e)
        {

        }
    }

    @Override
   public String call() throws MalformedURLException, IOException 
    {
        try
        {               

                         OutputStream out = null;
                        URLConnection conn = null;
                        InputStream in = null;
                        URL url = new URL(fileURL);
                        HttpURLConnection connection = (HttpURLConnection) url.openConnection();

                        connection.connect();
                         BufferedOutputStream bout;
                        FileOutputStream fos;
                        Map<String,List<String>> hf  = connection.getHeaderFields();
                        long ReceivedFlength =0;
                         double dPercent = 0;
                        //Check receiving file length
                        String searchKey = "Content-Length";
                        long downloaded =0;  //initilze to 0 so that it dont take old value from above

                            in = new BufferedInputStream(connection.getInputStream());
                            fos=(downloaded==0)? new FileOutputStream(localFileName): new FileOutputStream(localFileName,true);
                            bout = new BufferedOutputStream(fos, 1024);
                            byte[] data = new byte[1024];
                            int x = 0;
                             if(hf.containsKey(searchKey))
                        ReceivedFlength = Long.parseLong(hf.get(searchKey).get(0));
                            //  progressBar = (JProgressBar)jTbl1.getComponent(8);
                            while ((x = in.read(data, 0, 1024)) >= 0 ) 
                            {
                               bout.write(data, 0, x);
                                downloaded += x;
                                //Display file download progress 
                                 dPercent =  (downloaded*100)/ReceivedFlength;
                                  if(dPercent > 1)
                                  {

                                   jTbl1.getModel().setValueAt(((int) dPercent)+"%", Loc, 1);
                                  }
                            }
        return "Completed";
        }
        catch(Exception e)
        {
        return "error";    
        }

     }
}



private void btnLoadActionPerformed(java.awt.event.ActionEvent evt) {                                        

        tblFilestoDownload.setModel(new DownloadTable());
         DownloadTable tblSelectedItem = (DownloadTable) tblFilestoDownload.getModel();
         final TableColumn myCol = tblFilestoDownload.getColumnModel().getColumn(1);

             myCol.setCellRenderer(new ProgressCellRenderer());
        tblSelectedItem.insertData(new Object[]{"http://releases.ubuntu.com/14.04.1/ubuntu-14.04.1-server-amd64.iso",new JProgressBar(0,100)});
        tblSelectedItem.insertData(new Object[]{"http://ports.ubuntu.com/ubuntu-ports/dists/precise-updates/main/installer-armhf/current/images/armadaxp/netboot/uImage",new JProgressBar(0,100)});
        tblSelectedItem.insertData(new Object[]{"http://releases.ubuntu.com/14.04.1/ubuntu-14.04.1-server-amd64.iso",new JProgressBar(0,100)});
        tblSelectedItem.insertData(new Object[]{"http://releases.ubuntu.com/14.04.1/ubuntu-14.04.1-server-amd64.iso",new JProgressBar(0,100)});


    }                                       

    private void btnStartActionPerformed(java.awt.event.ActionEvent evt) {                                         
       DoItWorker worker = new DoItWorker();
        worker.execute();
    }                                        


    class DoItWorker extends SwingWorker<Void, String> 
{
   public static final String INTERMEDIATE_RESULT = "intermediate result";
   private static final long TIME_OUT = 5;
   private  final TimeUnit UNIT = TimeUnit.MINUTES;

   private String intermediateResult;
   private ExecutorService executor;
   private CompletionService<String> completionService;

   public DoItWorker() {
      executor = Executors.newFixedThreadPool(1);
      completionService = new ExecutorCompletionService<>(executor);
   }

   @Override
   protected Void doInBackground() throws Exception {
      for (int i = 0; i < tblFilestoDownload.getModel().getRowCount()-1; i++) {


         Callable<String> callable = new clsDownload(tblFilestoDownload.getValueAt(0, i).toString(),i,"file" + i ,tblFilestoDownload);
         completionService.submit(callable);
      }
      executor.shutdown();
      for (int i = 0; i < tblFilestoDownload.getModel().getRowCount() -1 ; i++) {
         String result = completionService.take().get();
         publish(result);
         int progress = (100 * i) / tblFilestoDownload.getModel().getRowCount();
         setProgress(progress);
      }
      executor.awaitTermination(TIME_OUT, UNIT);
      setProgress(100);
      return null;
   }

你能帮我吗,我做错了什么,为什么当我们点击 jtable 的任何一行时,所有的进度条都会更新。

谢谢

【问题讨论】:

  • 考虑提供一个runnable example 来证明您的问题。这将导致更少的混乱和更好的响应
  • 请提供可运行代码。
  • 对我来说似乎工作得很好,一定是你没有向我们展示的东西
  • 好的,我正在输入有错误的完整工作代码
  • 在 Number 存储在 XxxTableModel 中(避免解析)的情况下,Renderer 中的代码可能是正确的(加减城巴)

标签: java swing jtable jprogressbar tablecellrenderer


【解决方案1】:

问题在于 TableCellRenderer 旨在为尽可能多的单元重用其(单个)组件getTableCellRendererComponent,以优化资源。

所以组件不应该是有状态的,至少在getTableCellRendererComponent 中设置它的完整状态。 (因此提供了所有状态:isSelected、hasFocus。)

@Override
public Component getTableCellRendererComponent(JTable table, Object value,
                     boolean isSelected, boolean hasFocus, int row, int column) {
    // value is a percentage e.g. 95%
    final String sValue = value.toString();
    int p = 0;
    int index = sValue.indexOf('%');
    if (index != -1) {
        try {
            p = Integer.parseInt(sValue.substring(0, index));
        }
        catch(NumberFormatException e) {
        }
    }
    // Always set full state:
    setValue(p);
    setString(sValue);
    return this;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 2017-05-15
    • 1970-01-01
    • 2017-01-04
    • 2013-03-14
    相关资源
    最近更新 更多