2016-01-22 45 views
0

這裏是我添加新的組件代碼:JPanel中透明JCheckBox的問題?

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的部分將出現在複選框後面 enter image description here

我發現,這隻出現在我做checkBox.setOpaque(false)或checkBox.setBackground(新顏色(122,122,122,55))。

我可以知道我的代碼有什麼問題嗎?

+1

你的問題在這裏'panel.setBackground(new Color(213,134,145,55));'。 Swing不知道如何處理基於alpha的背景顏色,它只處理完全不透明或透明的組件。爲了使它工作,你需要僞裝它,通過使組件完全透明並在組件中繪製半透​​明顏色'paintComponent'方法 – MadProgrammer

+0

像[this](http://stackoverflow.com/questions/32216625/)如何製作一個半透明的jpanel-within-the-region-jpanel/32217554#32217554)例如 – MadProgrammer

回答

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

但是,鏈接還提供了一個可重複使用的解決方案,所以你並不需要有一個透明背景的每個組件上使用的風俗畫。

+0

我現在明白了這個問題。非常感謝!! – ykn121