

importjava.awt.Point;
importjava.awt.event.MouseAdapter;
importjava.awt.event.MouseEvent;
importjava.awt.event.MouseMotionAdapter;
importjava.beans.PropertyChangeEvent;
importjava.beans.PropertyChangeListener;
importjava.util.HashMap;
importjava.util.Map;
importjavax.swing.Icon;
importjavax.swing.ImageIcon;
importjavax.swing.JPopupMenu;
importjavax.swing.JToggleButton;
importjavax.swing.event.PopupMenuEvent;
importjavax.swing.event.PopupMenuListener;
importorg.openide.util.Utilities;

/***//**
*JToggleButtonwithasmallarrowthatdisplayspopupmenuwhenclicked.
*
*@authorS.Aubrecht
*@since6.11
*/
classDropDownToggleButtonextendsJToggleButton...{
privatebooleanmouseInButton=false;
privatebooleanmouseInArrowArea=false;
privateMap<String,Icon>regIcons=newHashMap<String,Icon>(5);
privateMap<String,Icon>arrowIcons=newHashMap<String,Icon>(5);
privatestaticfinalStringICON_NORMAL="normal";//NOI18N
privatestaticfinalStringICON_PRESSED="pressed";//NOI18N
privatestaticfinalStringICON_ROLLOVER="rollover";//NOI18N
privatestaticfinalStringICON_ROLLOVER_SELECTED="rolloverSelected";//NOI18N
privatestaticfinalStringICON_SELECTED="selected";//NOI18N
privatestaticfinalStringICON_DISABLED="disabled";//NOI18N
privatestaticfinalStringICON_DISABLED_SELECTED="disabledSelected";//NOI18N
privatestaticfinalStringICON_ROLLOVER_LINE="rolloverLine";//NOI18N
privatestaticfinalStringICON_ROLLOVER_SELECTED_LINE="rolloverSelectedLine";//NOI18N
privatePopupMenuListenermenuListener;

/***//**CreatesanewinstanceofDropDownToggleButton*/
publicDropDownToggleButton(Iconicon,JPopupMenupopup)...{
assertnull!=icon;
putClientProperty(DropDownButtonFactory.PROP_DROP_DOWN_MENU,popup);
setIcon(icon);
resetIcons();

addPropertyChangeListener(DropDownButtonFactory.PROP_DROP_DOWN_MENU,newPropertyChangeListener()...{
publicvoidpropertyChange(PropertyChangeEvente)...{
resetIcons();
}
});

addMouseMotionListener(newMouseMotionAdapter()...{
publicvoidmouseMoved(MouseEvente)...{
if(null!=getPopupMenu())...{
mouseInArrowArea=isInArrowArea(e.getPoint());
updateRollover(_getRolloverIcon(),_getRolloverSelectedIcon());
}
}
});

addMouseListener(newMouseAdapter()...{
privatebooleanpopupMenuOperation=false;

publicvoidmousePressed(MouseEvente)...{
popupMenuOperation=false;
JPopupMenumenu=getPopupMenu();
if(menu!=null&&getModel()instanceofModel)...{
Modelmodel=(Model)getModel();
if(!model._isPressed())...{
if(isInArrowArea(e.getPoint())&&menu.getComponentCount()>0)...{
model._press();
menu.addPopupMenuListener(getMenuListener());
menu.show(DropDownToggleButton.this,0,getHeight());
popupMenuOperation=true;
}
}else...{
model._release();
menu.removePopupMenuListener(getMenuListener());
popupMenuOperation=true;
}
}
}
@Override
publicvoidmouseReleased(MouseEvente)...{
//Ifwedonesomethingwiththepopupmenu,weshouldconsume
//theevent,otherwisethebutton'sactionwillbetriggered.
if(popupMenuOperation)...{
popupMenuOperation=false;
e.consume();
}
}

publicvoidmouseEntered(MouseEvente)...{
mouseInButton=true;
if(hasPopupMenu())...{
mouseInArrowArea=isInArrowArea(e.getPoint());
updateRollover(_getRolloverIcon(),_getRolloverSelectedIcon());
}
}

publicvoidmouseExited(MouseEvente)...{
mouseInButton=false;
mouseInArrowArea=false;
if(hasPopupMenu())...{
updateRollover(_getRolloverIcon(),_getRolloverSelectedIcon());
}
}
});
setModel(newModel());
}

privatePopupMenuListenergetMenuListener()...{
if(null==menuListener)...{
menuListener=newPopupMenuListener()...{
publicvoidpopupMenuWillBecomeVisible(PopupMenuEvente)...{
}

publicvoidpopupMenuWillBecomeInvisible(PopupMenuEvente)...{
//Ifinsidethebuttonletthebutton'smouselistener
//dealwiththestate.Thepopupmenuwillbehiddenand
//weshouldnotshowitagain.
if(!mouseInButton)...{
if(getModel()instanceofModel)...{
((Model)getModel())._release();
}
JPopupMenumenu=getPopupMenu();
if(null!=menu)...{
menu.removePopupMenuListener(this);
}
}
}

publicvoidpopupMenuCanceled(PopupMenuEvente)...{
}
};
}
returnmenuListener;
}

privatevoidupdateRollover(Iconrollover,IconrolloverSelected)...{
super.setRolloverIcon(rollover);
super.setRolloverSelectedIcon(rolloverSelected);
}

privatevoidresetIcons()...{
Iconicon=regIcons.get(ICON_NORMAL);
if(null!=icon)
setIcon(icon);
icon=regIcons.get(ICON_PRESSED);
if(null!=icon)
setPressedIcon(icon);
icon=regIcons.get(ICON_ROLLOVER);
if(null!=icon)
setRolloverIcon(icon);
icon=regIcons.get(ICON_ROLLOVER_SELECTED);
if(null!=icon)
setRolloverSelectedIcon(icon);
icon=regIcons.get(ICON_SELECTED);
if(null!=icon)
setSelectedIcon(icon);
icon=regIcons.get(ICON_DISABLED);
if(null!=icon)
setDisabledIcon(icon);
icon=regIcons.get(ICON_DISABLED_SELECTED);
if(null!=icon)
setDisabledSelectedIcon(icon);
}

privateIcon_getRolloverIcon()...{
Iconicon=null;
icon=arrowIcons.get(mouseInArrowArea?ICON_ROLLOVER:ICON_ROLLOVER_LINE);
if(null==icon)...{
Iconorig=regIcons.get(ICON_ROLLOVER);
if(null==orig)
orig=regIcons.get(ICON_NORMAL);
icon=newIconWithArrow(orig,!mouseInArrowArea);
arrowIcons.put(mouseInArrowArea?ICON_ROLLOVER:ICON_ROLLOVER_LINE,icon);
}
returnicon;
}

privateIcon_getRolloverSelectedIcon()...{
Iconicon=null;
本文介绍了一种使用Java Swing实现带有下拉箭头按钮的自定义组件的方法。该组件允许通过点击按钮显示弹出菜单,并根据鼠标位置智能调整外观状态。
7408

被折叠的 条评论
为什么被折叠?



