ورود

View Full Version : پروگرس بار در تسکبار



dasssnj
شنبه 25 مرداد 1393, 09:27 صبح
سلام دوستان .
آیا راهی وجود داره که مثل تصویر زیر ایکن برنامه در تسکبار دارای پروگرس بار بشه

122318

لطفا کمک کنید
ممنون

vahid-p
شنبه 25 مرداد 1393, 15:24 عصر
بله امکان پذیره. ولی دقت کنید این کاملا وابسته به سیستم عامله. مثلا ویندوز Xp چنین قابلیتی نداره ولی ویندوز 7 یا 8 چرا.
برای نوشتن برنامه های وابسته به سیستم عامل معمولا کتابخونه هایی برای راحتی استفاده از امکانات سیستم عامل برای جاوا مینویسن، ولی اگر هم نبود شما از طریق کتابخونه JNI یا JNA جاوا میتونید به فایل های DLL ویندوز مثلا دسترسی داشته باشید و از متد ها و... استفاده کنید. ( البته کتابخونه های دیگه ای هم بر همین مبنا وجود داره مثل BridJ )
برای اینکار کتابخونه ای از امکانات ویندوز 7 برای جاوا هست به اسم J7Goodies (http://www.strixcode.com/j7goodies)( غیر رایگان )
اما کتابخونه eclipse.SWT هم امکان Taskbar progress bar رو داره.
اینم یه مثال خیلی خوب که دقیقا اون چیزایی که میخوای رو داره و یه سری امکانات بیشتر :

import org.eclipse.swt.*;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

public class Snippet336 {
static Display display;
static Shell shell;

static TaskItem getTaskBarItem () {
TaskBar bar = display.getSystemTaskBar();
if (bar == null) return null;
TaskItem item = bar.getItem(shell);
if (item == null) item = bar.getItem(null);
return item;
}

public static void main(String[] args) {
display = new Display();
shell = new Shell(display);
shell.setLayout(new GridLayout());
TabFolder folder = new TabFolder(shell, SWT.NONE);
folder.setLayoutData(new GridData(GridData.FILL_BOTH));

//Progress tab
TabItem item = new TabItem(folder, SWT.NONE);
item.setText("Progress");
Composite composite = new Composite(folder, SWT.NONE);
composite.setLayout(new GridLayout());
item.setControl(composite);
Listener listener = new Listener () {
@Override
public void handleEvent(Event event) {
Button button = (Button)event.widget;
if (!button.getSelection()) return;
TaskItem item = getTaskBarItem();
if (item != null) {
int state = ((Integer)button.getData()).intValue();
item.setProgressState(state);
}
}
};
Group group = new Group (composite, SWT.NONE);
group.setText("State");
group.setLayout(new GridLayout());
group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Button button;
String[] stateLabels = {"SWT.DEFAULT", "SWT.INDETERMINATE", "SWT.NORMAL", "SWT.ERROR", "SWT.PAUSED"};
int[] states = {SWT.DEFAULT, SWT.INDETERMINATE, SWT.NORMAL, SWT.ERROR, SWT.PAUSED };
for (int i = 0; i < states.length; i++) {
button = new Button(group, SWT.RADIO);
button.setText(stateLabels[i]);
button.setData(new Integer(states[i]));
button.addListener(SWT.Selection, listener);
if (i==0) button.setSelection(true);
}
group = new Group (composite, SWT.NONE);
group.setText("Value");
group.setLayout(new GridLayout(2, false));
group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Label label = new Label(group, SWT.NONE);
label.setText("Progress");
final Scale scale = new Scale (group, SWT.NONE);
scale.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
scale.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
TaskItem item = getTaskBarItem();
if (item != null) item.setProgress(scale.getSelection());
}
});

//Overlay text tab
item = new TabItem(folder, SWT.NONE);
item.setText("Text");
composite = new Composite(folder, SWT.NONE);
composite.setLayout(new GridLayout());
item.setControl(composite);
group = new Group (composite, SWT.NONE);
group.setText("Enter a short text:");
group.setLayout(new GridLayout(2, false));
group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
final Text text = new Text(group, SWT.BORDER | SWT.SINGLE);
GridData data = new GridData(GridData.FILL_HORIZONTAL);
data.horizontalSpan = 2;
text.setLayoutData(data);
button = new Button(group, SWT.PUSH);
button.setText("Set");
button.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
TaskItem item = getTaskBarItem();
if (item != null) item.setOverlayText(text.getText());
}
});
button = new Button(group, SWT.PUSH);
button.setText("Clear");
button.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
text.setText("");
TaskItem item = getTaskBarItem();
if (item != null) item.setOverlayText("");
}
});

