在这里试验分层窗格,我遇到了问题。我有两个JPanel
个。我将它们都添加到JLayeredPane
- panel1足以占据整个空间,而panel2更小并使用FlowLayout
居中。问题是使用JLayeredPane
时,我添加它时,panel2旁边的背景似乎被涂成了白色。这是一张图片来说明。 panel1为蓝色,panel2为红色:
正如您所看到的,面板1的底部仍然是涂漆的,但由于某种原因,侧面只是白色。面板2宽700像素,居中,而框架宽800像素,所以这绝对不是问题。这是整个班级:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
public class Errortest extends JFrame {
public static void main(String[] args) {
//Creating frame and setting the JLayeredPane as contentpane
Errortest frame = new Errortest();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLayeredPane pane = new JLayeredPane();
pane.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
pane.setPreferredSize(new Dimension(800,600));
frame.setContentPane(pane);
frame.pack();
//Creating panels
JPanel panel1 = new JPanel();
panel1.setPreferredSize(new Dimension(800,600));
panel1.setBackground(Color.BLUE);
JPanel panel2 = new JPanel();
panel2.setPreferredSize(new Dimension(700,500));
panel2.setBackground(Color.RED);
pane.add(panel1, new Integer(0));
pane.add(panel2, new Integer(1));
frame.setVisible(true);
}
}
希望这不是太混乱。据我所知,白色背景来自JFrame
本身,因为当我frame.setBackground(Color.YELLOW);
时它会变黄。
答案 0 :(得分:1)
我相信我发现了问题所在。与这里的答案有关: JLayeredPane not respecting layers
您需要一个了解Z轴的布局管理器。默认布局管理器不了解JLayeredPane的Z轴。
所以FlowLayout让我搞砸了。我只是对我的项目使用绝对定位并使用setBounds()来确保红色面板在中间结束。否则我必须考虑自定义布局管理器。
答案 1 :(得分:1)
如果将组件添加到JLayeredPane,就像使用容器将其添加到空布局一样:您必须完全指定组件的大小和位置。
import java.awt.*;
import javax.swing.*;
public class ErrorTest extends JFrame {
public static void main(String[] args) {
// Creating frame and setting the JLayeredPane as contentpane
ErrorTest frame = new ErrorTest();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JComponent pane = new JLayeredPane();
//pane.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); // Take out FlowLayout
pane.setPreferredSize(new Dimension(800, 600));
frame.setContentPane(pane);
// Creating panels
JPanel panel1 = new JPanel();
panel1.setBackground(Color.BLUE);
panel1.setBounds(0, 0, 800, 600); // <<<---- Set Bounds
JPanel panel2 = new JPanel();
panel2.setBackground(Color.RED);
panel2.setBounds(50, 0, 700, 500); // <<---- Set Bounds
pane.add(panel1, new Integer(1));
pane.add(panel2, new Integer(2));
frame.pack();
frame.setVisible(true);
}
}