2016-12-04 60 views
0

如何在菜單項之後使JMenuBar條紋消失?我想在畫面中間放置第二個菜單,而且看起來很奇怪。如何讓JMenuBar strape在按鈕後消失?

我試圖將背景設置爲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(); 
      } 
     }); 
    } 

} 

enter image description here

+1

有什麼理由你完全不遵循(HTTPS [JMenuBar的使用元素的常用方式]:/ /docs.oracle.com/javase/tutorial/uiswing/components/menu.html)? –

回答

3

如果你想創建幾個Jbutton將你自己的「菜單」,那麼就不要使用JMenu的,不使用null佈局和setBounds(...)(你應該避免後者只是作爲一般規則)。取而代之的是嵌套JPanels,每個都使用自己的佈局管理器來允許簡單地創建複雜的GUI。

例如,你可以創建一個JPanel按住按鈕,說叫menuPanel,給它一個new GridLayout(1, 0)佈局,這意味着它將持有組件的網格爲1行和列的數目可變(這是什麼0手段)。然後把你的按鈕在那。

然後將JPanel放到另一個使用FlowLayout.LEADING, 0, 0)作爲其佈局的JPanel中 - 它會將其所有組件都推送到左側。

然後讓主GUI使用BorderLayout並將上面的面板添加到位於BorderLayout.PAGE_START位置的頂部。例如:

enter image description here

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()); 
    } 
} 
0

你可以做到這一點與

menuBar.setBorderPainted(false);