//Overlay image tab
item = new TabItem(folder, SWT.NONE);
item.setText("Image");
composite = new Composite(folder, SWT.NONE);
composite.setLayout(new GridLayout());
item.setControl(composite);
Listener listener3 = new Listener() {
@Override
public void handleEvent(Event event) {
Button button = (Button)event.widget;
if (!button.getSelection()) return;
TaskItem item = getTaskBarItem();
if (item != null) {
String text = button.getText();
Image image = null;
if (!text.equals("NONE")) image = new Image (display, Snippet336.class.getResourceAsStream(text));
Image oldImage = item.getOverlayImage();
item.setOverlayImage (image);
if (oldImage != null) oldImage.dispose();
}
}
};
group = new Group (composite, SWT.NONE);
group.setText("Images");
group.setLayout(new GridLayout());
group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
button = new Button(group, SWT.RADIO);
button.setText("NONE");
button.addListener(SWT.Selection, listener3);
button.setSelection(true);
String[] images = {"eclipse.png", "pause.gif", "run.gif", "warning.gif"};
for (int i = 0; i < images.length; i++) {
button = new Button(group, SWT.RADIO);
button.setText(images[i]);
button.addListener(SWT.Selection, listener3);
}
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) display.sleep();
}
display.dispose();
}

}


اکثر این مطالب با سرچ ساده و از مطالب و لینک های موجود در آدرس http://stackoverflow.com/questions/2167037/windows-7-taskbar-progress-bar-in-java آوردم.

dasssnj
شنبه 25 مرداد 1393, 17:49 عصر
ممنون منم این صفحه را دیده بودم ولی چیزی نفهمیده بودم

vahid-p
شنبه 25 مرداد 1393, 19:31 عصر
اگر از SWT استفاده کنید، نحوه کار خیلی سادست. اول اینکه هر پنجره SWT به این شکل ایجاد میشه ( حلقه آخر هم برای خروج از برنامست ):

Display display=new Display();
Shell shell=new Shell(display);
shell.open();

// to do
TaskBar systemTaskBar = display.getSystemTaskBar();
TaskItem item=systemTaskBar.getItem(shell);
item.setProgressState(SWT.NORMAL);
item.setProgress(12);

while(!shell.isDisposed()){
if(!display.readAndDispatch()) display.sleep();
}
display.close();

حالا ما به جای //to do باید کدی که میخوایم رو قرار بدیم. تنها کاری که باید بکنیم اینه که taskbar رو از Display بگیریم.
TaskBar systemTaskBar = display.getSystemTaskBar();
و بعد از اون آیتم مربوطه رو از TaskBar انتخاب کنیم :
TaskItem item=systemTaskBar.getItem(shell);

حالا حالت آیتم Progress Bar رو انتخاب میکنیم :
item.setProgressState(SWT.NORMAL);

دیگر حالت های موجود ایناست :
SWT.ERROR به رنگ قرمز
SWT.PAUSE به رنگ زرد
SWT.INDETERMINATE حالت نا معلوم. یعنی میزان پیشرفت مشخص نیست
SWT.DEFAULT میزان پیشرفت نمایش داده نمیشه. ( اگر از متد فوق استفاده نکنید، به صورت پیشفرض این گزینه است )

اینا به عنوان پارامتر میشه به متد فوق داد.
حالا که همه چیز مشخصه، کافیه هر وقت میخواید TaskItem رو با setProgress مقدار دهی کنید.

کد :

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TaskBar;
import org.eclipse.swt.widgets.TaskItem;

public class Main {

public Main() {
Display display = new Display();
Shell shell = new Shell(display);
shell.open();

// to do
TaskBar systemTaskBar = display.getSystemTaskBar();
TaskItem item = systemTaskBar.getItem(shell);
item.setProgressState(SWT.NORMAL);
item.setProgress(30);

while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.close();
}

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

}

