2012-05-27 2 views
1

Я пытаюсь отобразить мой JMenuBar в графическом интерфейсе, однако он просто отображается как 1-пиксельная строка вверху.JMenuBar не отображается

Это мой код ...

public LibraryView() { 
    setBounds(100,100,640,480); 
    setVisible(true); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setLayout(new BorderLayout()); 

    JMenuBar b1 = new JMenuBar(); 
    JMenu m1 = new JMenu("Test"); 
    JMenuItem i1 = new JMenuItem("Item1"); 

    this.setJMenuBar(b1); 
} 

Может кто-то пожалуйста, помогите мне понять, что это неправильно.

ответ

5

Вам необходимо добавить JMenu и JMenuItem в JMenuBar. Кроме того, необходимо pack() и setVisible(true); в конце метода, как раз перед тем, как показал GUI ...

public LibraryView() { 
    setBounds(100,100,640,480); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setLayout(new BorderLayout()); 

    JMenuBar b1 = new JMenuBar(); 
    JMenu m1 = new JMenu("Test"); 
    JMenuItem i1 = new JMenuItem("Item1"); 

    m1.add(i1); // ADDED 
    b1.add(m1); // ADDED 

    this.setJMenuBar(b1); 

    pack(); // ADDED 
    setVisible(true); // MOVED 
} 
+0

1+ для справок. –

+0

Спасибо! Забыл добавить предметы в бар, ах .. Не могли бы вы вкратце объяснить, зачем нужно упаковывать()? Код, похоже, отлично работает без него. – YemSalat

+1

Большинство графических интерфейсов Java являются автоматическими, что означает, что они будут расти и сокращаться в зависимости от размера окна и компонентов внутри него. Вызов 'pack()' будет вычислять предпочтительный размер окна, так что все компоненты также могут отображаться в их сжатом размере. Вероятно, это не совсем необходимо для вас, поскольку вы «setBounds()», но его хорошая привычка вызывать 'pack()' независимо. – wattostudios

3

Вы должны позвонить setVisible(true) только после добавления всех компонентов в окне верхнего уровня. Также не забудьте использовать менеджеров компоновки, чтобы эти менеджеры и предпочтительный размер вашего компонента задавали размеры компонентов, и не забудьте позвонить pack().

0

call repaint() прямо перед вызовом set visible (true) this NEVER FAILS.

setJMenuBar(menuBar); 
menuBar.add(jMenuItem); 
repaint(); //then 
setVisible(true); //Assured NEVER FAILS 
+0

Перерисовать() решает проблему, но она работает, только если вы вызываете setVisible() после того, как это не наоборот. –