PDA

Visualizza la versione completa : [JAVA] Orologio in Java


abcd1000
05-01-2006, 10:07
Volevo realizzare un orologio in java, questo e' il programmaattuale composto da due classi:




package clock;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.Locale;

import javax.swing.JLabel;
import javax.swing.Timer;
import javax.swing.border.LineBorder;

public class TimeLabel extends JLabel {

private static final long serialVersionUID = 1L;

private static final DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, Locale.US);

public TimeLabel() {
super(dateFormat.format(Calendar.getInstance().get Time()));
setBorder(new LineBorder(Color.ORANGE, 2, true));
new Timer(1000, new ActionListener() {
public void actionPerformed(ActionEvent e) {
setText(dateFormat.format(Calendar.getInstance().g etTime()));
}
}).start();
}
}

package clock;

import java.awt.BorderLayout;

import javax.swing.JFrame;

public class Main extends JFrame {

private static final long serialVersionUID = 1L;

public Main() {
getContentPane().add(new TimeLabel(), BorderLayout.NORTH);
setUndecorated(true);
pack();
setLocationRelativeTo(null);
setVisible(true);
}

public static void main(String[] args) {
new Main();
}

}


Ho due problemi:
1- siccome ho impostato il setUndecorated a true, non viene visualizzato il frame, perfetto, la controindicazione e' che non riesco a muovere l,orologio. Come faccio a muoverlo lasciando setUndecorated a true?

2- vorrei che l'orologio fosse sempre in primo piano, purtroppo il metodo setAlwaysOnTop e' stato introdotto nella 1.5 mentre io devo usare il java 1.4.2, quindi che codice posso utilizzare per mostrare l'applicazione sempre in primo piano?

grazie

LeleFT
05-01-2006, 10:54
Dai un'occhiata a questo piccolo esempietto realizzato al volo:


import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Prova extends JFrame {
private JLabel lbl;
private int posX, posY;
public Prova() {
lbl = new JLabel("Label");
lbl.addMouseListener( new MouseAdapter() {
public void mousePressed(MouseEvent me) {
posX = me.getX();
posY = me.getY();
}
});
lbl.addMouseMotionListener( new MouseMotionAdapter() {
public void mouseDragged(MouseEvent me) {
sposta(me.getX(), me.getY());
}
});
getContentPane().add( lbl );
setUndecorated( true );
setSize(300, 200);
setVisible( true );
addMouseListener( new MouseAdapter() {
public void mousePressed(MouseEvent me) {
posX = me.getX();
posY = me.getY();
}
});
addMouseMotionListener( new MouseMotionAdapter() {
public void mouseDragged(MouseEvent me) {
sposta(me.getX(), me.getY());
}
});
}

private void sposta(int newX, int newY) {
Point p = getLocation();
setLocation(p.x + (newX - posX), p.y + (newY - posY));
}

public static void main(String [] args) {
Prova p = new Prova();
}
}

Il problema sarÓ poter chiudere l'applicazione... :)

Per quanto riguarda il fatto che l'applicazione deve rimanere in primo piano... beh... ci ho provato anch'io a suo tempo, utilizzanto il metodo toFront(), ma senza ottenere risultati.
Ora non ricordo se avevo tentato la via del FocusListener, io purtroppo ora non ho tempo per provarla. In pratica dovresti intercettare l'evento focusLost() sul JFrame e, in quel caso, richiamare un toFront() seguito da un requestFocus();


Ciao. :ciauz:

abcd1000
05-01-2006, 13:17
Perfetto il movimento funziona alla grande, per quanto riguarda il problema di tenere l'orologio sempre in primo piano girando per la rete ho trovato che prima della 1.5 non c'e' a;cun modo di farlo

Q3.1 How can I make sure a window is always on top of all other windows using AWT or Swing?
Before Java 1.5 you couldn't:

