在GUI中重叠JPanels

时间:2013-05-15 00:53:05

标签: java swing user-interface netbeans jpanel

我在我的应用程序中使用BorderLayout。我有一个主面板,我在中心添加两个JPanels。我希望其中一个是透明的。 我的代码是:

 mainPanel = new JPanel();
 mainPanel.setLayout(new BorderLayout());
 mainPanel.add(getGraphPaneScrollPane(), BorderLayout.CENTER);
 mainPanel.add(getSituationPanel(), BorderLayout.CENTER);

这两个功能的代码是:

public JScrollPane getGraphPaneScrollPane() {
    if (graphPaneScrollPane == null) {
        graphPaneScrollPane = new JScrollPane();
        graphPaneScrollPane.setViewportView(getGraphEditorPane());
    }
    return graphPaneScrollPane;
}
private JScrollPane getSituationPanel(){
    if(situationPanel == null){
        logs.debug("Initializing Situation Panel");

        situationPanel = new JScrollPane();

        situationLabel = new JLabel("");
        situationLabel.setVerticalTextPosition(JLabel.BOTTOM);
        situationLabel.setHorizontalTextPosition(JLabel.CENTER);
        situationLabel.setVerticalAlignment(JLabel.TOP);
        situationLabel.setHorizontalAlignment(JLabel.CENTER);
        situationLabel.setBorder(BorderFactory.createTitledBorder(""));
        situationLabel.setBackground(Color.WHITE);
        situationLabel.setOpaque(true);
        situationLabel.setVerticalAlignment(SwingConstants.TOP);

        situationPanel.setViewportView(situationLabel); 

    } 

    return situationPanel;
}

现在我希望situationPanel是透明的,并且getGraphPaneScrollPane高于GUI中的那个,因为getGraphPaneScrollPane是画布,我用它来绘制节点。

1 个答案:

答案 0 :(得分:1)

  

我希望situationPanel是透明的,getGraphPaneScrollPane高于GUI中的那个,

位于顶部的面板是需要透明的面板。如果顶部的面板是不透明的,那么您将永远不会在顶部面板下看到面板。

  

所以改变布局是我想要的最后一件事。

那就是你需要做的事情。您不能只将两个面板添加到一个面板,并期望它按照您希望的方式工作。大多数Swing布局管理器都设计为在两个维度上布置组件,而不是相互叠加。

您当前的代码是:

mainPanel.setLayout(new BorderLayout());
mainPanel.add(getGraphPaneScrollPane(), BorderLayout.CENTER);
mainPanel.add(getSituationPanel(), BorderLayout.CENTER);

您可以尝试使用OverlayLayout,它可以将面板放在另一个面板上。代码应该是这样的:

JPanel overlay = new JPanel();
overlay.setLayout( new OverlayLayout(overlay) );
overlay.add(getSituationPanel(), BorderLayout.CENTER); // add transparent panel first
overlay.add(getGraphPaneScrollPane(), BorderLayout.CENTER);
mainPanel.setLayout(new BorderLayout()); 
mainPanel.add(overlay);