Ошибка прозрачного JCheckBox в JPanel?

Вот мои коды для добавления нового компонента:

addButton.addActionListener(new ActionListener() {          
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            if (!todoListInput.getText().equals("")) {
                JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT));
                panel.setBackground(new Color(213, 134, 145, 55));
                JCheckBox checkBox = new JCheckBox("");
                checkBox.setOpaque(false);
                checkBox.setForeground(Color.WHITE);
                //checkBox.setBorder(line);

                panel.add(checkBox);
                Border border = new LineBorder(Color.GRAY, 1, true);
                Border margin = new EmptyBorder(10,10,10,10);
                panel.setBorder(new CompoundBorder(margin, border));

                GridBagConstraints gbc = new GridBagConstraints();
                gbc.gridwidth = GridBagConstraints.REMAINDER;
                gbc.weightx = 1;
                gbc.fill = GridBagConstraints.HORIZONTAL;
                mainList.add(panel, gbc, 0);

                validate();
                repaint();

                todoListInput.setText("");
            }                
        }           
    });  

Моя проблема в том, что когда я выполняю действие "onmouseover" для флажка, часть всего jFrame будет отображаться за флажком введите здесь описание изображения

Я обнаружил, что это появляется только тогда, когда я делаю checkBox.setOpaque(false) или checkBox.setBackground(new Color(122,122,122,55)).

Могу ли я узнать, в чем проблема моего кода?


person ykn121    schedule 22.01.2016    source источник
comment
Ваша проблема здесь panel.setBackground(new Color(213, 134, 145, 55));. Swing не знает, как работать с фоновыми цветами на основе альфа-канала, он работает только с полностью непрозрачными или прозрачными компонентами. Чтобы заставить его работать, вам нужно подделать его, сделав компонент полностью прозрачным и закрасив полупрозрачный цвет в методе компонентов paintComponent   -  person MadProgrammer    schedule 22.01.2016
comment
Что-то вроде это для пример   -  person MadProgrammer    schedule 22.01.2016


Ответы (1)


panel.setBackground(new Color(213, 134, 145, 55));

Проблема в том, что ваша панель использует прозрачный фон, и вы нарушаете контракт рисования между компонентами. Непрозрачный компонент должен перекрасить весь фон (непрозрачным цветом), однако из-за прозрачности вы получаете артефакты рисования.

Ознакомьтесь с Фон с прозрачностью, чтобы получить дополнительную информацию и пару решения.

Основное решение:

JPanel panel = new JPanel()
{
    protected void paintComponent(Graphics g)
    {
        g.setColor( getBackground() );
        g.fillRect(0, 0, getWidth(), getHeight());
        super.paintComponent(g);
    }
};
panel.setOpaque(false);
panel.setBackground( new Color(255, 0, 0, 20) );
frame.add(panel);

Однако ссылка также предоставляет повторно используемое решение, поэтому вам не нужно использовать пользовательское рисование для каждого компонента с прозрачным фоном.

person camickr    schedule 22.01.2016
comment
Теперь я понимаю проблему. Большое спасибо!! - person ykn121; 22.01.2016