Ayuda java

Hola,me gustaria pedirte ayuda con un problema que tengo de java.Este codigo es de un programa que estoy desarrollando de un cronometro,y hay gente,que me ha dicho que podria optimizarlo si cambio el while por una clase de java,llamada timer,para que me haga mas "real" el paso del tiempo,que esta puesto en centesimas,sabrias ayudarme para implementarlo??
Gracias
public class jframe extends javax.swing.JFrame {
/** Creates new form jframe */
public jframe() {
initComponents();
}
int hora = 0, min =0, seg =000;
Thread hilo = new Thread()
{
public void run()
{
try
{
while(true)
{
if(seg==59) { seg=0; min++; }
if(min==9) { min=0; hora++; }
seg++;
lblTime.setText(hora+":"+min+":"+seg);
hilo.sleep(1);
}
} catch (java.lang.InterruptedException ie) { System.out.println(ie.getMessage()); }
}
};
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
lblTime = new javax.swing.JLabel();
btnStart = new javax.swing.JButton();
btnStop = new javax.swing.JButton();
lblStatus = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Semaforo");
lblTime.setText("Time");
btnStart.setText("Start");
btnStart.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
btnStartMouseClicked(evt);
}
});
btnStop.setText("Stop");
btnStop.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
btnStopMouseClicked(evt);
}
});
lblStatus.setText("Estado: ");
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(lblStatus, javax.swing.GroupLayout.PREFERRED_SIZE, 141, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(layout.createSequentialGroup()
.addGap(38, 38, 38)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(btnStop)
.addComponent(btnStart))
.addGap(46, 46, 46)
.addComponent(lblTime, javax.swing.GroupLayout.PREFERRED_SIZE, 144, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap(47, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(39, 39, 39)
.addComponent(btnStart)
.addGap(18, 18, 18)
.addComponent(btnStop)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 65, Short.MAX_VALUE)
.addComponent(lblStatus))
.addGroup(layout.createSequentialGroup()
.addGap(41, 41, 41)
.addComponent(lblTime, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(90, Short.MAX_VALUE))
);
pack();
}// </editor-fold>//GEN-END:initComponents
public boolean issuspended = false;
private void btnStartMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnStartMouseClicked
if(!issuspended)
{
hilo.start();
lblStatus.setText("Estado: GO!!!");
}
else
{
hilo.resume();
issuspended = false;
lblStatus.setText("Estado: Resumido");
}
}//GEN-LAST:event_btnStartMouseClicked
private void btnStopMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnStopMouseClicked
hilo.stop();
lblStatus.setText("STOP");
}//GEN-LAST:event_btnStopMouseClicked
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new jframe().setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnStart;
private javax.swing.JButton btnStop;
private javax.swing.JLabel lblStatus;
private javax.swing.JLabel lblTime;
// End of variables declaration//GEN-END:variables
}

1 respuesta

