1

JMenuBar を作成したい。window-JFrame.width を小さくして JMenuBar のすべての JMenu を表示すると、JMenuBar に Button が表示され、非表示のすべての JMenu がドロップダウン リストで選択できるようになります。どうすればそれを理解できますか?

4

3 に答える 3

2

ここJToolBarに示されているを見てください。必要なレイアウトを使用でき、ほとんどの L&F ではバーをフローティング ウィンドウにすることができます。

于 2013-07-23T09:40:22.930 に答える
1

これは、5年前に遊んでいた古いコードです。あまりにも長い間、コードがどれだけうまく機能するかさえ覚えていません。これは JToolBar 用に設計されていますが、JMenuBar でこれを行う方法についていくつかのアイデアが得られるかもしれません。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
/**
*
* @author subanark
*/
public class PopupMenuLayout implements java.awt.LayoutManager
{
    private JPopupMenu popupMenu = new JPopupMenu();
    private JButton popupButton = new JButton(new PopupAction());

    /** Creates a new instance of PopupMenuLayout */
    public PopupMenuLayout()
    {
    }

    /** If the layout manager uses a per-component string,
    * adds the component <code>comp</code> to the layout,
    * associating it
    * with the string specified by <code>name</code>.
    *
    * @param name the string to be associated with the component
    * @param comp the component to be added
    */
    public void addLayoutComponent(String name, Component comp)
    {
    }

    /**
    * Lays out the specified container.
    * @param parent the container to be laid out
    */
    public void layoutContainer(Container parent)
    {
        //  Position all buttons in the container

        Insets insets = parent.getInsets();
        int x = insets.left;
        int y = insets.top;
        System.out.println("bottom: " + insets.bottom);
        int spaceUsed = insets.right + insets.left;

        for (int i = 0; i < parent.getComponentCount(); i++ )
        {
            Component aComponent = parent.getComponent(i);
            aComponent.setSize(aComponent.getPreferredSize());
            aComponent.setLocation(x,y);
            int componentWidth = aComponent.getPreferredSize().width;
            x += componentWidth;
            spaceUsed += componentWidth;
        }

        //  All the buttons won't fit, add extender button
        //  Note: the size of the extender button changes once it is added
        //  to the container. Add it here so correct width is used.

        int parentWidth = parent.getSize().width;

        if (spaceUsed > parentWidth)
        {
            popupMenu.removeAll();
            parent.add(popupButton);
            popupButton.setSize( popupButton.getPreferredSize() );
            int popupX = parentWidth - insets.right - popupButton.getSize().width;
            popupButton.setLocation(popupX, y );
            spaceUsed += popupButton.getSize().width;
        }

        //  Remove buttons that don't fit and add to the popup menu

//      System.out.println(spaceUsed + " ::: " + parentWidth);

        int lastVisibleButtonIndex = 1;

        while (spaceUsed > parentWidth)
        {
            lastVisibleButtonIndex++;
            int last = parent.getComponentCount() - lastVisibleButtonIndex;

            Component component = parent.getComponent( last );
            component.setVisible( false );
            spaceUsed -= component.getSize().width;

            addComponentToPopup(component);

//          popupButton.setLocation( button.getLocation() );
//          System.out.println(spaceUsed + "  :  " + parentWidth);
        }

    }

    private void addComponentToPopup(Component component)
    {
        System.out.println(component.getClass());

        if (component instanceof JButton)
        {
            JButton button = (JButton)component;
            JMenuItem menuItem = new JMenuItem(button.getText());
            menuItem.setIcon( button.getIcon() );

            ActionListener[] listeners = button.getActionListeners();

            for (int i = 0; i < listeners.length; i++)
                menuItem.addActionListener( listeners[i] );

            popupMenu.insert(menuItem, 0);
        }

        if (component instanceof JToolBar.Separator)
        {
            popupMenu.insert( new JSeparator(), 0);
        }
    }

    /**
    * Calculates the minimum size dimensions for the specified
    * container, given the components it contains.
    * @param parent the component to be laid out
    * @see #preferredLayoutSize
    */
    public Dimension minimumLayoutSize(Container parent)
    {
        return popupButton.getMinimumSize();
    }

