2014-11-23 2 views
0

Проблема кажется простой, но я не могу ее обойти.Java - JMenuBar скрыт при использовании стеклянной панели

Я использую GlassPane в своем кадре (также ContentPane). Поэтому, когда я добавляю JMenuBar к фрейму, он не появляется. Если/когда я использую GlassPane в другое время, все работает абсолютно нормально. Я сделал некоторые исследования, я понимаю, что JMenuBar показан на RootPane, и я считаю, что GlassPane каким-то образом скрывает его.

Мне нужно знать, есть ли способ получить JMenuBar при использовании GlassPane?

Благодаря

UPDATE: Я устанавливаю glassPane.setOpaque (ложь)

UPDATE:

Фактические строки кода гораздо больше, но вот те, которые по отношению к задаче , (mainPanel и notificationPanel являются самостоятельными построены классы, отходящие от JPanel)

public class Demo extends JFrame { 

///////////////////////////////////////////////////////////////////////// 
// JMenuBar 
private final JMenuBar mainMenuBar; 
    private final JMenu fileMenu; 
     private final JMenuItem exitFileMenu; 
///////////////////////////////////////////////////////////////////////// 
// CONTENT PANE & COMPONENTS 
private final JPanel contentPanel; 
    private final JPanel buttonPanel; 
     private final JButton button1; 

///////////////////////////////////////////////////////////////////////// 
// GLASSPANE AND COMPONENTS 
private final JPanel glassPanel; 
    private final JPanel buttonPanel2; 
    private final JButton button2; 

public Demo() { 
    super(); 

    this.mainMenuBar = new JMenuBar(); 
     this.fileMenu = new JMenu("File"); 
      this.exitFileMenu = new JMenuItem("EXIT"); 

    this.contentPanel = new JPanel(new BorderLayout()); 
     this.buttonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
      this.button1 = new JButton("Button 1"); 

    this.glassPanel = new JPanel(new BorderLayout()); 
     this.buttonPanel2 = new JPanel(new FlowLayout(FlowLayout.RIGHT)); 
      this.button2 = new JButton("Button 2"); 
} 

public void initGUI() { 
     this.fileMenu.add(this.exitFileMenu); 
    this.mainMenuBar.add(this.fileMenu); 

     this.buttonPanel.add(this.button1); 
    this.contentPanel.add(this.buttonPanel, BorderLayout.NORTH); 


     this.buttonPanel2.add(this.button2); 
    this.glassPanel.add(this.buttonPanel2, BorderLayout.NORTH); 

    super.setContentPane(this.contentPanel); 
    super.setGlassPane(this.glassPanel); 

    this.glassPanel.setOpaque(false); 
    this.glassPanel.setVisible(true); 

    super.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    super.setJMenuBar(mainMenuBar); 
    super.setVisible(true); 
} 

public static void main(String[] args) { 
    Demo obj = new Demo(); 
    obj.initGUI(); 
} 

}

+0

Просьба представить любой код, который воспроизводит вашу проблему –

+0

@SergiyMedvynskyy Я добавил несколько строк кода и снимок экрана. – Abbas

+0

