2010-01-30 13 views
15

Me gustaría saber si es posible hacer que se muestre una barra de progreso en la barra de tareas como lo hace Windows Explorer cuando hay una operación de archivo en curso?Barra de progreso de la Barra de tareas de Windows 7 en Java

Vi muchos ejemplos, pero todos incluyeron C#.

SWT no lo cortará.

progress bar displayed on the taskbar

+1

Se puede publicar una captura de pantalla para los que no tienen nada de Windows? – OscarRyz

+0

¿Desea que sea _like_ la barra de progreso del explorador? o desea que se muestre _en la barra de tareas_. (Pista, una de estas dos cosas es mucho más difícil que la otra). –

+0

¿Cómo resolvió esto? ¿Cualquier progreso? –

Respuesta

5

No hay instalaciones estándar en Java para hacerlo, sin embargo.

Por lo tanto, necesita hablar directamente con Windows para hacer eso. Por lo tanto, debe ubicar la rutina de Windows correcta y usar JNA (probablemente el más fácil) para invocar esa rutina. No sé de un proveedor o proyecto que ya haya hecho esto.


Editar: Parece ser que el proyecto http://code.google.com/p/nativelibs4java/ puede hacer lo que quiera.

+0

¿Te refieres a JNI? – configurator

+0

No, JNA que es más fácil de usar que JNI. –

+0

BridJ (un subproyecto de NativeLibs4Java: http://code.google.com/p/bridj/) proporciona, de hecho, envoltorios listos para usar en ITaskbarList3, y un ejemplo de trabajo: http://code.google.com /p/nativelibs4java/source/browse/trunk/libraries/Runtime/BridJ/src/main/java/org/bridj/demos/TaskbarListDemo.java – zOlive

0

Windows expone esto a través de COM. Estoy seguro de que una llamada "DLL plana" sería más fácil para usted, pero si puede llegar a COM puede hacerlo. La interfaz COM es ITaskbarList3 (también hay una ITaskbarList4 que puede usar que hereda de ella). http://msdn.microsoft.com/en-us/library/dd391692(VS.85).aspx lo documenta. SetProgressState y SetProgressValue son los métodos que querrá invocar. El estado es normal (verde), en pausa (amarillo), error (rojo), indeterminado (verde swooshing) y ninguno. En la página de MSDN, algunas personas de la comunidad han agregado detalles de llamar a este componente COM de VB y C#, lo que podría ayudarlo a determinar la configuración y demora requerida de Java.

+0

OK, entonces he instalado javax.comm, pero la documentación es pobre. ¿Quizás tengas algo que ofrecer? –

+0

Lo siento, pero mis días de Java han quedado atrás y si alguna vez supiera cómo llamar a un método COM de Java lo he olvidado. Si necesita documentación sobre qué pasar a esos métodos, claro, tengo un código C# que los llama para que sepa cuáles son los parámetros. Pregunta lejos. –

+0

el nativelibs4java parece utilizar COM – rogerdpack

3

Hay una biblioteca de Java que proporciona las nuevas características de Windows 7 para Java. Se llama J7Goodies por Strix Code. Le permite mostrar la barra de progreso de la barra de tareas y hacer mucho más.

+4

Impresionante ... Lástima que no es gratis ..:/ – pek

+3

El precio es escandaloso. :( –

3

This ejemplo hará el trabajo:

barra de tareas:
enter image description here

Código :

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 dependencias:

<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

descubrí que esta característica se incluye en Java 9. Es parte de AWT y es bastante simple de usar.

Aquí es breve ejemplo:

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);  
    } 

} 
Cuestiones relacionadas