Вопрос

Код, который я использую:

public class Test extends JFrame implements ActionListener {

    private static final Color TRANSP_WHITE =
        new Color(new Float(1), new Float(1), new Float(1), new Float(0.5));
    private static final Color TRANSP_RED =
        new Color(new Float(1), new Float(0), new Float(0), new Float(0.1));
    private static final Color[] COLORS =
        new Color[]{TRANSP_RED, TRANSP_WHITE};
    private int index = 0;
    private JLabel label;
    private JButton button;

    public Test() {
        super();

        setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
        label = new JLabel("hello world");
        label.setOpaque(true);
        label.setBackground(TRANSP_WHITE);

        getContentPane().add(label);

        button = new JButton("Click Me");
        button.addActionListener(this);

        getContentPane().add(button);

        pack();
        setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource().equals(button)) {
            label.setBackground(COLORS[index % (COLORS.length)]);
            index++;
        }
    }

    public static void main(String[] args) {
        new Test();
    }
}

Когда я нажимаю кнопку, чтобы изменить цвет меток, графический интерфейс выглядит следующим образом:

До:alt textПосле:alt text

Есть идеи, почему?

Это было полезно?

Решение

Вы задаете JLabel полупрозрачный фон, но указываете, что он непрозрачен.Это означает, что Swing не будет рисовать компоненты под ним, пока не предоставит JLabel объект Graphics для использования для рисования.Предоставленная графика содержит мусор, который, как ожидается, JLabel перезапишет при рисовании фона.Однако когда он рисует фон, он становится полупрозрачным, поэтому мусор остается.

Чтобы решить эту проблему, вам нужно создать расширение JLabel, которое не будет непрозрачным, но будет иметь переопределенный метод PaintComponent, который будет рисовать нужный вам фон.

РЕДАКТИРОВАТЬ:Вот пример:

public class TranslucentLabel extends JLabel {
    public TranslucentLabel(String text) {
        super(text);
        setOpaque(false);
    }

    @Override
    protected void paintComponent(Graphics graphics) {
        graphics.setColor(getBackground());
        graphics.fillRect(0, 0, getWidth(), getHeight());
        super.paintComponent(graphics);
    }
}

Другие советы

Фоны с прозрачностью предоставляет принятое вами решение, но также предоставляет вам решение, которое вы можете использовать без расширения JLabel, что может представлять интерес.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top