    /** Calculates the preferred size dimensions for the specified
    * container, given the components it contains.
    * @param parent the container to be laid out
    *
    * @see #minimumLayoutSize
    */
    public Dimension preferredLayoutSize(Container parent)
    {
        //  Move all components to the container and remove the extender button

        parent.remove(popupButton);
/*
        while ( popupMenu.getComponentCount() > 0 )
        {
            Component aComponent = popupMenu.getComponent(0);
            popupMenu.remove(aComponent);
            parent.add(aComponent);
        }
*/
        //  Calculate the width of all components in the container

        Dimension d = new Dimension();
        d.width += parent.getInsets().right + parent.getInsets().left;

        for (int i = 0; i < parent.getComponents().length; i++)
        {
            Component component = parent.getComponent(i);
            component.setVisible( true );
            d.width += component.getPreferredSize().width;
            d.height = Math.max(d.height, component.getPreferredSize().height);
        }

//      d.height += parent.getInsets().top + parent.getInsets().bottom + 5;
        d.height += parent.getInsets().top + parent.getInsets().bottom;
        return d;
    }

    /** Removes the specified component from the layout.
    * @param comp the component to be removed
    */
    public void removeLayoutComponent(Component comp)
    {
    }

    protected class PopupAction extends AbstractAction
    {
        public PopupAction()
        {
            super(">>");
        }

        public void actionPerformed(ActionEvent e)
        {
            JComponent component = (JComponent)e.getSource();
            popupMenu.show(component,0,component.getHeight());
        }
    }

    public static void main(String[] argv)
    {
        ActionListener simpleAction = new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                System.out.println(e.getActionCommand());
            }
        };

        JToolBar toolBar = new JToolBar();
        toolBar.setLayout(new PopupMenuLayout());
        toolBar.add( createButton("one", simpleAction) );
        toolBar.add( createButton("two", simpleAction) );
        toolBar.add( createButton("three", simpleAction) );
        toolBar.add( createButton("four", simpleAction) );
        toolBar.add( createButton("five", simpleAction) );
        toolBar.add( createButton("six", simpleAction) );
        toolBar.addSeparator();
        toolBar.add( createButton("seven", simpleAction) );
        toolBar.add( createButton("eight", simpleAction) );
        toolBar.addSeparator();
        toolBar.add( createButton("nine", simpleAction) );
        toolBar.add( createButton("ten", simpleAction) );

        JFrame f = new JFrame();
        f.getContentPane().setLayout(new BorderLayout());
        f.getContentPane().add(toolBar,BorderLayout.NORTH);
        f.setBounds(300,200,400,300);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }

    private static JButton createButton(String text, ActionListener listener)
    {
        JButton button = new JButton(text);
        button.addActionListener( listener );
        return button;
    }
}

この場合、使用可能なスペースがないときに、ツールバー ボタンが JMenu に変換されました。あなたの場合、すでに JMenu があるので、JMenu を JMenuBar からポップアップ メニューに移動できるはずです。ただし、メニュー バーの適切なサイズを決定する前に、メニューを常にポップアップ メニューからメニュー バーに戻すようにコードを変更する必要があります。

于 2013-07-23T15:04:25.257 に答える
1

CardLayout通常のメニューとボタンで実装されたメニューの両方を含むパネルを作成するために使用します。次にComponentListener( ) を追加し、リスナーのメソッドComponentAdapterで目的のメニュー実装を選択します。componentResized()

コードでは、おおよそ次のようになります。

JMenuBar createCustomMenu() {
    final CardLayout layout = new CardLayout();
    final JMenuBar menu = new JMenuBar();
    menu.setLayout(layout);

    // Here you should create the normal, wide menu
    JComponent normalMenu = createNormalMenu();
    // Here you create the compressed, one button version
    JComponent compressedMenu = createCompressedMenu();

    menu.add(normalMenu, "normal");
    menu.add(compressedMenu, "compressed");

    menu.addComponentListener(new ComponentAdapter() {
        public void componentResized(ComponentEvent e) {
            if (menu.getPreferredSize().getWidth() > menu.getWidth()) {
                layout.show(menu, "compressed");
            } else {
                layout.show(menu, "normal");
            }
        }
    });

    return menu;
}

(編集:正常に動作するように見えるため、 return に変更されましたJMenuBar

于 2013-07-23T09:39:31.587 に答える