Using Netbean's Desktop Application's status bar
I would like to know a way to actually make the status bar that is provided by netbeans when you create a desktop application work, but I don't really understand how.
I am including the code below so everyone can understand what I mean and where to find it in netbeans.
// status bar initialization - message timeout, idle icon and busy animation, etc
ResourceMap resourceMap = getResourceMap();
int messageTimeout = resourceMap.getInteger(
"StatusBar.messageTimeout");
messageTimer = new Timer(messageTimeout,
new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
statusMessageLabel.setText("");
}
});
messageTimer.setRepeats(false);
int busyAnimationRate = resourceMap.getInteger(
"StatusBar.busyAnimationRate");
for (int i = 0; i < busyIcons.length; i++)
{
busyIcons[i] = resourceMap.getIcon(
"StatusBar.busyIcons[" + i + "]");
}
busyIconTimer = new Timer(busyAnimationRate,
new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
busyIconIndex = (busyIconIndex + 1) % busyIcons.length;
statusAnimationLabel.setIcon(busyIcons[busyIconIndex]);
}
});
idleIcon = resourceMap.getIcon("StatusBar.idleIcon");
statusAnimationLabel.setIcon(idleIcon);
progressBar.setVisible(false);
// connecting action tasks to status bar via TaskMonitor
TaskMonitor taskMonitor = new TaskMonitor(
getApplication().getContext());
taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener()
{
@Override
public void propertyChange(
java.beans.PropertyChangeEvent evt)
{
String propertyName = evt.getPropertyName();
if ("started".equals(propertyName))
{
if (!busyIconTimer.isRunning())
{
statusAnimationLabel.setIcon(busyIcons[0]);
busyIconIndex = 0;
busyIconTimer.start();
}
progressBar.setVisible(true);
progressBar.setIndeterminate(true);
} else if ("done".equals(propertyName))
{
busyIconTimer.stop();
statusAnimationLabel.setIcon(idleIcon);
progressBar.setVisible(false);
progressBar.setValue(0);
} else if ("message".equals(propertyName))
{
String text = (String) (evt.getNewValue());
statusMessageLabel.setText(
(text == null) ? "" : text);
messageTimer.restart();
} else if ("progress".equals(propertyName))
{
int value = (Integer) (evt.getNewValue());
progressBar.setVisible(true);
progressBar.setIndeterminate(false);
progressBar.setValue(value);
}
开发者_如何学JAVA}
});
I understand that ir probably has to do with the TaskMonitor
but I cannot get it. :(
If you just want to update the text in the status bar, use:
StatusDisplayer.getDefault().setStatusText("Hello World!");
If you want to use a custom Component (like in your example), you need to create a new class. It will automatically register itself:
@ServiceProvider(service=StatusLineElementProvider.class, position=18)
public class TestStatusLineElementProvider implements StatusLineElementProvider {
private JLabel statusMessageLabel = new JLabel("Hello World!");
@Override
public Component getStatusLineElement() {
return statusMessageLabel;
}
}
This is one of those unreasonably complicated things to do in Java. But it is doable. The NetBeans code expects you to put your executable code in a Task, attached to the TaskMonitor, and then it will work. Here is the example which worked for me:
@Action
public void myTaskButtonAction() { // this action is called from a menu item or a button
startMyTaskAction();
}
@Action
public Task startMyTaskAction() { // this sets up the Task and TaskMonitor
StartMyTask task = new StartMyTask(org.jdesktop.application.Application.getInstance());
ApplicationContext C = getApplication().getContext();
TaskMonitor M = C.getTaskMonitor();
TaskService S = C.getTaskService();
S.execute(task);
M.setForegroundTask(task);
return task;
}
private class StartMyTask extends Task<Void, Void> { // this is the Task
StartMyTask(org.jdesktop.application.Application app) {
super(app);
}
@Override
protected Void doInBackground() {
try {
// specific code for your task
// this code shows progress bar with status message for a few seconds
setMessage("starting up");// status message
for(int progress=0; progress<100; progress += (int)(Math.random()*10)) {
setProgress(progress); // progress bar (0-100)
setMessage("prog: "+progress); // status message
try {
Thread.sleep((long)500); // sleep 500ms
} catch (InterruptedException ignore) {
}
}
setMessage("done");// status message
}
catch(java.lang.Exception e) {
//specific code for exceptions
}
return null;
}
protected void succeeded() {
}
}
精彩评论