这是一个严重的问题我有一个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<Row> rowIterator = sheet.iterator();
Row myRow1 = sheet.getRow(0);
Cell myCell1 = myRow1.getCell(0);
String header="";
Iterator<Cell> 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<Cell> 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);
}
}
第二帧代码(处理):
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();
}
答案 0 :(得分:3)
如果不了解您要做的事情的全部范围,那么您完全不可能得到确切的答案。
在事件调度线程的上下文中尝试运行长时间运行的任务的声音。该线程负责处理重绘请求等。
阻止此线程,阻止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<Object, Object> {
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();
}
}
}
答案 1 :(得分:0)
您在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