2010-01-30 6 views
15

Je voudrais savoir s'il est possible de faire afficher une barre de progression dans la barre des tâches comme le fait Windows Explorer quand une opération de fichier est en cours?Barre de progression de la barre des tâches de Windows 7 en Java

J'ai vu beaucoup d'exemples, mais ils ont tous impliqué C#. SWT ne le coupera pas.

progress bar displayed on the taskbar

+1

Pouvez-vous poster une capture d'écran pour ceux qui n'ont rien de Windows? – OscarRyz

+0

Voulez-vous que ce soit comme _like_ la barre de progression de l'explorateur? ou voulez-vous l'afficher dans la barre des tâches? (Indice, l'une de ces deux choses est beaucoup plus difficile que l'autre). –

+0

Comment avez-vous résolu cela? Aucun progrès? –

Répondre

5

Il n'y a pas d'installation standard Java pour le faire, encore. Par conséquent, vous devez directement parler à Windows pour le faire. Vous devez donc localiser la routine Windows correcte et utiliser JNA (probablement le plus simple) pour invoquer cette routine. Je ne connais pas de fournisseur ou de projet qui l'a déjà fait.


Edit: Il semble que le projet http://code.google.com/p/nativelibs4java/ peut faire ce que vous voulez.

+0

Voulez-vous dire JNI? – configurator

+0

Non, JNA qui est plus facile à utiliser que JNI. –

+0

