/*本方法建立inner class PopupPanel,这个类继承JPanel并实现MouseListener,PopupMenuListener,ActionListener和
*ActionListener等3个Listener。MouseListener为处理鼠标事件的Listener,PopupMenuListener为Popup菜单事件的Listener,
*ActionListener则是大家最熟悉用来处理JMenuItem事件的Listener。
*/
class PopupPanel extends JPanel implements MouseListener,PopupMenuListener,ActionListener{
public PopupPanel(){
Popup=new JPopupMenu();//new一个新的JPopupMenu
JMenuItem theItem;
//分别建立四个JMenuItem和其事件处理模式将JMenuItem加入JPopupMenu中
Popup.add(theItem=new JMenuItem("Cut",new ImageIcon("3.gif")));//建立JMenuItem组件
theItem.addActionListener(this);//将JMenuItem组件加入事件处理模式
Popup.add(theItem=new JMenuItem("Copy",new ImageIcon("3.gif")));
theItem.addActionListener(this);
Popup.add(theItem=new JMenuItem("Paste",new ImageIcon("3.gif")));
theItem.addActionListener(this);
Popup.addSeparator();//在JPopupMenu中加入分隔线,我们在前面提到的JPopupMenu和Menu大致上的
//性质是一样的,所以在JPopupMenu中一样是以JMenuItem来当作选项的组件
Popup.add(theItem=new JMenuItem("Page Setup..."));
theItem.addActionListener(this);
//利用setBorder()方法将BevelBorder类当作参数传入,使用JPopupMenu产生立体边框浮起的效果,我们
//也可以将参数设置改为BevelBorder.LOWERED使得JPopupMenu产生立体边框凹陷的效果。
Popup.setBorder(new BevelBorder(BevelBorder.RAISED));
Popup.addPopupMenuListener(this);//将JPopupMenu组件加入PopupMenu事件处理模式中
addMouseListener(this);//将PopupPanel类加入Mouse事件处理模式中
theArea.addMouseListener(this);//后面有说明
}//end of PopupPanel()
/*由于PopupPanel这个inner class中实现了MouseListener,因此需要覆写mouseClicked(),mousePressed(),
*mouseRelesed(),mouseEntered()和mouseExited()等5个方法,在这个范例里当mouseClicked(),mousePressed()
*和mouseReleased()等3个方法被触发时会调用checkPopup()方法来判断是否要将PopupMenu输出来。
*/
public void mouseClicked(MouseEvent me){
checkPopup(me);
}
public void mousePressed(MouseEvent me){
checkPopup(me);
}
public void mouseReleased(MouseEvent me){
checkPopup(me);
}
public void mouseEntered(MouseEvent me){
}
public void mouseExited(MouseEvent me){
}
/*checkPopup()方法,其中,在程序中利用isPopupTrigger()方法判断PopupMenu是否已经输出。若没有,则在程序中利用
*show()方法将PopupMenu输出目前鼠标指针(利用getX()和getY()方法得知)的位置上。
*/
private void checkPopup(MouseEvent me){
if(me.isPopupTrigger()){
Popup.show(me.getComponent(),me.getX(),me.getY());
}
}//end of checkPopup()
/*由于PopupPanel这个inner class实现了PopupMenuListener,因此需要覆写popupMenuWillBecomeVisible(),
*popupMenuWillBecomeInvisible()方法和popupMenuCanceled()等3个方法,在这个范例里当这3个方法被触发
*后会在JTextArea中加入一个信息。
*/
public void popupMenuWillBecomeVisible(PopupMenuEvent pme){
theArea.append("- PopupMenu Visible! -\n");
}
public void popupMenuWillBecomeInvisible(PopupMenuEvent pme){
theArea.append("- PopupMenu Invisible! -\n");
}
public void popupMenuCanceled(PopupMenuEvent pme){
theArea.append("- PopupMenu Hidden! -\n");
}
//当某个JMenuItem被触发后会在JTextArea中加入一个信息
public void actionPerformed(ActionEvent ae){
theArea.append("+Popup "+ae.getActionCommand()+" performed!\n");
}
}//end of inner class PopupPanel
}//end of class JPopupMenu1
}
*ActionListener等3个Listener。MouseListener为处理鼠标事件的Listener,PopupMenuListener为Popup菜单事件的Listener,
*ActionListener则是大家最熟悉用来处理JMenuItem事件的Listener。
*/
class PopupPanel extends JPanel implements MouseListener,PopupMenuListener,ActionListener{
public PopupPanel(){
Popup=new JPopupMenu();//new一个新的JPopupMenu
JMenuItem theItem;
//分别建立四个JMenuItem和其事件处理模式将JMenuItem加入JPopupMenu中
Popup.add(theItem=new JMenuItem("Cut",new ImageIcon("3.gif")));//建立JMenuItem组件
theItem.addActionListener(this);//将JMenuItem组件加入事件处理模式
Popup.add(theItem=new JMenuItem("Copy",new ImageIcon("3.gif")));
theItem.addActionListener(this);
Popup.add(theItem=new JMenuItem("Paste",new ImageIcon("3.gif")));
theItem.addActionListener(this);
Popup.addSeparator();//在JPopupMenu中加入分隔线,我们在前面提到的JPopupMenu和Menu大致上的
//性质是一样的,所以在JPopupMenu中一样是以JMenuItem来当作选项的组件
Popup.add(theItem=new JMenuItem("Page Setup..."));
theItem.addActionListener(this);
//利用setBorder()方法将BevelBorder类当作参数传入,使用JPopupMenu产生立体边框浮起的效果,我们
//也可以将参数设置改为BevelBorder.LOWERED使得JPopupMenu产生立体边框凹陷的效果。
Popup.setBorder(new BevelBorder(BevelBorder.RAISED));
Popup.addPopupMenuListener(this);//将JPopupMenu组件加入PopupMenu事件处理模式中
addMouseListener(this);//将PopupPanel类加入Mouse事件处理模式中
theArea.addMouseListener(this);//后面有说明
}//end of PopupPanel()
/*由于PopupPanel这个inner class中实现了MouseListener,因此需要覆写mouseClicked(),mousePressed(),
*mouseRelesed(),mouseEntered()和mouseExited()等5个方法,在这个范例里当mouseClicked(),mousePressed()
*和mouseReleased()等3个方法被触发时会调用checkPopup()方法来判断是否要将PopupMenu输出来。
*/
public void mouseClicked(MouseEvent me){
checkPopup(me);
}
public void mousePressed(MouseEvent me){
checkPopup(me);
}
public void mouseReleased(MouseEvent me){
checkPopup(me);
}
public void mouseEntered(MouseEvent me){
}
public void mouseExited(MouseEvent me){
}
/*checkPopup()方法,其中,在程序中利用isPopupTrigger()方法判断PopupMenu是否已经输出。若没有,则在程序中利用
*show()方法将PopupMenu输出目前鼠标指针(利用getX()和getY()方法得知)的位置上。
*/
private void checkPopup(MouseEvent me){
if(me.isPopupTrigger()){
Popup.show(me.getComponent(),me.getX(),me.getY());
}
}//end of checkPopup()
/*由于PopupPanel这个inner class实现了PopupMenuListener,因此需要覆写popupMenuWillBecomeVisible(),
*popupMenuWillBecomeInvisible()方法和popupMenuCanceled()等3个方法,在这个范例里当这3个方法被触发
*后会在JTextArea中加入一个信息。
*/
public void popupMenuWillBecomeVisible(PopupMenuEvent pme){
theArea.append("- PopupMenu Visible! -\n");
}
public void popupMenuWillBecomeInvisible(PopupMenuEvent pme){
theArea.append("- PopupMenu Invisible! -\n");
}
public void popupMenuCanceled(PopupMenuEvent pme){
theArea.append("- PopupMenu Hidden! -\n");
}
//当某个JMenuItem被触发后会在JTextArea中加入一个信息
public void actionPerformed(ActionEvent ae){
theArea.append("+Popup "+ae.getActionCommand()+" performed!\n");
}
}//end of inner class PopupPanel
}//end of class JPopupMenu1
}
解决方案 »
- 关于动态代理模式,求解!!!
- JButton反序列化后,原来注册的事件不起作用了,要重新注册?
- String 转 Clob类型
- 等待解决中
- String类基本问题
- 急,有个小问题: jdk1.3 需要加那些包,才能对xml编程?
- IDE 怎么用!(小程序执行无结果)
- 请问 Swing中画梯形的方法是什么???
- Full thread dump Classic VM (Linux_JDK_1.2.2_RC2, native threads),Why?
- 为什么会出现这样的Exception?(Error occurred during initialization of VM;java/lang/ClassNotFoundException: sun/io/ByteToCharGBK)
- 求助:移植linux上的奇怪问题!
- java.util.logging.Logger中的log方法的执行行顺序?
JTextArea theArea = new JTextArea(); public PopupPanel(){
Popup=new JPopupMenu();//new一个新的JPopupMenu
JMenuItem theItem;
....
this.add(theArea); }