【问题标题】:Bug of Transparent JCheckBox in a JPanel? [duplicate]JPanel 中透明 JCheckBox 的错误? [复制]
【发布时间】:2016-01-22 04:32:23
【问题描述】:

这是我添加新组件的代码:

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)) 时出现。

我可以知道我的代码有什么问题吗?

【问题讨论】:

  • 你的问题在这里panel.setBackground(new Color(213, 134, 145, 55));。 Swing 不知道如何处理基于 alpha 的背景颜色,它只处理完全不透明或透明的组件。为了让它工作,你需要伪造它,通过使组件完全透明并在组件paintComponent方法中绘制半透​​明颜色
  • 例如 this 之类的东西

标签: java swing jcheckbox


【解决方案1】:
panel.setBackground(new Color(213, 134, 145, 55));

问题是您的面板使用透明背景,并且您正在破坏组件之间的绘画合同。不透明的组件需要重新绘制整个背景(使用不透明的颜色),但是由于透明度的原因,您会得到绘画伪影。

查看Background With Transparency 了解更多信息和一些解决方案。

基本解决方案是:

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

但是,该链接还提供了可重复使用的解决方案,因此您无需在每个具有透明背景的组件上使用自定义绘画。

【讨论】:

  • 我现在明白这个问题了。非常感谢!!
猜你喜欢
  • 1970-01-01
  • 2012-04-20
  • 2012-07-07
  • 1970-01-01
  • 2017-06-14
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
相关资源
最近更新 更多