dasssnj
شنبه 25 مرداد 1393, 19:47 عصر
خیلی خیلی ممنون . نزدیک بود خودم یه dll براش بسازم ولی کارم خیلی راحت شد. آخه توی Qt و C++ قبلا باهاش کار کرده بودم .

محمد فدوی
شنبه 25 مرداد 1393, 22:50 عصر
اگه خیلی به استفاده از قابلیت های وابسته به پلتفرم توی جاوا علاقه دارین دیر یا زود باید کار با BridJ (https://code.google.com/p/bridj/) رو شروع کنید (برای ورود به صفحه ش باید از تحریم Google Code عبور کنید)
نمونه کد هم توی اینترنت زیاده. برای ایجاد Taskbar Progress هم با BridJ این صفحه (http://nativelibs4java.sourceforge.net/bridj/api/stable/org/bridj/cpp/com/shell/ITaskbarList3.html) رو ببین.

اما در کل به نظرم Java برای انجام چنین مقاصدی ساخته نشده. Java برای اولین بار شعار WORA (http://en.wikipedia.org/wiki/Write_once,_run_anywhere) رو مطرح کرد هنوزم سردمدارشه!
اگر قصد دارین از همه ی قابلیت های توکار Microsoft Windows (مثل Taskbar Progress، Aero Glass و ...) استفاده کنین به نظرم به فریموورکی مثل NET. مهاجرت کنید.

dasssnj
یک شنبه 26 مرداد 1393, 17:03 عصر
اگه این از این لایبری استفاده کنم برنامم روی لینوکس کرش میکنه؟ روی ویندوز اکس پی کرش می کنه ؟ یا فقط کار نمی کنه؟

dasssnj
چهارشنبه 29 مرداد 1393, 05:53 صبح
آقا یه مشکلی هست:
اینکه خودش یه پنجره باز می کنه . من می خوام پروگرس برای Jframe باشه نه پنجره ای که swt باز کرده.

محمد فدوی
چهارشنبه 29 مرداد 1393, 17:10 عصر
اینکه خودش یه پنجره باز می کنه . من می خوام پروگرس برای Jframe باشه نه پنجره ای که swt باز کرده.

راه حلی که مطرح شده به شرطیه که کلا از SWT به عنوان UI Framework توی برنامه ت استفاده کنی. اگه میخوای از Swing استفاده کنی به نظرم از راه های دیگه (مثلا BridJ استفاده کن)
راه هایی برای برقراری ارتباط بین Swing و SWT وجود داره. نمیدونم در این مورد هم میشه چنین کاری کرد یا نه...

dasssnj
چهارشنبه 29 مرداد 1393, 17:48 عصر
میشه در مورد این bridj توضیح بدید و لینک دانلود و سورس و ..... ؟

محمد فدوی
چهارشنبه 29 مرداد 1393, 20:24 عصر
همونطور که میدونی Java از JNI (http://en.wikipedia.org/wiki/Java_Native_Interface) برای ارتباطات سطح پایین پلتفرمی استفاده میکنه و اینم میدونی که خیلی سخت و طاقت فرساست استفاده ازش!‌

برای جبران این سختی و راحت تر شدن این نوع ارتباطات کتابخونه هایی مثل JNA (http://en.wikipedia.org/wiki/Java_Native_Access) و BridJ (http://www.bridj.com/) ارائه شدن.
JNA خیلی جا افتاده ست (و خیلی جاها جایگزین JNI‌ شده) اما چند تا محدودیت داره... البته برای کار تو که احتمالا فراخوانی یک یا چند تابع API از Win32 هستش مشکلی نداره.
BridJ یکم تازه وارده و داره تکمیل میشه ولی قابلیت های خوبی رو ارائه داده که خیلی از محدودیت های JNA رو از بین می بره.

برای کاری که میخوای انجام بدی به نظرم پایه ترین راه استفاده از یکی از این سه تاست! نحوه ی پیاده سازی Taskbar Progress توی MSDN (http://msdn.microsoft.com/en-us/default.aspx) توضیح داده شده. کاری که باید خودت انجام بدی اینه که APIهاش رو خودت با استفاده از JNA / JNI / BridJ فراخوانی کنی. من ویندوز ندارم وگرنه برات نمونه کد میذاشتم!

موفق باشی.