изменение фона на компонентах сдвигов JLabel - PullRequest
0 голосов
/ 21 марта 2010

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

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();
    }
}

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

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

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

Ответы [ 2 ]

4 голосов
/ 21 марта 2010

Вы даете 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);
    }
}
3 голосов
/ 21 марта 2010

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

...