未在 JTextArea 下方绘制背景颜色

Background color not being painted underneath JTextArea

我正在使用 Swing 创建 GUI。我有一个 JPanelPanelOne,它的背景颜色是蓝色。在面板上,我有一个 JTextAreainstructions,它的背景颜色也是蓝色,不透明设置为 true。

启动程序后,一切看起来都很好,说明是蓝色背景和黑色文本。在代码中,当我不再希望显示说明时,我会调用 instructions.setVisible(false)。但是,当我这样做时,标签所在的位置会留下一个灰色的大框。从我读到的内容来看,我认为让标签不透明可以解决这个问题,但事实似乎并非如此。如何保证标签下的区域也被涂成蓝色?

如果您不想再显示说明,您可以这样做

PanelOne.remove(instructions);
PanelOne.revalidate();
PanelOne.repaint();

不要将标签设置为不透明尝试隐藏它。一旦文本无关紧要,请调用 label.setText("");。完成!

没有文本、可见边框或图标的标签不可见的。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class HideLabel {

    private JComponent ui = null;

    HideLabel() {
        initUI();
    }

    public final void initUI() {
        if (ui!=null) return;

        ui = new JPanel(new BorderLayout());
        ui.setBorder(new EmptyBorder(4,4,4,4));
        ui.setBackground(Color.CYAN);
        
        final JLabel label = new JLabel("Click the button!");
        ui.add(label);
        AbstractAction action = new AbstractAction("'Hide' the label") {
            @Override
            public void actionPerformed(ActionEvent e) {
                label.setText("");
            }
        };
        JButton hideButton = new JButton(action);
        ui.add(hideButton, BorderLayout.LINE_END);
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = () -> {
            HideLabel o = new HideLabel();
            
            JFrame f = new JFrame(o.getClass().getSimpleName());
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setLocationByPlatform(true);
            
            f.setContentPane(o.getUI());
            f.pack();
            f.setMinimumSize(f.getSize());
            
            f.setVisible(true);
        };
        SwingUtilities.invokeLater(r);
    }
}

我错了,它实际上是 JScrollPane 内部的一个 JTextArea 留下了灰色框,而不是我最初认为的 JLabel。我已经更新了问题和标题以反映这一点。解决方案非常简单——我必须为包含我的 JTextArea 的 JScrollPane 将不透明设置为 true。感谢所有回答提示的人!