我遇到以下問題,它是java提供的oracle表單框架和自定義實現類的獨有功能。我修改了一個VButton
來顯示一個自定義菜單,只要我按下鼠標右鍵。處理Oracle中的按鈕單擊窗體編程實現類
以下是通過繼承VButton
並提供自定義行爲完成的。
彈出窗口將顯示JPopupMenu
。這個JPopupMenu
將動態填充HashMap<String, JMenuItem>
,它表示這個JPopupMenu中的每個選項,它代表關鍵。爲了做到這一點,我寫了一個抽象類,其中包含了需要完成的一切,以創建一個自定義右鍵單擊菜單,使用兩種抽象方法。這些方法將被該類的子類覆蓋,並將爲Map
創建兩個代表鍵列表,並且它們代表JMenuItem
。
這是如何設計抽象類的。
public abstract class AbstractRightClickButton extends VButton{
// The PopupMenu for this item;
private JPopupMenu popup = new JPopupMenu();
// The HashMap that stores the Menuitems and it´s keys
private HashMap<String, JMenuItem> menuItems = new HashMap<String, JMenuItem>();
// Stores the current selected key.
private String choice= "";
public AbstractRightClickButton() {
this.menuItems = generateHashmap();
initMouseListener();
initPopUp();
}
// Abstract method to create an ArrayList of all JMenuItem
public abstract ArrayList<JMenuItem> generateJMenuItemSide();
// Abstract method to create an ArrayList for each key in the HashMap
public abstract ArrayList<String> generateStringSide();
private void initPopUp() {
ArrayList<String> list = generateStringSide();
for (String counter : list) {
popup.add(menuItems.get(counter));
}
}
private void initMouseListener() {
this.addMouseListener(new MouseListener() {
public void mousePressed(MouseEvent e) {
if(SwingUtilities.isRightMouseButton(e)) {
// If the width of the popup is 0 then it wasn´t displayed yet. Just show it once and make it invisible again to get the width and height of the popup.
if (popup.getWidth() == 0) {
popup.show(AbstractRightClickButton.this, AbstractRightClickButton.this.getWidth(), 0);
popup.setVisible(false);
}
popup.show(AbstractRightClickButton.this, AbstractRightClickButton.this.getWidth()-popup.getWidth(), 0);
}
}
public void mouseExited(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
});
protected HashMap<String, JMenuItem> generateHashmap() {
HashMap<String, JMenuItem> map = new HashMap<String, JMenuItem>();
ArrayList<String> key = generateStringSide();
ArrayList<JMenuItem> value = generateJMenuItemSide();
for (int i = 0;i < key.size();++i) {
map.put(key.get(i), value.get(i));
}
return map;
};
// This method is a helper method that can be called by subclasses of AbstractRightClickButton
// It creates a JMenutButton based on the parameter
protected JMenuItem generateJMenuItem(final String key, final boolean click) {
JMenuItem item = new JMenuItem(new AbstractAction(key) {
@Override
public void actionPerformed(ActionEvent e) {
choice = key;
if (click) {
ActionEvent act = new ActionEvent((Object)AbstractRightClickButton.this, ActionEvent.ACTION_PERFORMED, ""); // Button Event erstellen
AbstractRightClickButton.this.processEvent(act); // Event Processen um den Buttondruck Formsseitig auch auszulösen
}
}
});
return item;
}
}
一個具體的類看起來像這樣
public class ConcreteRightClickButton extends AbstractRightClickButton{
@Override
public ArrayList<String> generateStringSide() {
ArrayList<String> basis = new ArrayList<String>(0);
basis.add("OPTION1");
basis.add("OPTION2");
return basis;
}
@Override
public ArrayList<JMenuItem> generateJMenuItemSide() {
ArrayList<JMenuItem> basis = new ArrayList<JMenuItem>(0);
basis.add(generateJMenuItem("OPTION1", true));
basis.add(generateJMenuItem("OPTION2", true));
return basis;
}
}
我面臨的問題在於按鍵的類型,這個按鈕被espacially如何在形式製造商定義。如果按鈕屬性iconic
定義爲No
,則AbstractRightClickButton.this.processEvent(act)
的調用將正確處理此事件,並且可以由Oracle Forms中的When-Button-Pressed
事件處理。但是如果按鈕屬性iconic
被定義爲Yes
那麼事件的處理以某種方式不起作用。雖然調試一切看起來很好,但沒有任何例外,它可以毫無問題地達到AbstractRightClickButton.this.processEvent(act)
。但Oracle Forms中的代表When-Button-Pressed
觸發器沒有反應。我是否正確處理事件或者是否有其他方法阻止oracle表單接收此事件?
我正在使用Oracle forms 11g
創建一個包含此特定按鈕的遮罩。
請提供完整(但最少)的示例,說明如何應用您的建議,並從鏈接的資源中添加相關引用。 –