Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GUI中重叠的JPanel_Java_Swing_User Interface_Netbeans_Jpanel - Fatal编程技术网

Java GUI中重叠的JPanel

Java GUI中重叠的JPanel,java,swing,user-interface,netbeans,jpanel,Java,Swing,User Interface,Netbeans,Jpanel,我正在应用程序中使用BorderLayout。我有一个主面板,在中间添加了两个JPanel。我希望其中一个是透明的。 我的代码是: mainPanel = new JPanel(); mainPanel.setLayout(new BorderLayout()); mainPanel.add(getGraphPaneScrollPane(), BorderLayout.CENTER); mainPanel.add(getSituationPanel(), BorderLayout.CEN

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

 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是画布,我使用它来绘制节点

我希望情景面板是透明的,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);

这可以使用
CardLayout
Ok来完成。但我的问题是,我正在对已经构建的应用程序进行更改。因此,对布局进行更改是我最不想做的事情。我不确定它还会破坏什么代码。这不能通过使一个面板透明或类似的方式来实现吗?已经构建的应用程序,它是谁的?这是您的程序吗?添加到问题描述中:我的情况面板包含一个标签,上面有一些文本。因此,我想基本上是合并两个面板,以便它具有文本背景,并且我可以画出它。考虑使用JayrErdPANE在另一个上面层叠一个JPANK。我要试试这个。但是现在我仍然有一个透明度的问题,就像我必须遵循的那样,对吗情景面板。设置不透明(假);我也没有使用OverlyLayout就得到了它。我只需要使正确的窗格不透明,其他窗格透明。我必须更频繁地使用重绘。@tejas,这不是一个好的解决方案。您不需要使用repaint()。Swing具有明确的绘画机制。这是一个在将来会给你带来麻烦的黑客。正确使用布局管理器非常简单。哦!这就是为什么每次我用鼠标点击面板时,重叠部分都会丢失的原因吗?然后我必须重新油漆。我不知道会发生什么,因为我没有看到你的确切代码。我所知道的是,你可以得到奇怪的结果,你不断添加黑客到你的程序,使其工作。