Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883

    (java) Orologio in java

    Volevo realizzare un orologio in java, questo e' il programmaattuale composto da due classi:

    codice:
    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().getTime()));
    		setBorder(new LineBorder(Color.ORANGE, 2, true));
    		new Timer(1000, new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				setText(dateFormat.format(Calendar.getInstance().getTime()));
    			}
    		}).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

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Dai un'occhiata a questo piccolo esempietto realizzato al volo:
    codice:
    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.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    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:

    codice:
    		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.

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    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.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    mi potresti dire che libreria di terzi avevi utilizzato?

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    LeleFT mi potresti dire che libreria di terzi avevi utilizzato?

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    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.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    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

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    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/j...waysontop.html

    E' anche semplice da utilizzare:
    codice:
    WInterface.setOnTop( miaFinestra );
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.