java setOpaque(false)不会使JPanel透明

5us2dqdw  于 2023-02-07  发布在  Java
关注(0)|答案(1)|浏览(102)

我正在尝试制作一个GUI,在其中我使用了一个SplitPane,内容在左边,主要内容在右边。我意识到当SplitPane调整大小时,右面板中的内容会相应地移动以适应新的大小,这不是我要寻找的行为,我希望在调整大小时右侧的主要内容保持原样。因此,我使用layeredPane将主要内容添加到一个拆分窗格后面,该窗格左侧有内容,右侧有一个透明面板来显示其后面的主要内容。
下面是我的代码片段

JPanel phantomPanel = new JPanel();
phantomPanel.setOpaque(false);
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, phantomPanel);

JLayeredPane layeredPane = new JLayeredPane();
rightPanel.setBounds(0,0,900,600);
splitPane.setBounds(0,0,900,600);
layeredPane.add(rightPanel,0,0); //Main Content is behind the split pane
layeredPane.add(splitPane, 1,0);

我看到了左面板的splitPane,但右面板是白色的,切换layeredPane上的层,我确实看到了我的(非白色)主面板。
改变了右边面板的背景颜色,我意识到白色确实是透明面板,问题是它后面的面板没有显示。我错过了什么?
The split Pane with the non transparent right panelWhat should show behind it

eagi6jfj

eagi6jfj1#

感谢@VGR,因为我正在制作一个最小的可重复示例,我找到了解决方案,透明面板和SplitPane都需要是透明的,以便后面的面板显示

package FrontEnd;

import javax.swing.*;
import java.awt.*;

public class Problem {
    public static void main(String[] args){

        JFrame frame = new JFrame("test");
        frame.setSize(600,600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel left = new JPanel();
        left.setBackground(Color.blue);

        JPanel transparent = new JPanel();
        transparent.setOpaque(false);

        JSplitPane SP = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,left,transparent);
        SP.setBounds(0,0,600,600);
        SP.setOpaque(false);

        JPanel right = new JPanel();
        right.setBackground(Color.red);
        right.setBounds(0,0,600,600);

        JLayeredPane LP = new JLayeredPane();
        LP.add(right,0,0);
        LP.add(SP,1,0);

        frame.add(LP);
        frame.setVisible(true);
    }
}

现在,理论上,当调整SplitPane的大小时,右侧面板(红色)不应该四处移动,因为这会影响左侧面板和透明面板

相关问题