2015-11-04 48 views
2

我遇到以下問題,它是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創建一個包含此特定按鈕的遮罩。

回答

0

1年8個月後,也許這不是一個「答案」,但它是一種替代方法來做同樣的事情。 創建一個擴展VBean的類,並創建一個JButton。

將jar添加到類路徑中,並在Bean區域內調用它。

它被稱爲java插件組件。

本頁面非常有用: JPC

編輯:

import java.awt.Color; 
import javax.swing.JButton; 
import oracle.forms.ui.VBean; 

public class TryButton extends VBean { 

    JButton button = new JButton(); 

    public TryButton() { 

     this.setSize(500, 500); 
     this.setVisible(true); 
     this.add(button); 
     button.setSize(500, 500); 
     button.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/imagen2.png"))); 
    } 

} 

然後,jar添加到:ORACLE_HOME /表格/ JAVA ,並將其添加到類路徑

在甲骨文形式一個新的畫布創建一個Bean區域 轉到Item Properties並將類包和名稱添加到:implementation class。

+0

請提供完整(但最少)的示例,說明如何應用您的建議,並從鏈接的資源中添加相關引用。 –