如何让 JMenuBar 表带在按钮后消失?

How can I make the JMenuBar strape dissapear after the buttons?

如何让 JMenuBar 条纹在菜单项之后消失?我想在框架中间放置第二个菜单,这种条纹看起来很奇怪。

我尝试将背景设置为 Panel.background 但它不起作用。

import java.awt.*;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.UIManager;

public class SwingMenuDemo extends JPanel {

   public SwingMenuDemo(){
        setLayout(null);

        JMenuBar menuBar = new JMenuBar();
        menuBar.setBackground(UIManager.getColor("Panel.background"));
        menuBar.setBounds(0, 0, 450, 25);

        add(menuBar);

        JButton btn1 = new JButton("Menu1");
        menuBar.add(btn1);

        JButton btn2 = new JButton("Menu2");
        menuBar.add(btn2);

        JButton btn3 = new JButton("Menu3");
        menuBar.add(btn3);
   }

   private static void createAndShowGUI() {
       JFrame frame = new JFrame("SwingMenuDemo");

       frame.setPreferredSize(new Dimension(400,400));
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(),BoxLayout.PAGE_AXIS));
       frame.getContentPane().add(new SwingMenuDemo());
       frame.pack();
       frame.setVisible(true);
   }

   public static void main(String[] args) {
       javax.swing.SwingUtilities.invokeLater(new Runnable() {
           public void run() {
               createAndShowGUI();
           }
       });
   }

}

如果您想创建自己的 "menu" 多个 JButton,请不要使用 JMenu,也不要使用 null 布局和 setBounds(...)(您应该避免使用后者作为一般规则)。取而代之的是嵌套 JPanel,每个 JPanel 使用自己的布局管理器以允许简单地创建复杂的 GUI。

例如,您可以创建一个 JPanel 来容纳按钮,例如称为 menuPanel,为其提供 new GridLayout(1, 0) 布局,这意味着它将在 1 行中容纳组件网格,以及可变数量的列(这就是 0 的意思)。然后把你的按钮放进去。

然后将该 JPanel 放入另一个使用 FlowLayout.LEADING, 0, 0) 作为其布局的 JPanel 中——它会将其所有组件推向左侧。

然后让主 GUI 使用 BorderLayout 并将上面的面板添加到它顶部的 BorderLayout.PAGE_START 位置。例如:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import javax.swing.*;

@SuppressWarnings("serial")
public class SwingMenuDemo2 extends JPanel {
    private static final String[] MENU_TEXTS = {"Menu 1", "Menu 2", "Menu 3"};
    private static final int PREF_W = 400;
    private static final int PREF_H = PREF_W;

    public SwingMenuDemo2() {
        JPanel menuPanel = new JPanel(new GridLayout(1, 0));
        for (String menuText : MENU_TEXTS) {
            menuPanel.add(new JButton(menuText));
        }

        JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEADING, 0, 0));
        topPanel.add(menuPanel);

        setLayout(new BorderLayout());
        add(topPanel, BorderLayout.PAGE_START);
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(PREF_W, PREF_H);
    }

    private static void createAndShowGui() {
        SwingMenuDemo2 mainPanel = new SwingMenuDemo2();

        JFrame frame = new JFrame("Swing Menu Demo 2");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

你可以用

menuBar.setBorderPainted(false);