2013-03-06 5 views
0

Как обновить jLabel в цикле while? Мое понимание заключается в использовании javax.swing.timer, однако я не совсем понимаю его, потому что мне нужно также выполнить действие, теперь это в цикле while, который должен обновлять счетчик каждый раз, когда он проходит через цикл while.Как обновить jLabel в цикле while

Есть ли более простой способ сделать это, и если да, то что я должен использовать вместо jLabel?

Пример кода ниже того, что мне нужно обновить.

int rowCount = 0; 
    while(rowIterator.hasNext()) 
    { 


     jLabel5.setText(""+ rowCount); //<-- i need this to update 
     myRow = sheet.getRow(count); 
     cellIterator = myRow.cellIterator(); 
     Cell myCell2 = myRow.getCell(0); 
     nextCell= myCell2.getStringCellValue(); 


     if(nextCell.equals(firstCell)) 
     { 

      while(cellIterator.hasNext()) { 

          Cell cell = cellIterator.next(); 

          switch(cell.getCellType()) { 
           case Cell.CELL_TYPE_BOOLEAN: 
            System.out.print(cell.getBooleanCellValue() + "\t\t"); 
            break; 
           case Cell.CELL_TYPE_NUMERIC: 
            cell.setCellType(Cell.CELL_TYPE_STRING); 

            System.out.print(cell.getStringCellValue()+","); 

            //System.out.print(cell.getStringCellValue() + "\t\t"); 
            writer.write(cell.getStringCellValue()+","); 
            break; 
           case Cell.CELL_TYPE_STRING: 
            System.out.print(cell.getStringCellValue()+","); 
            //System.out.print(cell.getStringCellValue() + "\t\t"); 
            writer.write(cell.getStringCellValue()+","); 
            break; 
          } 
         } 
      System.out.println(); 
      writer.newLine(); 
      count++; 
      rowCount++; 



     } 
     else 
     {   

      writer.close(); 
      myRow = sheet.getRow(count); 
      myCell2= myRow.getCell(0); 
      nextCell=myCell2.getStringCellValue(); 
      firstCell=nextCell; 
      Matter = "Matter Number: "+firstCell; 
      num = firstCell; 
      System.out.println(Matter); 
      fWriter = new FileWriter(new File(directory, num+"_"+curdate+"_"+curtime+".csv")); 
      writer = new BufferedWriter(fWriter); 
      writer.write(Matter); 
      writer.newLine(); 
      writer.write(header); 
      writer.newLine(); 
     } 


    } 
} 
catch (Exception e) 
{ 
} 

ответ

3

Проблема у вас есть свинг является однопоточен enironment. То есть, существует один поток, ответственный за отправку всех событий и обработку всех запросов на перерисовку.

Все, что вы делаете, блокирует эту тему, не позволит ей обновлять пользовательский интерфейс (или отвечать на новые события), делая ваш пользовательский интерфейс похожим на то, что он висел.

Другая проблема заключается в том, что все обновления пользовательского интерфейса должны выполняться только в контексте этого потока (вы не должны пытаться обновлять пользовательский интерфейс из другого потока).

В вашем случае javx.swing.Timer не поможет, поскольку таймер «галочки» с регулярным интервалом, вам нужно что-то, что вы можете использовать, чтобы перезвонить в EDT для выполнения необходимых обновлений.

В этом случае, я предлагаю вам использовать SwingWorker

Вы можете посмотреть на

Для некоторых примеров и идей

0

Если вы хотите, чтобы показать все значения, то

String temp = ""; 
while(i < 100) { 
    temp += "" + i; 
    jLabel1.setText(temp); 
    i++; 
} 

Если вы хотите, чтобы показать последнее значение, то просто показать содержание

while(i < 100) { 
    jLabel1.setText(i); 
    i++; 
} 
+1

Это не собирается работать, он собирается заблокировать ED T и не позволять ему обрабатывать любые запросы на перерисовку до тех пор, пока не будет существовать цикл (и метод, в котором он содержится) – MadProgrammer

+0

Это невозможно, в основном, что я пытался сделать, должен быть какой-то сон, насколько я чтобы текст обновлялся в цикле. Например, каждый раз, когда цикл проходит, текст должен изменяться в jLable, поэтому для int он должен буквально показывать счет, происходящий на ярлыке. – Silentdarkness

+0

Итак, вы вызываете 'setText', он помещает запрос в EDT для обновления пользовательского интерфейса и некоторое время в будущем, но в то же время вы продолжаете цикл, не позволяя EDT обрабатывать этот запрос и переписывать его. Хуже того, вы предлагаете «спать» на EDT или, что еще хуже, обновлять пользовательский интерфейс вне EDT. – MadProgrammer

Смежные вопросы