Respuesta
1
Hey!, que tal?
Bueno mira escribí una clase que hace un crónometro con hora, minutos, segundos y milisegundos, te dejaré el código para que lo mires y puedas ver la implementacion del Timer.
Porcierto el seguno cambia en 910, porque resté lo que más o menos tarda el programa en ejecutar las demás instrucciones. Lo hice sencillo, solo idéntalo y espero que te pueda servir ;)
import javax.swing.JButton;
import java.awt.FlowLayout;
import javax.swing.JLabel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.Timer;
/**
*
* @author Roberto Mota
* e-mail: [email protected]
*/
public class Main extends JFrame implements ActionListener{
Timer timer;
JLabel tiempo;
JButton start;
JButton pause;
JButton stop;
int hora=00;
int minuto=00;
int segundo=00;
int milisegundo=00;
public Main(){
super("Prueba Timer");
setSize(300,70);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new FlowLayout());
tiempo=new JLabel(hora+":"+minuto+":"+segundo+":"+milisegundo);//Label que muestra el tiempo
start=new JButton("start");//creamos el botón para comenzar
pause=new JButton("pause");//creamos el botón para pausar
stop=new JButton("stop");//creamos el botón para detener
timer=new Timer(1,this);//Creamo el timer
//1 es el tiempo que tendra de retar en milisegundos
// esto quiere decir que el timer contará desde los milisegundos
//This hace referencia el ActionListener que sera llamdo cada milisegundo
start.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
timer.start();
}
});
pause.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
timer.stop();
}
});
stop.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
stop();
}
});
add(tiempo);
add(start);
add(pause);
add(stop);
setVisible(true);
}
public static void main(String[] args) {
new Main();
}
public void actionPerformed(ActionEvent e) {
milisegundo++;
if(milisegundo>910){// cada 910 milisegundos se contará un segundo
milisegundo=0;
segundo++;
}
if(segundo>59){
segundo=0;
minuto++;
}
if(minuto>59){
minuto=00;
hora++;
}
tiempo.setText(hora+":"+minuto+":"+segundo+":"+milisegundo);
}
public void stop(){
timer.stop();
hora=0;
minuto=0;
segundo=0;
milisegundo=0;
tiempo.setText(hora+":"+minuto+":"+segundo+":"+milisegundo);
}
}
Intento ejecutarlo y me da errores,me lo podrias implementar en un Jframe o en un interfaz?De Java,como comprenderas no manejo mucho
Me gusta la idea de que sea sencillo,asi sera mas facil de entender :-)
Que raro, compilalo y ejecutalo, despues copia y pega los errores que salen y mandamelo para saber que es, y ya esta implementado en un JFrame.
Tal vez los errores te los genere porque está dentro de un paquete y no lo tienes declarado o el nombre de la clase.
Hola!!
Ya esta resuelto,lo cree bien y ya me sale el marcador.
Ahora una duda que estoy buscando y no encuentro por internet,si quiero detener el contador al pulsar una tecla,es decir,asignarle por ejemplo,al boton pause la letra P,como podria hacerlo?He leido algo de keylistener,pero no se muy bien como va eso y no encuentro ejemplos claro,podrias ayudarme??
Gracias por lo anterior
Jajaja de nada y claro que si te puedo ayudar, la parte mala es que estoy de viaje y no tengo JDK ni IDE de Java en el lugar dode me encuentro pero te trataré de ayudar confiando en mi memoria jajaja. Puedes ver si funciona, cualquier cosa pues solo me dices una disculpa porque no tengo eclipse ni netbeans, nadamas que el notepad jaja... Espero que te sirva, si no busca en la documentación o en google los ejemplos, y ya veras que aprenderás más... así lo hice yo ;)
import javax.swing.JButton;
import java.awt.FlowLayout;
import javax.swing.JLabel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.Timer;
/**
*
* @author Roberto Mota
* e-mail: [email protected]
*/
public class Main extends JFrame implements ActionListener,KeyListener{
Timer timer;
JLabel tiempo;
JButton start;
JButton pause;
JButton stop;
int hora=00;
int minuto=00;
int segundo=00;
int milisegundo=00;
public Main(){
super("Prueba Timer");
setSize(300,70);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new FlowLayout());
addKeyListener(this);
tiempo=new JLabel(hora+":"+minuto+":"+segundo+":"+milisegundo);//Label que muestra el tiempo
start=new JButton("start");//creamos el botón para comenzar
pause=new JButton("pause");//creamos el botón para pausar
stop=new JButton("stop");//creamos el botón para detener
timer=new Timer(1,this);//Creamo el timer
//1 es el tiempo que tendra de retar en milisegundos
// esto quiere decir que el timer contará desde los milisegundos
//This hace referencia el ActionListener que sera llamdo cada milisegundo
start.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
timer.start();
}
});
pause.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
timer.stop();
}
});
stop.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
stop();
}
});
add(tiempo);
add(start);
add(pause);
add(stop);
setVisible(true);
}
public static void main(String[] args) {
new Main();
}
public void actionPerformed(ActionEvent e) {
milisegundo++;
if(milisegundo>910){// cada 910 milisegundos se contará un segundo
milisegundo=0;
segundo++;
}
if(segundo>59){
segundo=0;
minuto++;
}
if(minuto>59){
minuto=00;
hora++;
}
tiempo.setText(hora+":"+minuto+":"+segundo+":"+milisegundo);
}
public void stop(){
timer.stop();
hora=0;
minuto=0;
segundo=0;
milisegundo=0;
tiempo.setText(hora+":"+minuto+":"+segundo+":"+milisegundo);
}
public void keyTyped(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
if(e.getKeyCode==KeyEvent.VK_P){//VK hace referencia al código de la letra p (pause)
timer.stop();
}
if(e.getKeyCode==KeyEvent.VK_S){//VK hace referencia al código de la letra s(stop)
stop();
}
if(e.getKeyCode==KeyEvent.VK_I){//VK hace referencia al código de la letra i(initialize)
timer.start();
}
/*Si eso no llegara a funcionar prueba sustituyendo los If's por
**para la letra p if(e.getKeyChar=='p' || e.getKeyChar=='P') // por aquello de que use mayusculas y minusculas
**para la letra s if(e.getKeyChar=='s' || e.getKeyChar=='S') // por aquello de que use mayusculas y minusculas
**para la letra i if(e.getKeyChar=='i' || e.getKeyChar=='I') // por aquello de que use mayusculas y minusculas
*/
}
public void keyReleased(KeyEvent e) {
}
}
Hola!!
Que grande eres,que me puedas ayudar con el notepad,te haces aun mas valioso,muchisimas gracias!!!!
Al compilarlo,me da el siguiente problema:
C:\Documents and Settings\Juxterine\Escritorio\Pruebaca\Pruebaca\src\pruebaca\Main.java:93: cannot find symbol
symbol : variable getKeyChar
location: class java.awt.event.KeyEvent
if(e.getKeyChar=='s' || e.getKeyChar=='S'){//VK hace referencia al código de la letra s(stop)
Asi con cada tecla,probe tambien con lo que me pusiste comentado,pero no me reconoce la tecla para pararlo,no se porque puede ser.
Por cierto,el timer me va mas lento que el tiempo real,porque puede ser??Hay otro metodo que asemeje mas el tiempo del programa al tiempo "de la vida real"jeje??
Gracias eternas
jajaja ya vi perdón error de primaria jaja me faltaron los parentesis
e.getKeyChar() en lugar de e.getKeyChar cambia eso bueno mas bien agrega (), y pues para modificar el tiempo del timer modifica el 910 en la siguiente linea
if(milisegundo>910){// cada 910 milisegundos se contará un segundo
si kieres que vaya mas rápido réstale a 910, y si kieres que vaya más lento súmale a 910, ya que es la cantidad de milisegundos que necesita para contar un segundo, pruebale modificando ese número, yo creo que puede diferir en cuanto a la velocidad que trabaje el procesador las computadoras, la mera verdad no estoy seguro jaja.. espero que te funcione y me avisas como te va.
Hola tio:
Lo primero muchas gracias por tu colaboracion en estos dias
He probado con lo de () y ya no da errores de compilacion,pero no funcionan las teclas,no se que puede haber pasado y con respecto a los milisegundos,lo he puesto asi:
if(milisegundo>62){// cada 62 milisegundos se contará un segundo
y ya se aproxima bastante el tiempo del programa al real.
Sabes como puede ser lo de las teclas??
Por cierto en un showdialogbox,me salen 3 opciones:SI,NO,CANCELAR
si quiero que solo me aparezcan el SI y No,como hago desaparecer el cancelar?O como hago una ventana para esas 2 opciones,como prefieras?
Vuelvo a reiterar mis gracias
Bueno como te digo sigo de vacasiones, pero se me hace extraño que no funcione, ya probaste con la opcion del e.getKeyCode()? tal ves sea mas eficiente usarla y pues paara lo del dialog box puedes usar un JOption pane, podrias usar algo como esto
try{
JOptionPane. ShowConfirmDialog(this, "Este String representa el mensaje que aparecerá", "Este String representa el titulo", OK_CANCEL_OPTION);//this hace referencia al JFrame que //es el componente padre
}catch(Exception e){
System.out.println(e.getMessage());
}
y pues si necesitas que si clickean ok haga una cosa y si dan cancelar haga otra lo pones dentro de un if alg asi
if(JOptionPane.showConfirmDialog(this, "Este String representa el mensaje que aparecerá", "Este String representa el titulo", OK_CANCEL_OPTION)==JOptionPane.OK_OPTION){
//hacer esto si es OK
}else{
//hacer esto si es CANCEL
}
Checalo te recomiendo que si ago tienes duda con las constantes de JOptionPane o bien de cualquier clase en java visites la página de documentacion de Java, te lo recomiendo ya que en muchas veces te dan pequeños ejemplos de como usar las clases
http://download.oracle.com/javase/1.5.0/docs/api/
De verdad espero que te sirva
Hola!!!
Gracias,si que lo probe pero no me llego a funcionar,no se porque seria.
Pero he encontrado una forma en que me funcionan las teclas,asi que esta solucionado de todas maneras.
En cuanto a lo de JoptionPane,revisare lo que me has mandado y lo probare,de todas maneras mirare la pagina de Java que me mandas.
Cierro la pregunta y si en un futuro tengo alguna duda que hacerte,te lo consulate,ok?
Disfruta de tus vacaciones!!!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas