Olá a todos.
Eu estou implementando uma tela de login para uma aplicação que utiliza o hibernate.
Eu gostaria de apresentar um JProgressBar com a porcentagem (JProgressBar sem o setIndeterminate) referente a iniciação da minha SessionFactory.
Eu estou usando para isso o SwingWorker, mas para passar o % teria que usar:
setProgress(Math.round((float) i / n * 100) onde
i : poderia ser cada INFO do log4j que exibe no console quando inicia a SessionFactory.
n : total de INFOs que são apresentados quando inicia a SessionFactory.
A minha dúvida é como posso “contar” os INFOs que são exibidos quando inicia o Hibernate ?
Como configurar o log4j para isso ?
Obrigado.
Acho que achei uma solução. Só que vai abri e fechar uma sessao numa thread diferente da aplicação apenas para exibir o JProgressBar.
public class MyAppender extends AppenderSkeleton {
private static final String DEFAULT_PATTERN = "%d{ABSOLUTE} %5p %c{1}:%L - %m%n";
private JProgressBar jprogressbar;
private int linhaAppend = 0;
private final static int TAMLOGGER = 686;
public MyAppender(JProgressBar jprogressbar) {
this.jprogressbar = jprogressbar;
}
@Override
protected void append(LoggingEvent event) {
String formatted = getLayout().format(event);
jprogressbar.setValue(Math.round((float)linhaAppend/TAMLOGGER * 100));
linhaAppend++;
}
public Layout getLayout() {
if (layout == null) {
layout = new PatternLayout(DEFAULT_PATTERN);
}
return super.getLayout();
}
@Override
public void close() {
}
@Override
public boolean requiresLayout() {
return true;
}
}
public class JFrameAppender extends javax.swing.JFrame {
private JPanel jPanel1;
private JButton jBtnConsulta;
private JProgressBar jPrgBar;
private JPanel jPanelDentro;
private Session sessao = null;
private MyAppender appender;
private static final Logger logger = Logger.getLogger(Main.class);
public static void main(String[] args) {
JFrameAppender inst = new JFrameAppender();
inst.setLocationRelativeTo(null);
inst.setVisible(true);
}
private void initLogger() {
appender = new MyAppender(jPrgBar);
Logger.getRootLogger().addAppender(appender);
logger.info("Log inicializado");
}
public void executeAction() {
Runnable runnable = new Runnable() {
public void run() {
try {
//abre e fecha uma sessao numa thread fora da thread de HibernateUtil
sessao = HibernateUtil.getSession();
sessao.close();
appender.finalize();
} catch (Exception e) {
System.out.println("Erro Runnable " + e.getMessage());
}
}
};
Thread thread = new Thread(runnable);
thread.start();
}
public JFrameAppender() {
super();
initGUI();
initLogger();
executeAction();
}
private void initGUI() {
try {
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
{
jPanel1 = new JPanel();
BorderLayout jPanel1Layout = new BorderLayout();
jPanel1.setLayout(jPanel1Layout);
getContentPane().add(jPanel1, BorderLayout.CENTER);
{
jPanelDentro = new JPanel();
jPanel1.add(jPanelDentro, BorderLayout.CENTER);
jPanelDentro.setPreferredSize(new java.awt.Dimension(384, 232));
jPanelDentro.setLayout(null);
}
{
jPrgBar = new JProgressBar();
jPrgBar.setStringPainted(true);
jPanel1.add(jPrgBar, BorderLayout.NORTH);
jPrgBar.setPreferredSize(new java.awt.Dimension(384, 31));
}
}
pack();
setSize(400, 300);
} catch (Exception e) {
e.printStackTrace();
}
}
}