Java 是否将垂直滚动添加到JPOppMenu?
我想添加一种在Java 是否将垂直滚动添加到JPOppMenu?,java,swing,jpopupmenu,Java,Swing,Jpopupmenu,我想添加一种在jpopmenu中滚动菜单项的方法,就像在JComboBox中滚动项目列表一样 假设我有10个菜单项。我想一次只显示5个菜单项,我会使用jpopmpmenu底部或顶部的垂直滚动按钮来显示未列出的菜单项,并隐藏我刚才看到的菜单项 可能吗?我正在使用JIDE软件的JideSplitButton,单击时会显示jpopmpmenu。我试图保持我放置了JideSplitButton的命令栏的外观,因此我不想用JComboBox替换它,除非我真的必须这样做。可能是这样的 基本上,您可以将任何J
jpopmenu
中滚动菜单项的方法,就像在JComboBox
中滚动项目列表一样
假设我有10个菜单项。我想一次只显示5个菜单项,我会使用jpopmpmenu
底部或顶部的垂直滚动按钮来显示未列出的菜单项,并隐藏我刚才看到的菜单项
可能吗?我正在使用JIDE软件的JideSplitButton
,单击时会显示jpopmpmenu
。我试图保持我放置了JideSplitButton
的命令栏的外观,因此我不想用JComboBox
替换它,除非我真的必须这样做。可能是这样的
基本上,您可以将任何JComponents添加到JPOppMenu,您可以通过将JPanel/JList与其他JComponents嵌套,将JScrollpane添加到JPopup 请注意,但有一条规定,SwingGUI不允许同时出现两个轻量级弹出窗口,最好的例子是
您已经查看了JWindow,创建一次并将其重新用于另一个操作,没有什么比检查弹出式JWindow如何真正适用于它更好的了。下面是我使用滚动条创建的一个版本。这只是一个简单的示例,因此请根据需要进行调整:
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import javax.swing.JPopupMenu;
import javax.swing.JScrollBar;
public class JScrollPopupMenu extends JPopupMenu {
protected int maximumVisibleRows = 10;
public JScrollPopupMenu() {
this(null);
}
public JScrollPopupMenu(String label) {
super(label);
setLayout(new ScrollPopupMenuLayout());
super.add(getScrollBar());
addMouseWheelListener(new MouseWheelListener() {
@Override public void mouseWheelMoved(MouseWheelEvent event) {
JScrollBar scrollBar = getScrollBar();
int amount = (event.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL)
? event.getUnitsToScroll() * scrollBar.getUnitIncrement()
: (event.getWheelRotation() < 0 ? -1 : 1) * scrollBar.getBlockIncrement();
scrollBar.setValue(scrollBar.getValue() + amount);
event.consume();
}
});
}
private JScrollBar popupScrollBar;
protected JScrollBar getScrollBar() {
if(popupScrollBar == null) {
popupScrollBar = new JScrollBar(JScrollBar.VERTICAL);
popupScrollBar.addAdjustmentListener(new AdjustmentListener() {
@Override public void adjustmentValueChanged(AdjustmentEvent e) {
doLayout();
repaint();
}
});
popupScrollBar.setVisible(false);
}
return popupScrollBar;
}
public int getMaximumVisibleRows() {
return maximumVisibleRows;
}
public void setMaximumVisibleRows(int maximumVisibleRows) {
this.maximumVisibleRows = maximumVisibleRows;
}
public void paintChildren(Graphics g){
Insets insets = getInsets();
g.clipRect(insets.left, insets.top, getWidth(), getHeight() - insets.top - insets.bottom);
super.paintChildren(g);
}
protected void addImpl(Component comp, Object constraints, int index) {
super.addImpl(comp, constraints, index);
if(maximumVisibleRows < getComponentCount()-1) {
getScrollBar().setVisible(true);
}
}
public void remove(int index) {
// can't remove the scrollbar
++index;
super.remove(index);
if(maximumVisibleRows >= getComponentCount()-1) {
getScrollBar().setVisible(false);
}
}
public void show(Component invoker, int x, int y){
JScrollBar scrollBar = getScrollBar();
if(scrollBar.isVisible()){
int extent = 0;
int max = 0;
int i = 0;
int unit = -1;
int width = 0;
for(Component comp : getComponents()) {
if(!(comp instanceof JScrollBar)) {
Dimension preferredSize = comp.getPreferredSize();
width = Math.max(width, preferredSize.width);
if(unit < 0){
unit = preferredSize.height;
}
if(i++ < maximumVisibleRows) {
extent += preferredSize.height;
}
max += preferredSize.height;
}
}
Insets insets = getInsets();
int widthMargin = insets.left + insets.right;
int heightMargin = insets.top + insets.bottom;
scrollBar.setUnitIncrement(unit);
scrollBar.setBlockIncrement(extent);
scrollBar.setValues(0, heightMargin + extent, 0, heightMargin + max);
width += scrollBar.getPreferredSize().width + widthMargin;
int height = heightMargin + extent;
setPopupSize(new Dimension(width, height));
}
super.show(invoker, x, y);
}
protected static class ScrollPopupMenuLayout implements LayoutManager{
@Override public void addLayoutComponent(String name, Component comp) {}
@Override public void removeLayoutComponent(Component comp) {}
@Override public Dimension preferredLayoutSize(Container parent) {
int visibleAmount = Integer.MAX_VALUE;
Dimension dim = new Dimension();
for(Component comp :parent.getComponents()){
if(comp.isVisible()) {
if(comp instanceof JScrollBar){
JScrollBar scrollBar = (JScrollBar) comp;
visibleAmount = scrollBar.getVisibleAmount();
}
else {
Dimension pref = comp.getPreferredSize();
dim.width = Math.max(dim.width, pref.width);
dim.height += pref.height;
}
}
}
Insets insets = parent.getInsets();
dim.height = Math.min(dim.height + insets.top + insets.bottom, visibleAmount);
return dim;
}
@Override public Dimension minimumLayoutSize(Container parent) {
int visibleAmount = Integer.MAX_VALUE;
Dimension dim = new Dimension();
for(Component comp : parent.getComponents()) {
if(comp.isVisible()){
if(comp instanceof JScrollBar) {
JScrollBar scrollBar = (JScrollBar) comp;
visibleAmount = scrollBar.getVisibleAmount();
}
else {
Dimension min = comp.getMinimumSize();
dim.width = Math.max(dim.width, min.width);
dim.height += min.height;
}
}
}
Insets insets = parent.getInsets();
dim.height = Math.min(dim.height + insets.top + insets.bottom, visibleAmount);
return dim;
}
@Override public void layoutContainer(Container parent) {
Insets insets = parent.getInsets();
int width = parent.getWidth() - insets.left - insets.right;
int height = parent.getHeight() - insets.top - insets.bottom;
int x = insets.left;
int y = insets.top;
int position = 0;
for(Component comp : parent.getComponents()) {
if((comp instanceof JScrollBar) && comp.isVisible()) {
JScrollBar scrollBar = (JScrollBar) comp;
Dimension dim = scrollBar.getPreferredSize();
scrollBar.setBounds(x + width-dim.width, y, dim.width, height);
width -= dim.width;
position = scrollBar.getValue();
}
}
y -= position;
for(Component comp : parent.getComponents()) {
if(!(comp instanceof JScrollBar) && comp.isVisible()) {
Dimension pref = comp.getPreferredSize();
comp.setBounds(x, y, width, pref.height);
y += pref.height;
}
}
}
}
}
导入java.awt.Component;
导入java.awt.Container;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Insets;
导入java.awt.LayoutManager;
导入java.awt.event.AdjustmentEvent;
导入java.awt.event.AdjustmentListener;
导入java.awt.event.mouseweelEvent;
导入java.awt.event.MouseWheelListener;
导入javax.swing.jpopmenu;
导入javax.swing.JScrollBar;
公共类JScrollPopupMenu扩展了JPOppMenu{
受保护的int maximumVisibleRows=10;
公共JScrollPopupMenu(){
这个(空);
}
公共JScrollPopupMenu(字符串标签){
超级(标签);
setLayout(新的ScrollPopupMenuLayout());
super.add(getScrollBar());
addMouseWheelListener(新的MouseWheelListener(){
@覆盖公共无效mouseWheelMoved(MouseWheelEvent事件){
JScrollBar scrollBar=getScrollBar();
int amount=(event.getScrollType()==mouseweelEvent.WHEEL\u UNIT\u SCROLL)
?event.getUnitsToScroll()*滚动条.getUnitIncrement()
:(event.getWheelRotation()<0?-1:1)*滚动条.getBlockIncrement();
scrollBar.setValue(scrollBar.getValue()+金额);
event.consume();
}
});
}
私人JScrollBar popupScrollBar;
受保护的JScrollBar getScrollBar(){
if(popupScrollBar==null){
popupScrollBar=新的JScrollBar(JScrollBar.VERTICAL);
addAdjustmentListener(新的AdjustmentListener(){
@覆盖公共无效调整值更改(调整事件e){
doLayout();
重新油漆();
}
});
popupScrollBar.setVisible(false);
}
返回弹出式滚动条;
}
public int getMaximumVisibleRows(){
返回maximumVisibleRows;
}
公共无效设置maximumVisibleRows(int maximumVisibleRows){
this.maximumVisibleRows=maximumVisibleRows;
}
公共儿童(图g){
Insets Insets=getInsets();
g、 clipRect(insets.left、insets.top、getWidth()、getHeight()-insets.top-insets.bottom);
超级儿童(g);
}
受保护的void addImpl(组件组件、对象约束、整数索引){
super.addImpl(comp,constraints,index);
if(maximumVisibleRows=getComponentCount()-1){
getScrollBar().setVisible(false);
}
}
公共void显示(组件调用程序,int x,int y){
JScrollBar scrollBar=getScrollBar();
if(scrollBar.isVisible()){
整数范围=0;
int max=0;
int i=0;
整数单位=-1;
整数宽度=0;
对于(组件comp:getComponents()){
如果(!(JScrollBar的组件实例)){
维度preferredSize=comp.getPreferredSize();
宽度=数学最大值(宽度,首选大小宽度);
如果(单位<0){
单位=首选尺寸。高度;
}
if(i++import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.MenuElement;
import javax.swing.UIManager;
import javax.swing.plaf.MenuItemUI;
import javax.swing.plaf.PopupMenuUI;
import java.awt.Component;
import java.awt.ComponentOrientation;
public class JScrollMenu extends JMenu {
// Covers the one in the JMenu because the method that creates it in JMenu is private
/** The popup menu portion of the menu.*/
private JPopupMenu popupMenu;
/**
* Constructs a new <code>JMenu</code> with no text.
*/
public JScrollMenu() {
this("");
}
/**
* Constructs a new <code>JMenu</code> with the supplied string as its text.
*
* @param s the text for the menu label
*/
public JScrollMenu(String s) {
super(s);
}
/**
* Constructs a menu whose properties are taken from the <code>Action</code> supplied.
*
* @param a an <code>Action</code>
*/
public JScrollMenu(Action a) {
this();
setAction(a);
}
/**
* Lazily creates the popup menu. This method will create the popup using the <code>JScrollPopupMenu</code> class.
*/
protected void ensurePopupMenuCreated() {
if(popupMenu == null) {
this.popupMenu = new JScrollPopupMenu();
popupMenu.setInvoker(this);
popupListener = createWinListener(popupMenu);
}
}
//////////////////////////////
//// All of these methods are necessary because ensurePopupMenuCreated() is private in JMenu
//////////////////////////////
@Override
public void updateUI() {
setUI((MenuItemUI) UIManager.getUI(this));
if(popupMenu != null) {
popupMenu.setUI((PopupMenuUI) UIManager.getUI(popupMenu));
}
}
@Override
public boolean isPopupMenuVisible() {
ensurePopupMenuCreated();
return popupMenu.isVisible();
}
@Override
public void setMenuLocation(int x, int y) {
super.setMenuLocation(x, y);
if(popupMenu != null) {
popupMenu.setLocation(x, y);
}
}
@Override
public JMenuItem add(JMenuItem menuItem) {
ensurePopupMenuCreated();
return popupMenu.add(menuItem);
}
@Override
public Component add(Component c) {
ensurePopupMenuCreated();
popupMenu.add(c);
return c;
}
@Override
public Component add(Component c, int index) {
ensurePopupMenuCreated();
popupMenu.add(c, index);
return c;
}
@Override
public void addSeparator() {
ensurePopupMenuCreated();
popupMenu.addSeparator();
}
@Override
public void insert(String s, int pos) {
if(pos < 0) {
throw new IllegalArgumentException("index less than zero.");
}
ensurePopupMenuCreated();
popupMenu.insert(new JMenuItem(s), pos);
}
@Override
public JMenuItem insert(JMenuItem mi, int pos) {
if(pos < 0) {
throw new IllegalArgumentException("index less than zero.");
}
ensurePopupMenuCreated();
popupMenu.insert(mi, pos);
return mi;
}
@Override
public JMenuItem insert(Action a, int pos) {
if(pos < 0) {
throw new IllegalArgumentException("index less than zero.");
}
ensurePopupMenuCreated();
JMenuItem mi = new JMenuItem(a);
mi.setHorizontalTextPosition(JButton.TRAILING);
mi.setVerticalTextPosition(JButton.CENTER);
popupMenu.insert(mi, pos);
return mi;
}
@Override
public void insertSeparator(int index) {
if(index < 0) {
throw new IllegalArgumentException("index less than zero.");
}
ensurePopupMenuCreated();
popupMenu.insert(new JPopupMenu.Separator(), index);
}
@Override
public void remove(JMenuItem item) {
if(popupMenu != null){
popupMenu.remove(item);
}
}
@Override
public void remove(int pos) {
if(pos < 0) {
throw new IllegalArgumentException("index less than zero.");
}
if(pos > getItemCount()) {
throw new IllegalArgumentException("index greater than the number of items.");
}
if(popupMenu != null){
popupMenu.remove(pos);
}
}
@Override
public void remove(Component c) {
if(popupMenu != null){
popupMenu.remove(c);
}
}
@Override
public void removeAll() {
if(popupMenu != null){
popupMenu.removeAll();
}
}
@Override
public int getMenuComponentCount() {
return (popupMenu == null) ? 0 : popupMenu.getComponentCount();
}
@Override
public Component getMenuComponent(int n) {
return (popupMenu == null) ? null : popupMenu.getComponent(n);
}
@Override
public Component[] getMenuComponents() {
return (popupMenu == null) ? new Component[0] : popupMenu.getComponents();
}
@Override
public JPopupMenu getPopupMenu() {
ensurePopupMenuCreated();
return popupMenu;
}
@Override
public MenuElement[] getSubElements() {
return popupMenu == null ? new MenuElement[0] : new MenuElement[]{popupMenu};
}
@Override
public void applyComponentOrientation(ComponentOrientation o) {
super.applyComponentOrientation(o);
if(popupMenu != null) {
int ncomponents = getMenuComponentCount();
for(int i = 0; i < ncomponents; ++i) {
getMenuComponent(i).applyComponentOrientation(o);
}
popupMenu.setComponentOrientation(o);
}
}
@Override
public void setComponentOrientation(ComponentOrientation o) {
super.setComponentOrientation(o);
if(popupMenu != null) {
popupMenu.setComponentOrientation(o);
}
}
}