Java setOpaque方法无法在其他人的顶部添加面板

时间:2016-03-09 14:33:57

标签: java swing jpanel awt

我试图在另外两个面板的顶部放置两个面板,因此位置完全匹配。这样我就可以在上一个(底部)面板的顶部涂漆。这样做的原因是我已经实现了一个"拖动一个矩形"缩放功能,所以在面板上用户将拖动鼠标绘制一个矩形,然后面板将填充该矩形的内容。但是,我现在决定在用户​​拖动它时包含矩形的可视化表示。

因为我(假设)我无法在底部面板上绘制矩形,因为它上面已经有一个复杂的颜色,我想我可以将它绘制到另一个我放在顶部的面板上。 (如果有更简单的方法请大喊!)

我很高兴我能够使用BorderLayout / GridLayout组合将面板放到正确的位置,而不需要绝对定位,但是setOpaque方法不能用于我添加的三个面板中的任何一个。有人知道为什么吗?

非常感谢提前,代码如下:

public void initiate() {
    JPanel panel1 = new JPanel();
    mandPanel mandDisplay = new mandPanel(); 
    juliaPanel juliaDisplay = new juliaPanel(); 
    JPanel detailsPanel = new JPanel();
    JPanel bottomDetails = new JPanel();
    JPanel panelForDisplays = new JPanel();
    JPanel listenerPanelHolder = new JPanel();
    JPanel listenerPanel = new JPanel();
    JPanel blankPanel = new JPanel();

    panelForDisplays.setLayout(new GridLayout(1,2));
    detailsPanel.setLayout(new FlowLayout());
    bottomDetails.setLayout(new FlowLayout());
    panel1.setLayout(new BorderLayout());


    panelForDisplays.add(mandDisplay);
    panelForDisplays.add(juliaDisplay);

    listenerPanelHolder.setOpaque(false);
    listenerPanel.setOpaque(false);
    blankPanel.setOpaque(false);
    listenerPanelHolder.setLayout(new GridLayout(1,2));
    listenerPanelHolder.add(listenerPanel);
    listenerPanelHolder.add(blankPanel);


    panel1.add(detailsPanel,BorderLayout.NORTH);
    panel1.add(panelForDisplays,BorderLayout.CENTER);
    panel1.add(listenerPanel,BorderLayout.CENTER);
    panel1.add(bottomDetails, BorderLayout.SOUTH);



    setContentPane(panel1);
    setSize(width*2, height);
    setResizable(false);

    this.addWindowListener(new onClose(savedJulias));
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
}
PS:为了避免混乱,省略了很多代码,但是如果有人认为他们可以用更多代码解决,请说出来!谢谢:))

2 个答案:

答案 0 :(得分:1)

首先,在BorderLayout.CENTER位置添加两个组件会将第一个组件替换为第二个组件,因此第二个组件不会覆盖第一个组件,它会替换它。根据{{​​3}}:

  

每个区域可能只包含一个组件,......

但话虽如此,正如我更详细地了解您的问题,我认为您最好的解决方案是不使用JLayeredPane或覆盖两个JPanel。事实上,最好的解决方案是直接在图像显示JPanel上绘图。这并不难,也不应该使代码复杂化。 BorderLayout API

答案 1 :(得分:0)

您可以使用JLayeredPane将一个组件放在另一个组件的顶部。您可以查看this

enter image description here