AWT and Swing didn't provide this feature. All you could do was to use a (modal) [J]Dialog, and make sure the [J]Dialog is provided with the correct parent/owner in the constructor.

Since Java 1.5:

Window.setAlwaysOnTop(), which is inherited by the other top-level containers like JFrame.

Per curiosita' ho provato, come suggerivi, a mettere un focus listener:




addFocusListener(new FocusListener() {

public void focusGained(FocusEvent e) {
// TODO Auto-generated method stub

}

public void focusLost(FocusEvent e) {
System.out.println("ggg");
toFront();

}

});

Quando perde il focus viene stampato "ggg" ma l'applicazione non viene portata in primo piano dal metodo toFront per un problema relativo al Z-ordering o roba simile.

LeleFT
05-01-2006, 13:50
Immaginavo... del resto ci avevo provato anch'io tempo fa e l'unica soluzione che avevo trovato era quella di utilizzare delle librerie di terzi (ovviamente solo per Windows).


Ciao. :ciauz:

abcd1000
05-01-2006, 15:16
mi potresti dire che libreria di terzi avevi utilizzato?

abcd1000
09-01-2006, 09:35
LeleFT mi potresti dire che libreria di terzi avevi utilizzato?

LeleFT
09-01-2006, 13:50
Mi sembra che si chiamasse WInstance (ma non ricordo bene). Era un Jar con degli esempi, che comunque non ho usato.

Se non erro permetteva anche di utilizzare la Tray Icon.


Ciao. :ciauz:

abcd1000
09-01-2006, 14:45
siccome in internet non ho trovato niente con winstance, se ti capita di ricordarti o di trovare il link al sito, postamelo che lo provo

thx

LeleFT
10-01-2006, 13:57
A volte la memoria...
La libreria si chiama WInterface (e non WInstance) e la puoi scaricare liberamente a questo indirizzo:

http://www.esus.com/javaindex/j2se/jdk1.2/javaxswing/toplevelcontainers/jdialog/jdialogalwaysontop.html

E' anche semplice da utilizzare:


WInterface.setOnTop( miaFinestra );

Ciao. :ciauz:

abcd1000
01-02-2006, 22:45
LeleFT ho provato ad utilizzare la libreria WInterface, in particolare ho eseguito la classe di esempio WInterfaceTestFrame che
ha dato questo errore:

java.lang.UnsatisfiedLinkError: getHwnd
at WInterface.getHwnd(Native Method)
at WInterface.getHwnd(WInterface.java:176)
at WInterface.setOnTop(WInterface.java:111)
at WInterfaceTestFrame$1.actionPerformed(WInterfaceTe stFrame.java:78)
at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:1786)
at javax.swing.AbstractButton$ForwardActionEvents.act ionPerformed(AbstractButton.java:1839)
at javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:420)
at javax.swing.DefaultButtonModel.setPressed(DefaultB uttonModel.java:258)
at javax.swing.plaf.basic.BasicButtonListener.mouseRe leased(BasicButtonListener.java:245)
at java.awt.Component.processMouseEvent(Component.jav a:5100)
at java.awt.Component.processEvent(Component.java:489 7)
at java.awt.Container.processEvent(Container.java:156 9)
at java.awt.Component.dispatchEventImpl(Component.jav a:3615)
at java.awt.Container.dispatchEventImpl(Container.jav a:1627)
at java.awt.Component.dispatchEvent(Component.java:34 77)
at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:3483)
at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:3198)
at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:3128)
at java.awt.Container.dispatchEventImpl(Container.jav a:1613)
at java.awt.Window.dispatchEventImpl(Window.java:1606 )
at java.awt.Component.dispatchEvent(Component.java:34 77)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 456)
at java.awt.EventDispatchThread.pumpOneEventForHierar chy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:145)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:137)
at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:100)
java.lang.UnsatisfiedLinkError: getHwnd

sai dirmi come mai?
uso win xp sp2 con java 1.4.2

Loading