Translate this page...

BeanDev: Neuerer Neustart der NetBeans Platform

In einem älteren Blog für die platform8 hatte ich eine Möglichkeit ausgearbeitet eine RCP Anwendung neu zu starten.

Jesse Glick verweist auf eine Neuerung in 6.7 / 6.8 (für 6.8 wohl dann mit eigener API), die mit der Besonderheit des AutoUpdate Center arbeitet.

Jesse zeigt in diesem Issue die Kennzeichnung eines Neustarts:

File targetUserdir = new File(System.getProperty("netbeans.user"));
File restartFile = new File(targetUserdir, "var/restart");
if (!restartFile.exists()) {
restartFile.createNewFile();
}

Man muss also nur eine Datei namens restart in den var-Bereich schreiben und dann die Anwendung neu starten.

Der Neustart erfolgt wie gewohnt mit dem LifecycleManager.getDefault().exit().

Wenn man den Neustart nicht direkt per Action initiieren will, sondern als Vorschlag für den Anwender angezeigt werden soll, dann hat man mit der platform10 (seit NetBeans 6.7) noch ein zusätzliches nettes Feature. Man kann ein Icon in der Statuszeile einblenden lassen, der den User darüber informiert, dass es sinnvoll wäre die Anwendung einmal durchzustarten.

Hier ein adaptiertes Beispiel aus einem anderen Blog:

@org.openide.util.lookup.ServiceProvider(service=org.openide.awt.StatusLineElementProvider.class, position=610)
public class RestartNotification implements org.openide.awt.StatusLineElementProvider {
public Component getStatusLineElement () {
ImageIcon img = new ImageIcon (ImageUtilities.loadImage ("org/netbeans/modules/mymodule/restart.png", false));
JPanel p = new StatusLinePanel (img);
p.setVisible (false);
return p;
}

public static class StatusLinePanel extends JPanel {
private ImageIcon icon = null;
public StatusLinePanel (ImageIcon img) {
icon = img;
}

@Override
public void addNotify () {
this.addMouseListener (new MouseListener () {
public void mouseClicked (MouseEvent e) {
if (isVisible ()) {
File targetUserdir = new File(System.getProperty("netbeans.user"));
File restartFile = new File(targetUserdir, "var/restart");
if (!restartFile.exists()) {
restartFile.createNewFile();
}
LifecycleManager.getDefault().exit();
}
}
public void mousePressed (MouseEvent e) {}
public void mouseReleased (MouseEvent e) {}
public void mouseEntered (MouseEvent e) {}
public void mouseExited (MouseEvent e) {}
});
}

@Override
public void paint (java.awt.Graphics g) {
if (isVisible ()) {
icon.paintIcon (this, g, 0, 0);
}
}
}
}

Da RestartNotification von Applikations-Start an in der Statusbar registriert ist, wird diese erstmal mit setVisible (false) abgeschaltet. Wenn man den Neustart nun benötigt, holt man sich das Object aus dem globalen Lookup-Pool:

RestartNotification rn = Lookup.getDefault.lookup(RestartNotification.class);
rn.getStatusLineElement().setVisible(true);

Der Vorteil dieser neuen Methode ist, dass man keine OS-abhängigen Bestandteile mehr berücksichtigen muss. Auch muss man nicht mehr den Namen des Launchers kennen.

Beste Grüße,
  Josch.

http://www.netbeans-forum.de/ Da werden Sie geholfen:
Das deutsche NetBeans Forum

      NetBeans Dream Team Member

Hinterlasse eine Nachricht

Meine Informationen merken

CAPTCHA Bild zum Spamschutz 

[Valid RSS]