BridJ (un sous-projet NativeLibs4Java: http://code.google.com/p/bridj/) fournit en effet des wrappers prêts à l'emploi autour de ITaskbarList3, et un exemple de travail: http://code.google.com /p/nativelibs4java/source/browse/trunk/libraries/Runtime/BridJ/src/main/java/org/bridj/demos/TaskbarListDemo.java – zOlive

0

Windows expose cela via COM. Je suis sûr qu'un appel "DLL plat" serait plus facile pour vous, mais si vous pouvez vous rendre à COM, vous pouvez le faire. L'interface COM est ITaskbarList3 (il y a aussi une ITaskbarList4 que vous pouvez utiliser qui en hérite.) http://msdn.microsoft.com/en-us/library/dd391692(VS.85).aspx le documente. SetProgressState et SetProgressValue sont les méthodes que vous voulez appeler. L'état est normal (vert), en pause (jaune), erreur (rouge), indéterminé (vert swooshing) et aucun. Sur la page MSDN, certaines personnes de la communauté ont ajouté des détails sur l'appel de ce composant COM à partir de VB et de C#, ce qui pourrait vous aider à comprendre l'installation et le démontage requis de Java.

+0

OK, j'ai donc installé javax.comm, mais la documentation est pauvre. Avez-vous quelque chose à offrir? –

+0

Désolé mais mes jours de Java sont loin derrière moi et si j'ai jamais su comment appeler une méthode COM de Java j'ai oublié. Si vous avez besoin de documentation sur ce qu'il faut passer à ces méthodes, bien sûr, j'ai un code C# qui les appelle, donc je connais les paramètres. Demandez loin. –

+0

le nativelibs4java semble utiliser COM – rogerdpack

3

Il existe une bibliothèque Java fournissant les nouvelles fonctionnalités de Windows 7 pour Java. Il s'appelle J7Goodies par Strix Code. Il vous permet d'afficher la barre de progression de la barre des tâches et de faire beaucoup plus.

+4

Impressionnant ... Dommage que ce n'est pas gratuit ..:/ – pek

+3

Les prix sont scandaleux. :( –

3

This exemple fera le travail:

Barre des tâches:
enter image description here

code

:

import org.bridj.Platform; 
import org.bridj.Pointer; 
import org.bridj.cpp.com.COMRuntime; 
import org.bridj.cpp.com.shell.ITaskbarList3; 
import org.bridj.jawt.JAWTUtils; 

import javax.swing.*; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class TaskBarListDemo extends JFrame implements ActionListener, ChangeListener 
{ 
    private ITaskbarList3 list; 
    private JSlider slider; 
    private Pointer<?> hwnd; 

    private TaskBarListDemo() throws ClassNotFoundException 
    { 
     super("TaskbarList Demo (" + (Platform.is64Bits() ? "64 bits" : "32 bits") + ")"); 

     list = COMRuntime.newInstance(ITaskbarList3.class); 

     getContentPane().add("Center", new JLabel("Hello Native Windows 7 World !")); 
     Box box = Box.createVerticalBox(); 

     int min = 0; 
     int max = 300; 
     int val = (min + max/2); 
     slider = new JSlider(min, max, val); 
     slider.addChangeListener(this); 
     box.add(slider); 

     ButtonGroup group = new ButtonGroup(); 
     for (ITaskbarList3.TbpFlag state : ITaskbarList3.TbpFlag.values()) 
     { 
      JRadioButton cb = new JRadioButton(state.name()); 
      group.add(cb); 
      cb.putClientProperty(ITaskbarList3.TbpFlag.class, state); 
      cb.setSelected(state == ITaskbarList3.TbpFlag.TBPF_NORMAL); 
      cb.addActionListener(this); 
      box.add(cb); 
     } 
     getContentPane().add("South", box); 

    } 

    @Override 
    protected void finalize() throws Throwable 
    { 
     super.finalize(); 
     list.Release(); 
    } 

    public void setVisible(boolean visible) 
    { 
     super.setVisible(visible); 

     long hwndVal = JAWTUtils.getNativePeerHandle(this); 
     hwnd = Pointer.pointerToAddress(hwndVal); 
     list.SetProgressValue((Pointer) hwnd, slider.getValue(), slider.getMaximum()); 
    } 

    @Override 
    public void stateChanged(ChangeEvent actionEvent) 
    { 
     list.SetProgressValue((Pointer) hwnd, slider.getValue(), slider.getMaximum()); 
    } 

    @Override 
    public void actionPerformed(ActionEvent actionEvent) 
    { 
     JRadioButton button = ((JRadioButton) actionEvent.getSource()); 
     if (button.isSelected()) 
     { 
      ITaskbarList3.TbpFlag flag = (ITaskbarList3.TbpFlag) button.getClientProperty(ITaskbarList3.TbpFlag.class); 
      list.SetProgressValue((Pointer) hwnd, slider.getValue(), slider.getMaximum()); 
      list.SetProgressState((Pointer) hwnd, flag); 
     } 
    } 

    public static void main(String[] arguments) throws Exception 
    { 
     TaskBarListDemo f = new TaskBarListDemo(); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.pack(); 
     f.setVisible(true); 
    } 
} 

Maven dépendances:

<dependencies> 
    <dependency> 
     <groupId>com.nativelibs4java</groupId> 
     <artifactId>bridj</artifactId> 
     <version>LATEST</version> 
    </dependency> 
    <dependency> 
     <groupId>net.java.dev.jna</groupId> 
     <artifactId>jna</artifactId> 
     <version>LATEST</version> 
    </dependency> 
    <dependency> 
     <groupId>net.java.dev.jna</groupId> 
     <artifactId>jna-platform</artifactId> 
     <version>LATEST</version> 
    </dependency> 
</dependencies> 
1

Je trouve que cette fonctionnalité est incluse dans Java 9. Il fait partie de AWT et il est quity simple à utiliser aussi.

est court exemple ici:

import java.awt.Taskbar; 
import java.awt.Taskbar.State; 

import javax.swing.JFrame; 
import javax.swing.WindowConstants; 

/** 
* @author fxl 
*/ 
public class TaskbarSample { 

    public static void main(String[] args) { 

     // JavaDoc: 
     // https://docs.oracle.com/javase/9/docs/api/java/awt/Taskbar.html 

     // MSDNDoc: 
     // https://msdn.microsoft.com/en-us/library/dd391692(VS.85).aspx 
     if (Taskbar.isTaskbarSupported() == false) { 
      return; 
     } 

     JFrame dialog = new JFrame("Test - 50%"); 
     dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 
     dialog.setVisible(true);  


     Taskbar taskbar = Taskbar.getTaskbar(); 
     taskbar.setWindowProgressState(dialog, State.ERROR); 
     taskbar.setWindowProgressValue(dialog, 50);  
    } 

} 
Questions connexes