JPanel 中透明 JCheckBox 的错误?
Bug of Transparent JCheckBox in a 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)) 时才会出现。
请问我的代码有什么问题吗?
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);
但是,link 还提供了一个可重复使用的解决方案,因此您无需在每个具有透明背景的组件上使用自定义绘画。
这是我添加新组件的代码:
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));
问题是您的面板使用的是透明背景,并且您破坏了组件之间的绘制契约。不透明的组件需要重新绘制整个背景(使用不透明的颜色),但是由于透明度,您会得到绘制伪像。
查看 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);
但是,link 还提供了一个可重复使用的解决方案,因此您无需在每个具有透明背景的组件上使用自定义绘画。