如何正确使用jprogressbar

62o28rlo  于 2021-06-30  发布在  Java
关注(0)|答案(0)|浏览(117)

我试图开发一个按钮上的函数,读取excel文件,并生成一个自定义格式的.txt文件。
我的问题是,我希望数据的逐行加载显示在jprogressbar中,也希望在jlabel中显示当前从excel文件中读取的代码的名称,整个函数正确运行,但bar和jlabel都不会实时更新,当生成.txt时,只填充条形图,而jlabel只显示最后一条记录。
我用过这个函数 Thread.sleep(5*1000); 在excel文件的行之间暂停函数5秒,因为文件只包含5行和4列,所以由于进程的速度,它不会显示在屏幕上,但是尽管暂停中有暂停,但栏和jlabel都不会更新。
我留下了生成这个的代码:
我正在使用的库:
公共集合4-4.3
通用压缩1.18
poi-4.1.0标准
poi-ooxml-4.1.0版本
poi-ooxml-schemas-4.1.0版本
xmlbeans-3.1.0版本
以防excel文件的内容是:
例子
我留下完整的函数,在其中读取列并生成流程:

jProgressBar1.setMaximum(5);

    List<String> columnas = Arrays.asList("Name", "Size", "Type", "Condition");

    Map<String, Integer> mapNombresColumnas = new HashMap<>();

    final int filaNombresColumnas = 0;

     JFileChooser chooser = new JFileChooser(); 
     FileNameExtensionFilter filter = new FileNameExtensionFilter("Excel files", "xlsx"); 
     chooser.setFileFilter(filter); 
     chooser.setDialogTitle("Open file"); 
     chooser.setAcceptAllFileFilterUsed(false);

     if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION){ 
        String ruta1 = chooser.getSelectedFile().toString();//.concat(".xlsx"); 

        File archivoXLSX = new File(ruta1); 

        try {

            XSSFWorkbook libro = new XSSFWorkbook(archivoXLSX);

            org.apache.poi.ss.usermodel.Sheet sheet = libro.getSheetAt(0);

            Row filaNombresColumna = sheet.getRow(filaNombresColumnas);

            Iterator<Row> rowIterator = sheet.iterator();
            Row row;
            row=filaNombresColumna;

            row.cellIterator().forEachRemaining(cell -> {

                String valorCelda = cell.getStringCellValue().trim();
                if (!valorCelda.isEmpty()) {
                    mapNombresColumnas.put(valorCelda, cell.getColumnIndex());
                }
            });

            int indiceDatos = filaNombresColumnas + 1;
            Row filaDatos = null;

            int cont1 = 0, cont2 = 0;

            int conteo = 1;

            FileWriter fichero = new FileWriter("C:/Test/Result.txt");

            fichero.write("Results");
            fichero.write("\r\n");

            while ((filaDatos = sheet.getRow(indiceDatos++)) != null) {

                cont1++; cont2=0; 

                jProgressBar1.setValue(jProgressBar1.getValue() + 1);

                Thread.sleep(5*1000);

                String Text = "inicio"; 

                int cont = 1;

                for (String col : columnas) {

                    cont2++;

                    Cell celda = filaDatos.getCell(mapNombresColumnas.get(col));

                    if(celda == null){

                        Text = Text +"|Ninguno";

                    }else{

                        switch(celda.getCellType()){

                            case STRING:

                                String texto = celda.getStringCellValue();
                                //System.out.println(texto);

                                Text = Text + "|" + texto;

                            break;

                            case BLANK:

                                Text = Text + "|";

                            break;     

                            case NUMERIC:

                                int numero = (int) celda.getNumericCellValue(); 
                                String numeroString = Integer.toString(numero); 
                                Text = Text + "|" + numeroString;

                            break;

                            case FORMULA:

                                switch(celda.getCachedFormulaResultType()){

                                    case NUMERIC:

                                        int numero2 = (int) celda.getNumericCellValue(); 
                                        String numeroString2 = Integer.toString(numero2); 
                                        Text = Text + "|" + numeroString2;

                                    break;

                                    case STRING:

                                        texto = celda.getStringCellValue();
                                        Text = Text + "|" + texto;

                                    break;

                                }

                            break;

                            case _NONE:

                                System.out.println("NONE");

                            break;

                            default:

                                System.out.println("nulo!!!");

                            break;
                        }

                    }

                }

                String Array[] = Text.split("\\|");

                System.out.println(Text);

                if(!Array[1].equals("Ninguno") && !Array[2].equals("Ninguno")){  

                    jLabel1.setText(Array[1]);

                    String conteoString = Integer.toString(conteo);
                    String conteoformateado = String.format("%14s", conteoString).replace(' ','0');

                    fichero.write("Start+"+ conteoformateado +"+ISSDG10");  
                    fichero.write("\r\n");

                    if(Array[4].equals("DMG") ||
                       Array[4].equals("dmg") ||
                       Array[4].equals("inoperativo") ||
                       Array[4].equals("INOPERATIVO") ||
                       Array[4].equals("inop") ||
                       Array[4].equals("INOP")){

                        fichero.write("Fail+999");

                    }else{

                        fichero.write("Got+34");

                    }

                    fichero.write("\r\n");
                    fichero.write("Free+20++1++++");
                    fichero.write("\r\n");
                    fichero.write("LOCAL+9+");
                    fichero.write("\r\n");
                    fichero.write("INF+"+Array[1]+"+"+Array[2]+Array[3]+"+4");
                    fichero.write("\r\n");
                    fichero.write("C+10+"+conteoformateado);
                    fichero.write("\r\n");

                    conteo ++;

                }

                if(Array[1].equals("Ninguno") || Array[2].equals("Ninguno")){

                    cont1--; 

                }

            }

            System.out.println("\r\n " + cont1 +"\r\n" + cont2); 

            fichero.close();

            JOptionPane.showMessageDialog(null, "Generate.");

        } catch (org.apache.poi.openxml4j.exceptions.InvalidFormatException ex) {

            JOptionPane.showMessageDialog(null, "Error");

        } catch (IOException ex) {

            Logger.getLogger(jProgressBar.class.getName()).log(Level.SEVERE, null, ex);

        } catch (InterruptedException ex) {
            Logger.getLogger(jProgressBar.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

我正在测试swingutilities,这似乎是解决这个问题的方法,但目前我无法将其正确应用于我的代码,我修改了以下代码行:

cont1++; cont2=0; 

                final int percent = cont1;

                 try {
                SwingUtilities.invokeLater(new Runnable() {
                  public void run() {
                    updateBar(percent);
                  }
                });
                Thread.sleep(5*1000);
              } catch (InterruptedException e) {
              }

这个 updateBar 功能:

public void updateBar(int newValue) {
    jProgressBar1.setValue(newValue);
  }

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题