2016-09-17 3 views
0

У меня есть пара JRadioButton: rb1, rb2; который содержится в прозрачном JPanel p1, а p1 содержится в красочной панели с именем mainPanel. Я хочу, чтобы эти JRadioButton прозрачными, и вот что я делаю:Как я могу сделать JRadioButton прозрачным в конкретном случае?

в mainPanel: mainPanel.setBackground(Color.RED);

в p1: p1.setBackground(new Color(0,0,0,0));

и RB1 и RB2:

rb1.setOpaque(false); 
     rb1.setContentAreaFilled(false); 
     rb1.setBorderPainted(false); 
     rb2.setOpaque(false); 
     rb2.setContentAreaFilled(false); 
     rb2.setBorderPainted(false); 

это ok, если rb1 и rb2 содержатся в mainPanel или если p1 не является прозрачным JPanel, но в моем случае результат не тот, который я ожидал: result

Как я могу решить эту проблему? Заранее спасибо!

ответ

4

Странные артефакты живописи которые вы видите вызваны этим:

p1.setBackground(new Color(0,0,0,0)); 

С, что родительский контейнер не будет уведомлен, чтобы очистить его фон и перекрашивать. Поэтому, если вы хотите, чтобы панель была полностью прозрачной, используйте вместо этого setOpaque(false). Вам также просто нужно вызвать этот метод на переключателях и ничего больше.

setOpaque уведомит родителя о перекрашивании, но если вы хотите полупрозрачную панель, вам необходимо переопределить paintComponent и вызвать super.paintComponent(Graphics) вручную.

enter image description here


import java.awt.Color; 
import java.awt.EventQueue; 

import javax.swing.ButtonGroup; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JRadioButton; 

public class Example { 

    public void createAndShowGUI() {  
     JRadioButton encryptButton = new JRadioButton("Encrypt"); 
     encryptButton.setOpaque(false); 

     JRadioButton decryptButton = new JRadioButton("Decrypt"); 
     decryptButton.setOpaque(false); 

     ButtonGroup group = new ButtonGroup(); 
     group.add(encryptButton); 
     group.add(decryptButton); 

     JPanel subPanel = new JPanel(); 
     subPanel.setOpaque(false); 
     subPanel.add(encryptButton); 
     subPanel.add(decryptButton); 

     JPanel mainPanel = new JPanel(); 
     mainPanel.setBackground(Color.CYAN); 
     mainPanel.add(subPanel); 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setContentPane(mainPanel); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Example().createAndShowGUI(); 
      } 
     }); 
    } 

} 
+2

(1+) для использования 'setOpaque (...)'. Вы также можете проверить [Фоны с прозрачностью] (https://tips4java.wordpress.com/2009/05/31/backgrounds-with-transparency/) для случаев, когда вы хотите получать полупрозрачные фоны. – camickr

+0

спасибо u so much. Я использовал трюк, чтобы сделать прозрачный JLabel, но это не правильный путь. Еще раз спасибо, что все мое уважение! –

Смежные вопросы