组件旁边的JLayeredPane白色背景

时间:2014-01-09 18:43:54

标签: java swing jlayeredpane

在这里试验分层窗格,我遇到了问题。我有两个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);时它会变黄。

2 个答案:

答案 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);

    }
}

enter image description here