sentencia - if en java
El marco de Java no se muestra correctamente durante un ciclo while (2)
Sin conocer el alcance total de lo que está tratando de hacer, no es del todo posible para usted una respuesta exacta.
A partir de los sonidos de las cosas, trata de ejecutar tareas de ejecución prolongada dentro del contexto del hilo de distribución de eventos. Este hilo es responsable, entre otras cosas, de procesar las solicitudes de repintado.
Al bloquear este hilo, evita que Swing se vuelva a pintar.
Por lo que puedo decir, quieres usar un SwingWorker . Esto le permitirá realizar su trabajo en un hilo de fondo, mientras vuelve a sincronizar las actualizaciones con el EDT
Actualizado con un ejemplo
Sé que dijiste que no "querías" usar SwingWorker
, pero para ser sincero, es más simple y más seguro ...
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();
}
}
}
Aquí hay un problema serio que tengo con un jFrame. Tengo un "Marco principal" donde todo está hecho, sin embargo, tengo otro marco con una imagen gif (Cargando, ese círculo que da vueltas y vueltas), que se usa como una pantalla emergente que dice "Procesando, por favor espere" , sin embargo, cuando atravieso ese marco y mi ciclo while se ejecuta, el cuadro se queda en blanco y nada aparece hasta después del ciclo.
Supongo que esto se debe a que el bucle while consume recursos de la computadora y "bloquea" la ejecución de cualquier otro proceso.
Por favor asesorar sobre lo que debería hacer.
el código para declarar el nuevo marco es estándar pero lo publicaré de todos modos a continuación.
Processing nc = new Processing();
nc.setVisible(true);
Aquí está mi código completo para que pueda ver lo que estoy tratando de lograr:
Código del cuadro 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);
}
}
El segundo código de marcos (Procesamiento):
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();
}
Utiliza Timer Class en el paquete java.util y programa timertask para cerrar la pantalla de bienvenida después de un tiempo, por ejemplo 2 min o la tarea se completa.
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