2016-12-04 10 views
0

menuitemsの後にJMenuBarストリークが消えるようにするにはどうすればよいですか?フレームの中央に2番目のメニューを入れたいと思っていて、このストリークで奇妙に見えます。ボタンの後にJMenuBarのストラップが消えるようにするにはどうすればよいですか?

バックグラウンドをPanel.backgroundに設定しようとしましたが、動作しません。あなたは、いくつかのJButtonが、独自の「メニュー」を作成したい場合は

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

は、当時とsetBounds(...)(あなたが同じように、後者を避けるべきではJMenuを使用していないとnullレイアウトを使用しないでください原則)。 JPanelsをネストする代わりに、独自のレイアウトマネージャを使用して複雑なGUIを簡単に作成できます。

たとえば、menuPanelというボタンを保持するJPanelを作成して、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); 
関連する問題