2010-01-30 47 views
15

Tôi muốn biết liệu có thể tạo thanh tiến trình được hiển thị trên thanh tác vụ như Windows Explorer khi nào có một thao tác tệp đang diễn ra không?Thanh tiến trình thanh tác vụ Windows 7 trong Java

Tôi đã thấy nhiều ví dụ, nhưng tất cả đều liên quan đến C#.

SWT sẽ không cắt.

progress bar displayed on the taskbar

+1

Bạn có thể gửi ảnh chụp màn hình cho những người không có Windows bất cứ điều gì? – OscarRyz

+0

Bạn có muốn nó là _like_ thanh tiến trình khám phá không? hoặc bạn có muốn nó được hiển thị hay không trên thanh tác vụ_. (Gợi ý, một trong hai thứ này khó hơn nhiều so với cái kia). –

+0

Bạn giải quyết vấn đề này bằng cách nào? Bất kỳ tiến bộ nào? –

Trả lời

5

Hiện chưa có cơ sở tiêu chuẩn nào trong Java để làm như vậy.

Do đó bạn cần nói chuyện trực tiếp với Windows để thực hiện điều đó. Vì vậy, bạn cần phải xác định vị trí các thói quen Windows chính xác, và sử dụng JNA (có lẽ là dễ nhất) để gọi thói quen đó. Tôi không biết của một nhà cung cấp hoặc một dự án đã làm điều này rồi.


Chỉnh sửa: Có vẻ như dự án http://code.google.com/p/nativelibs4java/ có thể làm những gì bạn muốn.

+0

Bạn có nghĩa là JNI? – configurator

+0

Không, JNA dễ sử dụng hơn JNI. –

+0

BridJ (một dự án con NativeLibs4Java: http://code.google.com/p/bridj/) thực sự cung cấp trình bao bọc sẵn sàng sử dụng xung quanh ITaskbarList3 và một ví dụ làm việc: http://code.google.com /p/nativelibs4java/source/browse/trunk/libraries/Runtime/BridJ/src/main/java/org/bridj/demos/TaskbarListDemo.java – zOlive

0

Windows hiển thị điều này thông qua COM. Tôi chắc chắn một cuộc gọi "DLL phẳng" sẽ dễ dàng hơn cho bạn, nhưng nếu bạn có thể nhận được COM bạn có thể làm điều này. Giao diện COM là ITaskbarList3 (cũng có một ITaskbarList4 bạn có thể sử dụng nó kế thừa từ nó.) http://msdn.microsoft.com/en-us/library/dd391692(VS.85).aspx ghi lại nó. SetProgressState và SetProgressValue là các phương thức bạn sẽ muốn gọi. Trạng thái là bình thường (xanh), bị tạm dừng (màu vàng), lỗi (màu đỏ), không xác định (màu xanh lá cây swooshing) và không có gì. Trên trang MSDN một số người cộng đồng đã thêm chi tiết về việc gọi thành phần COM này từ VB và C# - có thể giúp bạn tìm ra thiết lập và xé rách theo yêu cầu từ Java.

+0

OK, vì vậy tôi đã cài đặt javax.comm, nhưng tài liệu thì kém. Bạn có lẽ có bất cứ điều gì để cung cấp? –

+0

Xin lỗi, nhưng những ngày Java của tôi dài phía sau tôi và nếu tôi biết cách gọi một phương thức COM từ Java tôi đã quên. Nếu bạn cần tài liệu về những gì để vượt qua để những phương pháp, chắc chắn, tôi có mã C# mà gọi cho họ vì vậy tôi biết những gì các tham số được. Hỏi đi. –

+0

các nativelibs4java xuất hiện để sử dụng COM – rogerdpack

3

Có một thư viện Java cung cấp các tính năng mới của Windows 7 cho Java. Nó được gọi là J7Goodies bởi Strix Code. Nó cho phép bạn hiển thị thanh tiến trình thanh tác vụ và làm nhiều hơn nữa.

+4

Awesome ... Quá xấu nó không miễn phí ..:/ – pek

+3

Giá là thái quá. :( –

3

This dụ sẽ thực hiện công việc:

công tác thanh:
enter image description here

Mã :

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 phụ thuộc:

<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

tôi phát hiện ra rằng tính năng này được bao gồm trong Java 9. Nó là một phần của AWT và đó là quity đơn giản quá sử dụng.

Dưới đây là ví dụ nhỏ:

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

} 
Các vấn đề liên quan