下拉菜单按钮

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值