如何 show/hide JFrame 中的另一个 JPanel 之上的 JPanel?

How to show/hide JPanel on top of another JPanel in a JFrame?

我有一个重新组合一些 JPanel 的主框架。我的 JFrame 完全填满了。

我希望能够 show/hide 在我左侧的 JFrame 中的另一个 JPanel 之上放置一个小 JPanel。此 JPanel 是用户的配置区域。

所以这是我的问题,在我的 JFrame 中,在其他所有内容之上的小区域中显示 JPanel 的最佳方式是什么?

我试过了,但没有按预期工作(这是点击设置图标时执行的代码):

private void jLabelSettingsMouseClicked(java.awt.event.MouseEvent evt) {                                            
    settingsActive = !this.jLabelEmargement.isVisible();        
    if(!settingsActive){
        FSettings.setSize(222, 380);
        FSettings.setLocation(0, 150);
        FSettings.setVisible(true);
        FSettings.setBackground(new Color(226,236,241));
        this.add(FSettings,BorderLayout.CENTER);
        this.frameLearners.setVisible(false);
        this.jLabelEmargement.setVisible(false);
        this.jLabelFinalEval.setVisible(false);
        this.jLabelLeaners.setVisible(false);
    }
    else{
        FSettings.setVisible(false);
        this.frameLearners.setVisible(true);
        this.jLabelEmargement.setVisible(true);
        this.jLabelFinalEval.setVisible(true);
        this.jLabelLeaners.setVisible(true);
    }
}

谢谢!

您可以用玻璃板覆盖框架内容。

http://www.java2s.com/Code/Java/Swing-JFC/DemonstrateuseofGlassPane.htm

JFrame myFrame = ...

JComponent glassPane = new JPanel(null);
myFrame.setGlassPane(glassPane);

private void jLabelSettingsMouseClicked(java.awt.event.MouseEvent evt) {                                            
    settingsActive = !this.jLabelEmargement.isVisible();        
    if(!settingsActive){
        FSettings.setSize(222, 380);
        FSettings.setLocation(0, 150);
        FSettings.setBackground(new Color(226,236,241));
        glassPane.add(FSettings);
        this.frameLearners.setVisible(false);
        this.jLabelEmargement.setVisible(false);
        this.jLabelFinalEval.setVisible(false);
        this.jLabelLeaners.setVisible(false);
    }
    else{
        glassPane.remove(FSettings);
        this.frameLearners.setVisible(true);
        this.jLabelEmargement.setVisible(true);
        this.jLabelFinalEval.setVisible(true);
        this.jLabelLeaners.setVisible(true);
    }
}

我正在使用它来显示 JFrame 内的效果或标记。

感谢 brainiac 我想到了这个解决方案,它按预期工作:

public void toggleSettings(){
    if(this.jLabelEmargement.isVisible()){
        // Set size of JPanel
        FSettings.setSize(222, 380);
        // Set location of JPanel
        FSettings.setLocation(0, 150);
        // Show JPanel
        FSettings.setVisible(true);
        FSettings.setBackground(new Color(226,236,241));
        // Add JPanel to LayeredPane
        jLayeredPaneSettings.add(FSettings, new Integer(5));
        this.frameLearners.setVisible(false);
        this.jLabelEmargement.setVisible(false);
        this.jLabelFinalEval.setVisible(false);
        this.jLabelLeaners.setVisible(false);
        ImageIcon icon = new ImageIcon(getClass().getResource("/com/images/cog_00997d_28.png"));
        jLabelSettings.setIcon(icon);
    }
    else{
        // Hide JPanel
        FSettings.setVisible(false);
        // Remove from LayeredPane
        jLayeredPaneSettings.remove(FSettings);
        this.frameLearners.setVisible(true);
        this.jLabelEmargement.setVisible(true);
        this.jLabelFinalEval.setVisible(true);
        this.jLabelLeaners.setVisible(true);
        ImageIcon icon = new ImageIcon(getClass().getResource("/com/images/cog_000000_28.png"));
        jLabelSettings.setIcon(icon);
    }
}

您只需要将 您想要 hide/show 的所有组件 放入 LayeredPane