@ AbbasA.Ali * «некоторые строки кода» * не делает пример runnable. Если мы не сможем повторить вашу проблему, вряд ли мы сможем ее решить. Все остальное - догадка. Рассмотрите возможность предоставления [runnable example] (https://stackoverflow.com/help/mcve), который демонстрирует вашу проблему. Это приведет к меньшему путанице и лучшим ответам – MadProgrammer

ответ

0

Хорошо, ребята, я случайно нашел решение проблемы. Это было просто, если вы используете вложенные панели в «glassPane», а затем просто установите для непрозрачности каждой вложенной панели значение false. Если вы не вложенных панелей, они будут отображать свой фон для каждой из своих границ и перекрывать любой нижележащий уровень (слои).

Ниже приведен рабочий код Demo.

public class Demo extends JFrame { 

///////////////////////////////////////////////////////////////////////// 
// JMenuBar 
private final JMenuBar mainMenuBar; 
    private final JMenu fileMenu; 
     private final JMenuItem exitFileMenu; 
///////////////////////////////////////////////////////////////////////// 
// CONTENT PANE & COMPONENTS 
private final JPanel contentPanel; 
    private final JPanel buttonPanel; 
     private final JButton button1; 

///////////////////////////////////////////////////////////////////////// 
// GLASSPANE AND COMPONENTS 
private final JPanel glassPanel; 
    private final JPanel buttonPanel2; 
    private final JButton button2; 

public Demo() { 
    super(); 

    this.mainMenuBar = new JMenuBar(); 
     this.fileMenu = new JMenu("File"); 
      this.exitFileMenu = new JMenuItem("EXIT"); 

    this.contentPanel = new JPanel(new BorderLayout()); 
     this.buttonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
      this.button1 = new JButton("Button 1"); 

    this.glassPanel = new JPanel(new BorderLayout()); 
     this.buttonPanel2 = new JPanel(new FlowLayout(FlowLayout.RIGHT)); 
      this.button2 = new JButton("Button 2"); 
} 

public void initGUI() { 
     this.fileMenu.add(this.exitFileMenu); 
    this.mainMenuBar.add(this.fileMenu); 

     this.buttonPanel.add(this.button1); 
    this.contentPanel.add(this.buttonPanel, BorderLayout.NORTH); 


     this.buttonPanel2.add(this.button2); 
     this.buttonPanel2.setOpaque(false); 
    this.glassPanel.add(this.buttonPanel2, BorderLayout.NORTH); 

    super.setContentPane(this.contentPanel); 
    super.setGlassPane(this.glassPanel); 

    this.glassPanel.setOpaque(false); 
    this.glassPanel.setVisible(true); 

    super.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    super.setJMenuBar(mainMenuBar); 
    super.setVisible(true); 
} 

public static void main(String[] args) { 
    Demo obj = new Demo(); 
    obj.initGUI(); 
} 

}

Теперь же всегда помнить, чтобы установить Непрозрачность glassPane после того, как вы называете «setGlassPane(JPanel)» В противном случае GlassPane остаются непрозрачными. (Вложенные панели, которые вы можете установить до или после вызова указанного метода)

0

Вы используете BorderLayout и вариант BorderLayout.NORTH для glassPanel. Он занимает все пространство на севере и перекрывает все ваше меню. Поэтому вы больше ничего не видите. Изменение, например, ваше создание панели в:

this.glassPanel = new JPanel(); 

Тогда ваша панель будет изменен только соответствовать вашей кнопки, и вы увидите меню позади. Вы можете поиграть с некоторыми макетами и посмотреть, какой из них подходит. Но просто помните, что стеклянное стекло всегда на вершине всего. Просто небольшое примечание: когда вы добавляете свою кнопку непосредственно в 'glassPanel' (без использования 'buttonPanel2') вы можете удалить маленькие «границы». В противном случае вы можете изменить его размер, чтобы он идеально соответствовал вашей кнопке. Оба возможны, но если вы хотите иметь только один компонент (например, свою кнопку), я бы добавил его напрямую.

+0

Итак, я попробовал, как было предложено, но добавив кнопку2 непосредственно на панель (без использования какого-либо макета), но затем контентная панель вообще не отображается. Пожалуйста, укажите, как вы пришли, чтобы преодолеть эту проблему. – Abbas

+0

Я только что изменил одну строку (this.glassPanel = new JPanel()), а затем еще дальше изменил строку на: this.glassPanel.add (this.button2) вместо того, чтобы сначала добавить ее на дополнительную панель. Остальное - то же самое. Результат показал две кнопки и строку меню. – BluesSolo

+0

Итак, я узнал, что не так ... Если вы используете дополнительные вложенные панели, вам нужно установить непрозрачность каждой панели на false. В противном случае по умолчанию установлено значение true. Спасибо за вашу помощь! – Abbas