メニューの内容を更新できるように、メニューがいつ展開されるかを知る必要があるプログラムに取り組んでいます(現在利用可能なシリアルポートがリストされています)。私は SWT を使用しており、親メニュー項目 Arm Event のリスナーをセットアップしています。
私が欲しいものを示すためにデモプログラムを作成しました。
package test.window;
import org.eclipse.swt.SWT;
public class Test {
protected Shell shell;
/**
* Launch the application.
* @param args
*/
public static void main(String[] args) {
try {
Test window = new Test();
window.open();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Open the window.
*/
public void open() {
Display display = Display.getDefault();
createContents();
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
/**
* Create contents of the window.
*/
protected void createContents() {
shell = new Shell();
shell.setSize(450, 300);
shell.setText("SWT Application");
Menu menu = new Menu(shell, SWT.BAR);
shell.setMenuBar(menu);
MenuItem mntmNewSubmenu = new MenuItem(menu, SWT.CASCADE);
mntmNewSubmenu.setText("New SubMenu");
Menu menu_1 = new Menu(mntmNewSubmenu);
mntmNewSubmenu.setMenu(menu_1);
MenuItem mntmItem = new MenuItem(menu_1, SWT.NONE);
mntmItem.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
System.out.println("Item 1 selected");
}
});
mntmItem.setText("Item 1");
MenuItem mntmPorts = new MenuItem(menu_1, SWT.CASCADE);
mntmPorts.addArmListener(new ArmListener() {
public void widgetArmed(ArmEvent arg0) {
System.out.println("Ports armed");
}
});
mntmPorts.setText("Ports");
Menu menu_2 = new Menu(mntmPorts);
mntmPorts.setMenu(menu_2);
MenuItem mntmPort = new MenuItem(menu_2, SWT.NONE);
mntmPort.addArmListener(new ArmListener() {
public void widgetArmed(ArmEvent arg0) {
System.out.println("Port 1 armed");
}
});
mntmPort.setText("Port 1");
mntmPort.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
System.out.println("Port 1 selected");
}
});
MenuItem mntmPort_1 = new MenuItem(menu_2, SWT.NONE);
mntmPort_1.setText("Port 2");
mntmPort_1.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
System.out.println("Port 2 selected");
}
});
MenuItem mntmItem_1 = new MenuItem(menu_1, SWT.NONE);
mntmItem_1.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
System.out.println("Item 2 selected");
}
});
mntmItem_1.setText("Item 2");
}
}
メニュー項目「Port 1」と「Port 2」が表示される直前に「Ports armed」が表示されると思います。これにより、私のプログラムは、「ポート 1」と「ポート 2」が実際に何であるかを変更する機会が得られます。
私にとって、「武装したポート」は決してプリンターではありません(「武装したポート1」でもありません)が、アイテムがクリックされると選択イベントが発生します。
これをUbuntu 13.04でテストしています。