Java框架在while循环期间无法正确显示

这是一个严重的问题我有一个jFrame。 我有一个“主框架”,一切都完成了,但是我有另一个框架,其中有一个gif图像(加载,这个圆形的圆圈),用作一个闪屏,说“正在处理,请稍候”但是当我拉过那个框架并且我的while循环运行时,框架变成空白,直到循环之后才会显示任何内容。

我假设这是由于while循环消耗计算机资源并“阻止”任何其他进程运行。

请告知我应该做什么。

声明新帧的代码是标准的,但我会在下面发布它。

Processing nc = new Processing(); nc.setVisible(true); 

这是我的完整代码,所以你可以看到我想要实现的目标:

第1帧的代码(Excel Extractor):

 Processing nc = new Processing(); nc.setVisible(true); JFileChooser chooser = new JFileChooser(); chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); int option = chooser.showOpenDialog(this); // parentComponent must a component like JFrame, JDialog... if (option == JFileChooser.APPROVE_OPTION) { File selectedFile = chooser.getSelectedFile(); directory = selectedFile.getAbsolutePath(); System.out.println(directory); } //create a input stream for your excel file from which data will be read. DateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd"); SimpleDateFormat sdf = new SimpleDateFormat("HHmmss"); String curdate = dateFormat.format(new Date()); Calendar cal = Calendar.getInstance(); cal.getTime(); String curtime = sdf.format(cal.getTime()); try{ FileInputStream excelSheetInput = new FileInputStream(path); //POIFSFileSystem myFileSystem = new POIFSFileSystem(excelSheetInput); XSSFWorkbook myWorkBook = new XSSFWorkbook(excelSheetInput); //get first work sheet in your excel file. Sheet sheet = myWorkBook.getSheetAt(0); //we will read data in first rows(0) second column(1) Iterator rowIterator = sheet.iterator(); Row myRow1 = sheet.getRow(0); Cell myCell1 = myRow1.getCell(0); String header=""; Iterator cellIterator1 = myRow1.cellIterator(); int rowCount = 0; while(cellIterator1.hasNext()) { Cell cell1 = cellIterator1.next(); switch(cell1.getCellType()) { case Cell.CELL_TYPE_BOOLEAN: header = header + "\""+cell1.getBooleanCellValue()+"\"" + ","; break; case Cell.CELL_TYPE_NUMERIC: cell1.setCellType(Cell.CELL_TYPE_STRING); header = header + "\""+cell1.getStringCellValue()+"\""+","; //System.out.print(cell.getStringCellValue() + "\t\t"); break; case Cell.CELL_TYPE_STRING: header = header + "\""+cell1.getStringCellValue()+"\""+","; //System.out.print(cell.getStringCellValue() + "\t\t"); break; } } Row myRow = sheet.getRow(1); Cell myCell= myRow.getCell(0); Iterator cellIterator; String firstCell = myCell.getStringCellValue(); int count =1; String nextCell; String Matter = "Matter Number: "+firstCell; String 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(); String temp; while(rowIterator.hasNext()) { //temp = "" + rowCount; //jLabel5.setText(temp); 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) { } try { nc.dispose(); writer.close(); } catch (IOException ex) { Logger.getLogger(FileChooser.class.getName()).log(Level.SEVERE, null, ex); } } 

第二帧代码(Processing):

 private void initComponents() { jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jLabel1.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N jLabel1.setText("Processing, Please Wait..."); jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/loading.gif"))); // NOI18N javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jLabel1) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addComponent(jLabel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jLabel2) .addContainerGap()) ); pack(); } 

在不知道你想要做什么的全部范围的情况下,你并不完全可能得到一个确切的答案。

从事件声音中你试图在事件调度线程的上下文中运行长时间运行的任务。 除其他事项外,该线程负责处理重绘请求。

阻止此线程,可防止Swing重新绘制自身。

据我所知,你想使用SwingWorker 。 这将允许您在后台线程中执行工作,同时将更新重新同步回EDT

更新了示例

我知道你说过“不想”使用SwingWorker ,但说实话,它更简单,更安全……

在此处输入图像描述

 import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.GridBagLayout; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.SwingWorker; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class LongRunningTask { public static void main(String[] args) { new LongRunningTask(); } public LongRunningTask() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } new BackgroundWorker().start(); } }); } public class BackgroundWorker extends SwingWorker { private JFrame frame; public BackgroundWorker() { } // Cause exeute is final :P public void start() { ImageIcon icon = new ImageIcon(getClass().getResource("/spinner.gif")); JLabel label = new JLabel("This might take some time"); label.setIcon(icon); frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new GridBagLayout()); frame.add(label); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); execute(); } @Override protected Object doInBackground() throws Exception { System.out.println("Working hard..."); Thread.sleep(1000 + (((int)Math.round(Math.random() * 5)) * 1000)); System.out.println("Or hardly working..."); return null; } @Override protected void done() { frame.dispose(); } } } 

您在java.util包中使用Timer Class并安排timertask在一段时间后说2分钟或任务完成后关闭启动屏幕。

  final Processing nc = new Processing(); nc.setVisible(true); Timer timer = new Timer(): TimerTask task = new TimerTask() { public void run() { nc.setVisible( false ); // to do disposing nc } }; timer.schedule( task, 1000 * 3 ); // dispose the processing frame after 3 minutes