【问题标题】:JLayeredPane white background next to componentJLayeredPane 组件旁边的白色背景
【发布时间】:2014-01-09 18:43:54
【问题描述】:

在这里尝试使用分层窗格,我遇到了问题。我有两个JPanels。我将它们都添加到JLayeredPane - panel1 足够大以占用整个空间,而 panel2 更小并且使用FlowLayout 居中。问题是使用JLayeredPane,当我添加它时,panel2 旁边的背景似乎被涂成白色。这是一张图片来说明。 panel1 为蓝色,panel2 为红色:

如您所见,panel1 的底部仍然是涂漆的,但由于某种原因侧面只是白色。 panel2 是 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); 时,它会变成黄色。

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖MCVE
  • 顺便说一句-为什么这些面板要进行自定义绘画?如果您想要的只是一种颜色,请参阅setBackground(Color)..
  • 啊,它们不仅仅是颜色,但我用空白的红色屏幕替换了实际图像以避免混淆。画在面板上的图像不相关=P
  • 如果您不希望其他人提出完全相同的建议。可能与包含在代码中无关,但至少在edit to the question..中提及。
  • 请注意,要遵守“V”,它也需要导入,但让我们开始吧。 ..为什么是代码/应用程序。完全使用JLayerdPane?你想达到什么样的最终效果?

标签: java swing jlayeredpane


【解决方案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);

    }
}

【讨论】:

  • 谢谢,看来我大致同时想通了。正确答案,感谢您的帮助:)
  • 我迟早要自己弄清楚。我一直害怕这个组件。这项研究是足够的奖励:)
  • 男孩,我很高兴你一直徘徊并解决了这个问题!我担心我会刷新页面,毕竟我夸大了“尽快提供更好的帮助”,但它没有答案。 ;)
【解决方案2】:

我相信我发现了问题所在。与这里的答案有关: JLayeredPane not respecting layers

您需要一个了解 Z 轴的布局管理器。默认布局管理器不理解 JLayeredPane 的 Z 轴。

所以是 FlowLayout 搞砸了我。我将为我的项目使用绝对定位并使用 setBounds() 确保红色面板位于中间。否则我将不得不研究我想的自定义布局管理器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2012-04-23
    • 2020-08-31
    • 1970-01-01
    相关资源
    最近更新 更多