Java setOpaque 方法无法在其他面板之上添加面板
Java setOpaque method not working to add panels over the top of others
我试图将两个面板放在另外两个面板的顶部,以便位置完全匹配。这将允许我在之前(底部)面板的顶部进行绘画。这样做的原因是,我实现了 "drag a rectangle" 缩放功能,因此用户将在面板上拖动鼠标绘制一个矩形,然后面板将充满该矩形的内容。但是,我现在决定在用户拖动矩形时包含矩形的可视化表示。
由于我(假设)我无法在底部面板上绘制矩形,因为无论如何它上面已经有复杂的油漆,我想我可以将它绘制到我将放在顶部的另一个面板上。 (如果有更简单的方法请大声喊出来!)
我很高兴我能够使用 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:为了避免混乱,省略了很多代码,但如果有人认为他们可以用更多代码解决,请说出来!谢谢:)
您可以使用 JLayeredPane
将一个组件放在另一个组件的顶部。您可以查看 this
首先,在 BorderLayout.CENTER 位置添加两个组件会将第一个组件替换为第二个组件,因此第二个组件不会覆盖第一个组件,而是取代它。根据 BorderLayout API:
Each region may contain no more than one component,...
不过话虽如此,但随着我更详细地了解您的问题,我认为您最好的解决方案是不使用 JLayeredPane 或叠加两个 JPanel。事实上,最好的解决方案是直接在显示图像的 JPanel 上绘制。这并不难做到,也不应使您的代码过于复杂。 .
我试图将两个面板放在另外两个面板的顶部,以便位置完全匹配。这将允许我在之前(底部)面板的顶部进行绘画。这样做的原因是,我实现了 "drag a rectangle" 缩放功能,因此用户将在面板上拖动鼠标绘制一个矩形,然后面板将充满该矩形的内容。但是,我现在决定在用户拖动矩形时包含矩形的可视化表示。
由于我(假设)我无法在底部面板上绘制矩形,因为无论如何它上面已经有复杂的油漆,我想我可以将它绘制到我将放在顶部的另一个面板上。 (如果有更简单的方法请大声喊出来!)
我很高兴我能够使用 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:为了避免混乱,省略了很多代码,但如果有人认为他们可以用更多代码解决,请说出来!谢谢:)
您可以使用 JLayeredPane
将一个组件放在另一个组件的顶部。您可以查看 this
首先,在 BorderLayout.CENTER 位置添加两个组件会将第一个组件替换为第二个组件,因此第二个组件不会覆盖第一个组件,而是取代它。根据 BorderLayout API:
Each region may contain no more than one component,...
不过话虽如此,但随着我更详细地了解您的问题,我认为您最好的解决方案是不使用 JLayeredPane 或叠加两个 JPanel。事实上,最好的解决方案是直接在显示图像的 JPanel 上绘制。这并不难做到,也不应使您的代码过于复杂。