【问题标题】:Setting JPanel background while using BoxLayout使用 BoxLayout 时设置 JPanel 背景
【发布时间】:2020-01-07 03:27:43
【问题描述】:

我正在开发一个简单的应用程序,目前正在使用 Swing 进行 gui 设计。在我的程序中,我有一个 JPanel,我希望它的背景颜色为黑色,如下所示:

JPanel playerPanel = new JPanel();
playerPanel.setOpaque(true);
playerPanel.setBackground(Color.BLACK);

此代码运行良好。但是,问题是当我将布局管理器分配给面板时:

JPanel playerPanel = new JPanel();
playerPanel.setOpaque(true);
playerPanel.setBackground(Color.BLACK);
playerPanel.setLayout(new BoxLayout(playerPanel, BoxLayout.PAGE_AXIS));

由于某种原因,这会使面板的黑色消失。无论我将.setLayout(...) 命令放在哪里,在.setBackground(...).setOpaque(true) 之前或之后,都会发生这种情况。

为什么会这样,我该如何解决这个问题?如何保留使用 BoxLayout 管理器的黑色 JPanel?

【问题讨论】:

标签: java swing jpanel layout-manager boxlayout


【解决方案1】:

确认您的面板内容不会遮挡更改后的背景。调整下面这个我人为放大的例子,看看效果。

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.util.Random;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
  * @see https://stackoverflow.com/a/57785802/230513
  */
public class BoxTest {

     public static final Random random = new Random();

     public static void main(String[] args) {

         EventQueue.invokeLater(new Runnable() {
             public void run() {
                 new BoxTest().create();
             }
         });
     }

     void create() {
         JPanel panel = new JPanel();
         panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
         panel.setBackground(Color.BLACK);
         panel.add(Box.createVerticalGlue());
         for (int i = 0; i < 4; i++) {
             panel.add(new VariablePanel());
             panel.add(Box.createVerticalGlue());
         }

         JFrame f = new JFrame("BoxTest");
         f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         f.add(panel);
         f.pack();
         f.setLocationRelativeTo(null);
         f.setVisible(true);
         f.setSize(f.getWidth(), f.getHeight() + 64);
     }
}

/**
 * A VariablePanel has a label showing its current size,
 * as well as a variable number of text items.
 */
class VariablePanel extends JPanel {

    private static final String text = 
        "Sed ut perspiciatis unde omnis iste natus error sit.";
    private final JLabel sizeLabel = new JLabel("Size:");

    public VariablePanel() {
        this.setLayout(new GridLayout(0, 1));
        this.add(sizeLabel);
        int count = BoxTest.random.nextInt(5) + 1;
        for (int i = 0; i < count; i++) {
            this.add(new JLabel(text));
        }
        this.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                int w = e.getComponent().getWidth();
                int h = e.getComponent().getHeight();
                sizeLabel.setText("Size: " + w + "\u00d7" + h);
            }
        });
    }
}

【讨论】:

  • 看,问题是即使没有组件,颜色也会消失。我试图只有一个空面板。颜色在我未分配布局时显示,但在我分配 BoxLayout 时消失。
  • “没有组件。” 如果面板没有组件,它的自然大小将为 0x0。 我昨天建议发布的 minimal reproducible example 在哪里? 就像发布的 MRE 垃圾神一样,但显示了您报告的行为。我们无法通过魔法帮助您,只能理解代码实际在做什么。
  • 我的例子有效,即使没有add() 循环。当你运行它时你看到了什么?
【解决方案2】:

Swing 组件(除了 JLabel)默认是不透明的。这意味着:

  1. 你不需要playerPanel.setOpaque(true)
  2. 您添加到面板的大多数组件都是不透明的,并且会覆盖播放器面板的背景。

此外,BoxLayout 尊重您添加到面板的任何组件的最大尺寸。所以如果你添加一个组件:

  1. 就像一个具有已定义最大尺寸的 JButton,您将在 playerPanel 顶部看到按钮,并且背景将围绕该按钮。
  2. 与没有定义最大尺寸的 JPanel 一样,面板将调整大小以填充 playerPanel 的整个区域,您将看不到 playerPanel 的背景。

如果你想通过添加到playerPanel的组件看到playerPanel显示的背景,那么你需要在该组件上使用setOpaque(false)。例如:

JPanel child = new JPanel();
child.setOpaque( false );
playerPanel.add( child );

【讨论】:

  • 正如我对其他回复的评论一样,问题不在于覆盖背景的组件 (playerPanel)。我的面板上根本没有组件,但颜色消失了。如问题中所述,面板具有可见的颜色,但在我分配 BoxLayout 时它不会。
  • 我对空面板的测试没有问题。昨天你被要求发布你的minimal reproducible example 来证明这个问题。您发布的 3 行代码不会导致问题。布局管理器与组件背景的绘制完全无关。它用于确定组件的大小。因此,根据您如何使用代码的上下文,大小正在发生变化。但我们不是读心术者,我们不知道你在做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 2022-11-18
  • 2011-02-02
  • 1970-01-01
  • 2014-04-05
  • 2014-01-19
相关资源
最近更新 更多